From 62589f3cc6ae75789a1826cbf0c3ca9d7be0b038 Mon Sep 17 00:00:00 2001 From: jessikitty Date: Thu, 24 Sep 2026 00:11:58 +1000 Subject: [PATCH] docs: add .claude-context project overview --- .claude-context/00-overview.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .claude-context/00-overview.md diff --git a/.claude-context/00-overview.md b/.claude-context/00-overview.md new file mode 100644 index 0000000..ccaecd3 --- /dev/null +++ b/.claude-context/00-overview.md @@ -0,0 +1,26 @@ +# Raccoon Timekeeper + +Self-hosted, multi-user weekly time tracking app with a raccoon-themed grayscale UI. Originally a Google Apps Script / Sheets tool, rewritten in Flask. + +**Repository:** https://gitea.hideawaygaming.com.au/jessikitty/Raccoon-TimeKeeper + +## Architecture +- **App:** `app.py` — Flask + Flask-SQLAlchemy + Flask-Login; models, routes, JSON API and CLI commands in one module +- **Storage:** SQLite by default (`DATABASE_URL`), initialised at import time so it works under gunicorn +- **UI:** Jinja templates in `templates/`, JS/CSS in `static/` +- **Deploy:** Docker + docker-compose, gunicorn + +## Security Model +- First-run setup page creates the admin; no default credentials +- Every API query scoped to `current_user.id` +- Admins manage users but cannot deactivate/demote/delete themselves +- Recovery via `flask reset-admin` (shell access required) + +## Conventions +- Dates in front-end JS are always formatted in local time — never `toISOString()` + +## Session Log +- 2025-12-10 — Flask Multi-User Rewrite of Raccoon Timekeeper — Ported from Apps Script to Flask with auth/user isolation; fixed gunicorn DB init and UTC week-shift bugs + +--- +*Created by: Jess Rogerson (yelling commands at Claude.AI)*