Project Plateau
Project Plateau는 네 개의 유리판과 하나의 살아있는 계곡, 캠프로 돌아가는 길을 의미
🗺️ Daily geo-guessing Telegram bot. One place a day for the whole chat, a pin on the map, the answer at 20:00.
README 전체를 불러오는 중입니다.
README 전문 보기 ↗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; names and the table come 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, free play between days, 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.
| Channel | Version | Meaning |
|---|---|---|
| Stable | — | Nothing stable yet |
| Alpha | v0.0.1-alpha.16 | Live as @maplyin_bot and on maply.ws04.cc: the daily round, free play with leaderboards, profiles and sign-in on the site |
The game is playable end to end: the morning post, the answer and its score,
the evening result with a map card, the world ranking and a website where
anyone can play without Telegram. Between days there is free play: alone,
against the clock, from the archive of past days, as a challenge or with
friends, with leaderboards for the timed modes. The site signs in with
Telegram or Google and keeps a profile. Work is tracked on the
project board; what the MVP
includes and where it departs from the design is in
docs/mvp-plan.md.
The result opens at 20:00 in the chat's time zone. A group admin picks it in the settings; until then it follows the capital of the group's language, with Russian on Kyiv time.
| Time | Group | DM |
|---|---|---|
| 07:00 | Photo of the day, a "Guess" button, a quiet pin | Photo of the day and the button |
| After your answer | The place, your score and everyone's answers without names | The same |
| 07:00–20:00 | The pin lists who has answered and the best distances so far, without saying whose | — |
| 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. Answering early in Telegram adds up to +250 on top.
maply is 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 and site pages, /api/*, /auth/*, /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.
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.
The Mini App the service ships is the same code split into files in
web/app/, with MapLibre, its RTL text plugin, Pannellum and the fonts
vendored next to it. The
binary serves it at /, and it plays against the API with the initData
Telegram gives it; opened in a normal browser it is the website, where a guest
plays under a name they type. 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.
| 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 |
| Sign-in | Telegram and Google keys for the site |
| Project board | Every task and its status |