Roteiro de cafés para dois explorarem, com visitas, notas, favoritos e fotos persistidos no servidor (Val Town) — disponível de qualquer aparelho.
Nada de um único bloco que possa ser sobrescrito: cada café visitado e cada café custom é uma linha própria no SQLite do projeto, e o servidor sempre faz merge ao salvar — um POST vindo de um aparelho/aba com memória vazia nunca apaga visitas existentes.
Chave no SQLite (kv) | Guarda |
|---|---|
visit:<id> | dados da visita de um café (nota, data, favorito, photo_key) |
custom:<n> | um café custom por linha |
meta | contadores (ex.: lastBackupCount) |
blob cafe:<id> | foto de cada visita |
Endpoints:
GET /api/state → estado completo (montado das linhas)POST /api/visit → upsert de uma visita (aceita photo_base64 → blob)POST /api/state → merge (nunca apaga visitas)GET /api/photo/<key> → serve a fotoUm cron diário (backup-cron.ts) tira um instantâneo completo do estado e grava no blob do projeto como backup/snapshot-<ISO>.json, mantendo os 30 mais recentes (retenção automática).
backup.ts → runBackup() (já testado e funcionando)restore.ts → listSnapshots()restore.ts → restoreFromBackup(<key>) — repõe visitas, custom e meta no SQLite. ⚠️ Sobrescreve; só usar em emergência.Agendamento: 37 4 * * * UTC (≈ 01:37 Brasília), próximo em 2026-08-28 04:37 UTC.
main.ts — API + serve o app (endpoint HTTP)frontend.html — a interface (HTML/JS/CSS)backup.ts — lógica de snapshotbackup-cron.ts — cron diário que chama runBackup()restore.ts — recuperação a partir de um snapshotcafes, sqlite