Skip to content
FreshLabDevPublic

About

🗺️ Daily geo-guessing Telegram bot. One place a day for the whole chat, a pin on the map, the answer at 20:00.

Topics

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

maply

One place a day. Pin it on the map. The answer comes at 20:00.
A daily geo-guessing game for Telegram groups, built as a Go bot with a Mini App.

status go version license telegram bot project board

How A Day Goes · How It Works · Fair Play · Prototype · Docs


The Problem

A group chat wants something small to do together every day that is not another poll or another sticker war. Geo-guessing games are fun, but they are solo, endless, and live outside the chat.

maply is deliberately narrow:

Need maply approach
One shared thing a day The same place for every DM, every group and the site
No spoilers in the chat Everyone answers in the Mini App; pins appear only at 20:00
Not another chatterbot At most three group messages a day: post, intrigue, result
Something to talk about One honest hint between 16:00 and 18:00, then the reveal
A reason to come back Streaks, a chat leaderboard, a share line without spoilers
Familiar stack Go, the family's tg client, shared Asterfield core

Result: a five-minute ritual that the whole chat plays at its own pace and argues about in the evening.


Status

Channel Version Meaning
Stable — Nothing released yet
Next v0.1.0-alpha.1 The Go service, the daily round and the Mini App

The design, the MVP plan and a clickable prototype of the Mini App are here. The service is not written yet. Work is tracked on the project board; what the MVP includes and where it departs from the design is in docs/mvp-plan.md.


How A Day Goes

Time follows the capital of the chat's language: Moscow for ru, Minsk for be, Kyiv for uk.

Time Group DM
07:00 Photo of the day, a "Guess" button, a quiet pin Photo of the day and the button
07:00–20:00 The pin shows who has answered, without distances —
A random minute 16:00–18:00 One intrigue, if not everyone has answered One reminder, if you have not
20:00 The result: the place, a fact, the table, the chat's rank The result, if you are in no group with maply

Score is up to 5 000: up to 3 500 for distance on the same curve GeoGuessr uses for the world map, plus +300 for the right continent, +500 for the country and +700 for the city.


How It Works

maply will be one Go service with PostgreSQL as its only durable store. Domain tables live in a maply schema in the shared core-postgres; identity, presence and language come from core. Telegram goes through FreshLabDev/tg with long polling.

telegram poller -> bot: /start, settings, operator chat
scheduler       -> post 07:00 -> pin edits -> intrigue 16-18 -> result 20:00
http server     -> Mini App, /api/today, /api/guess, /api/result, /img/, /healthz

Places come from Mapillary, with Panoramax as a second source. A script picks candidates from weighted regions, a vision model rates them, and an operator approves each one in a private chat. The queue holds at least 30 days.

The layout of the repository and every package is in docs/architecture.md.


Fair Play

  • One answer per person per day, shared across DMs, groups and the site.
  • Your window closes at the earliest reveal among all your chats, so a Kyiv group cannot learn the answer from a Moscow group an hour earlier.
  • Before the reveal the server answers a guess with "accepted" and nothing else.
  • Pictures are rehosted under random names without EXIF. Source IDs never leave the server: a Mapillary ID resolves to coordinates through its public API.
  • Reverse image search is not defended against. Like Wordle, the rest is on your honour.

Prototype

The Mini App prototype is one HTML file with no build step:

cd web/prototype
python3 -m http.server 4173

Open http://localhost:4173/ at phone width. ?state=reveal jumps to the result screen. To see the Telegram integration in a normal browser, append #tgWebAppData=auth_date%3D1%26hash%3Dx&tgWebAppVersion=8.0&tgWebAppPlatform=ios.

The curation scripts need a Mapillary client token in .env; see .env.example.


Docs

Document Purpose
Design The game: cycle, scoring, anti-cheat, intrigue, places
MVP plan Scope, stages, decisions, risks
Architecture Repository layout, packages, data flow
Versioning Pre-release and stable version line
Release process Changelog, GitHub Release, deploying
Project board Every task and its status

Project board · Changelog · Apache-2.0 · NOTICE

maply is open source software by Asterfield.
Copyright 2026 Asterfield.

About

🗺️ Daily geo-guessing Telegram bot. One place a day for the whole chat, a pin on the map, the answer at 20:00.

Topics

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages