- api.js: add exponential backoff retry (3 attempts, 500/1000/2000ms) for
GET requests on network errors and 5xx responses; mutating methods are
not retried since they are not idempotent
- api.js: add offline indicator — fixed pill banner appears at bottom of
page when navigator goes offline, disappears when back online
- style.css: add styles for offline banner and session expiry warning
- auth.js: show amber warning banner below nav when session expires within
24 hours (with exact hours remaining); dismissible with X button
- auth.js: fix password min-length client-side check from 6 to 10 to
match the backend
- log.js, flock.js, budget.js: disable submit button during async request
and re-enable in finally block to prevent double-submits and make loading
state visible
- dashboard.js: fix chart date labels to use user's configured timezone
instead of the browser's local timezone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- nginx: add X-Content-Type-Options, X-Frame-Options, X-XSS-Protection,
and Referrer-Policy headers on all responses; rate limit /api/auth/login
to 5 req/min per IP (burst 3) to prevent brute force
- frontend: add escHtml() utility to api.js; use it on all notes fields
across dashboard, log, history, flock, and budget pages to prevent XSS
- log.js: fix broken loadRecent() call referencing removed #recent-body
element; replaced with loadHistory() from history.js
- schemas.py: raise minimum password length from 6 to 10 characters
- admin.py: add audit logging for password reset, disable, delete, and
impersonate actions; fix impersonate to use named admin param for logging
- main.py: add startup env validation — exits with clear error if any
required env var is missing; configure structured logging to stdout
- docker-compose.yml: add log rotation (10 MB / 3 files) to all services
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New other_purchases table (date, total, notes)
- /api/other CRUD endpoints
- Budget stats now include other costs in cost/egg and cost/dozen math
- Budget page: new Log Other Purchases form, stat cards for other costs,
combined Purchase History table showing feed and other entries together
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>