bigbiggerbiggestbot/README.md
Danny 17248e239b refactor: drop the slash-command bot — Mini App is the only interface
bot.py is gone. /start, /history, /stats, /delete, /export,
/feedback, and the text-message workout parser are no longer
exposed. Everything those commands did is already available in
the Mini App (history listing, stats, edit/delete, JSON export
via /api/export/json, etc.).

Why: prod runs behind a Mini App URL, and shipyard staging is a
tenant under the existing shipyard_poc_bot which polls Telegram
itself. A second polling process on the same token would 409. By
removing polling entirely, prod and staging share one
architecture: a pure HTTP server validated against whatever
BOT_TOKEN is provided.

Changes:
- delete bot.py
- start.py: stop spawning the bot subprocess; load token, start
  server, optionally start cloudflared. WEBAPP_URL still skips
  the tunnel.
- flake.nix / requirements.txt: drop python-telegram-bot.
- README: rewrite to reflect Mini-App-only architecture.

The prod systemd unit doesn't need to change — its ExecStart is
`python start.py`, which now boots only the server (+ no tunnel
since WEBAPP_URL is set in the unit env).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 13:40:28 +02:00

91 lines
2.8 KiB
Markdown

# BigBiggerBiggestBot 💪
A Telegram **Mini App** for logging gym workouts. History, stats, notes,
edit & delete, JSON/CSV export — all per-user, all in SQLite.
The slash-command bot was removed: the Mini App is the only interface.
A Telegram bot identity (token) is still required so the Mini App can
validate user sessions via `initData` HMAC.
## Workout text format (still supported via "Paste as text" in the Mini App)
```
Bench press: 4x8x35
Shoulder press (3032): 8x25, 5x35, 6x40
Pull-ups: 3x10
```
- `SETSxREPSxWEIGHT` — uniform sets
- `REPSxWEIGHT, REPSxWEIGHT, ...` — per-set (weight/reps vary)
- Omit weight for bodyweight exercises
- `(machine_id)` is optional (gym equipment ID)
- Blank line separates superset groups; consecutive lines form a superset
- Both `,` and `.` work as decimal separators
## Run locally
```bash
nix run
```
This launches:
- API + Mini App server (port 8080)
- cloudflared Quick Tunnel for a public HTTPS URL (skipped if `WEBAPP_URL`
is already set in the environment, e.g. fronted by a reverse proxy)
Put your bot token (from [@BotFather](https://t.me/BotFather)) in
`~/.secrets/bigbiggerbiggestbot` or a `.env` file:
```
BOT_TOKEN=123456:your-bot-token-here
```
`nix develop` drops you into a dev shell with Python + deps.
## Tests
```bash
nix develop --command pytest tests/ -v
```
## Deployment
Two environments share one host (`sunken-ship`):
- **Production** — `fitness-bot.service`, working dir `/home/danny/tg_fitness_bot`,
watches `origin/main`, served behind a stable URL via the VPS Caddy at
`https://bbbot.dannydannydanny.me`.
- **Shipyard staging** — `fitness-bot-shipyard.service`, working dir
`/home/danny/tg_fitness_bot_shipyard`, watches `origin/staging`, served
by the shared `shipyard_poc_bot` Telegram bot (B3Bot beta is the active
POC tenant).
Each has its own pull timer that fetches every ~15 minutes and restarts
the service when its branch has new commits.
**Workflow:**
```
git push origin <branch>:staging # → shipyard auto-deploys, test there
git push origin <branch>:main # → production auto-deploys
```
Each environment keeps its own `workouts.db` next to its code (gitignored),
so testing on shipyard never touches production data.
## Architecture
- `server.py` — aiohttp REST API + static file server for the Mini App;
validates Telegram `initData` HMACs against the bot token.
- `db.py` — SQLite data layer (workouts, supersets, exercises, feedback,
events, settings; soft delete).
- `parser.py` — workout text → structured data (used by the Mini App's
"Paste as text" path).
- `webapp/` — Mini App (HTML/CSS/vanilla JS, Telegram WebApp SDK).
- `start.py` — orchestrator: loads token, starts server, optionally starts
cloudflared.
- `tests/` — pytest suite for parser + db.
## License
MIT — see [LICENSE](LICENSE).