Mirror — primary at git.dannydannydanny.me
Find a file
Danny 9f146d60fa feat: last-session recall when starting an exercise
When you start an exercise, the Mini App now fetches the most
recent time you logged it and shows a hint line in the sets card
("Last time: 8×60, 6×60, 5×60 · 3 days ago"), plus pre-fills the
weight input with the last set's weight.

- db.get_last_exercise(user_id, name): most recent non-deleted
  entry, case-insensitive name match, sets_detail parsed.
- GET /api/exercises/last?name=<name>.
- webapp: loadLastSession() on startExercise + draft restore;
  hint cleared on editExercise (the set rows are the reference
  there). Pre-fill only when the weight field is empty and no
  sets logged yet, so it never clobbers user input.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:52:37 +02:00
tests feat: last-session recall when starting an exercise 2026-05-22 12:52:37 +02:00
webapp feat: last-session recall when starting an exercise 2026-05-22 12:52:37 +02:00
.env.example feat(tg-fitness-bot): initial Telegram workout tracker bot 2026-03-24 15:50:05 +01:00
.gitignore feat(tg-fitness-bot): initial Telegram workout tracker bot 2026-03-24 15:50:05 +01:00
db.py feat: last-session recall when starting an exercise 2026-05-22 12:52:37 +02:00
flake.lock feat(tg-fitness-bot): initial Telegram workout tracker bot 2026-03-24 15:50:05 +01:00
flake.nix refactor: drop the slash-command bot — Mini App is the only interface 2026-05-10 13:40:28 +02:00
LICENSE docs: add LICENSE (MIT) and README 2026-04-17 14:21:12 +02:00
parser.py feat(tg-fitness-bot): multi-set format, delete, export, SQL stats 2026-04-07 22:46:10 +02:00
README.md refactor: drop the slash-command bot — Mini App is the only interface 2026-05-10 13:40:28 +02:00
requirements.txt refactor: drop the slash-command bot — Mini App is the only interface 2026-05-10 13:40:28 +02:00
ROADMAP.md docs: add last-session recall to ROADMAP 2026-05-22 12:49:51 +02:00
server.py feat: last-session recall when starting an exercise 2026-05-22 12:52:37 +02:00
start.py fix(start.py): line-buffer stdout so journals show progress promptly 2026-05-10 13:42:51 +02:00

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

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) 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

nix develop --command pytest tests/ -v

Deployment

Two environments share one host (sunken-ship):

  • Productionfitness-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 stagingfitness-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.