Skip to content

v0.8.0

Choose a tag to compare

@dholbach dholbach released this 14 Oct 20:29
· 116 commits to main since this release
e47bdce

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_KEY now also decrypts uploaded documents. Losing it loses those files too. Keep a copy of .env somewhere safe.
  • Download the new prod.py and docker-compose.prod.yml (./prod.py update prints the curl lines). New settings only reach the container through the new compose file.
  • Port 8000 is now published on 127.0.0.1 by default. Run the new ./prod.py update (or start) once: it adds MY_PRACTICE_BIND_ADDRESS=0.0.0.0 to an existing .env, so a LAN installation stays reachable. Starting with plain docker compose up skips 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-inline or unsafe-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 / restore with 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 setup asks how the app will be reached and writes .env to 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_DISABLED now 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