Repository navigation
v0.8.0
A security and data-safety pass from an outside takeover review.
⚠️ Upgrading — read before ./prod.py update
- Back up first (
./prod.py backup). Three migrations encrypt existing client/inquiry notes, calendar credentials and every uploaded client document in place. FERNET_KEYnow also decrypts uploaded documents. Losing it loses those files too. Keep a copy of.envsomewhere safe.- Download the new
prod.pyanddocker-compose.prod.yml(./prod.py updateprints thecurllines). New settings only reach the container through the new compose file. - Port 8000 is now published on
127.0.0.1by default. Run the new./prod.py update(orstart) once: it addsMY_PRACTICE_BIND_ADDRESS=0.0.0.0to an existing.env, so a LAN installation stays reachable. Starting with plaindocker compose upskips that.
Security
- Uploaded files are served only to signed-in members of the owning practice, never straight from disk (#490)
- Client/inquiry notes, calendar credentials and uploaded client documents are encrypted at rest, with key rotation (
manage.py encryption rotate) (#500, #501) - Two-factor sign-in (TOTP, recovery codes, optional
REQUIRE_TWO_FACTOR), and the/admin/login/bypass is closed (#504) - Sign-in attempt limit and an 8-hour idle timeout (#496)
- Flash messages are escaped, and the CSP no longer allows
unsafe-inlineorunsafe-eval(#492, #505) - Practice scoping fails closed: a user without a practice sees nothing (#495)
- The production port and the dev database no longer listen on every interface (#521, #499)
Features
- Issued invoices are locked; mistakes are fixed with "Cancel & correct" (#491)
./prod.py backup/restorewith verified archives, optional gpg encryption, and a dashboard warning when backups stop (#489, #503)- Sign-out and two-factor sign-in in the account menu (#504, #507)
./prod.py setupasks how the app will be reached and writes.envto match (#521)- Charts rebuilt on Chart.js: they follow dark mode and fix several axis bugs (#519)
- New logo and favicon (#514)
Fixes
- Your own time off no longer counts as client cancellations (#502)
- Payment reminder amounts are formatted correctly, and money rounds half up as
Decimal(#493, #515) - WCAG AA contrast fixes; theme and privacy mode apply before the first paint (#497)
- The admin "add bank transaction" page no longer returns a 500 (#494)
- Bank-import notes appear in the user's language (#514)
- Pages no longer wait on the GitHub update check, and
UPDATE_CHECK_DISABLEDnow works in production (#517, #520)
Under the hood
- htmx replaced by a 60-line
partial_post.js(#516) - ADR-0007 records why invoices are kept ten years (#510)
- Dependency updates, including Django 6.1.2 and an npm fix for GHSA-vfj7-8cjw-p6xm (#487, #498)
Full changelog: docs/CHANGELOG.md