Invoking via ./backup.sh symlink made dirname escape the repo and sqlite
created an empty DB in the parent dir. Now uses readlink -f with a
location check plus a guard that refuses to run without ./whaleprep.db.
Live user data had only a stale pre-migration backup. First snapshot
verified: 9,837 questions, 6 users. Termux has no cron; script is manual
or Tasker-driven.
rust:1.99-slim build, debian-slim runtime as uid 10001. Only static/
and content/ shipped alongside the binary; DB lives on /data volume.
Could not build-verify locally (no Docker daemon); paths checked
against ServeDir/include_str usage instead.
Sign-in page rewritten for non-technical students: Google-first when
configured, plain-language email path with honest 30-day scope, recovery
note, placeholders, full-width CTA. deploy/termux-start.sh sources .env
for GOOGLE_* credentials; deploy/env.example documents the 5-minute
Cloud Console setup; .gitignore covers secrets, DBs, pid/log files.
bench scripts send a browser UA so Cloudflare bot checks stop 403ing
local load tests. Landing bank counts cached 60s (five aggregate
subselects no longer run per hit). gzip compression on all responses.
deploy/termux-{start,stop,status}.sh manage the release binary on the
tablet; deploy/cloudflared-whaleprep.yml is the dedicated tunnel config
for whaleprep.oiupoyt.space. README gains a deploy section.