Table of Contents
- Roadmap
- Shipped
- Outstanding
- Deferred
- Constrain posting dates to the month
- Bank-statement reconciliation
- Recurring posting schedules
- Closed-month "archived" visual treatment
- Copy-forward month
- Cross-month summary and charts
- CSV import / export
- App-level auth (future)
- localStorage persistence of collapsed groups
- Browser-rendered-page smoke test
- Rollback automation
- Observability follow-ups
- Out of scope (probably forever)
Roadmap
Shipped
| # | Title | Merged |
|---|---|---|
| 1 | Initial scaffolding and single-month budget MVP | 2026-04-17 |
| 3 | Monthly budget view with snapshot-from-config and applied tracking | 2026-04-17 |
| 5 | DB backup script invoked before every schema or destructive DB operation | 2026-04-17 |
| 7 | Zero Amount header at the top of budget and month pages | 2026-04-17 |
| 9 | Gitignore the local wiki checkout at docs/wiki/ | 2026-04-17 |
| 11 | Section groups with collapsible headers + Sinking Funds section | 2026-04-17 |
| 13 | Notes field per entry | 2026-04-17 |
| 15 | Month lifecycle: Planning, Active, Closed with reconciliation gate | 2026-04-17 |
| 17 | UI redesign: condensed-sans ledger style with logo in the zero hero | 2026-04-17 |
| 19 | Backing transaction ledger: replace applied field with Postings | 2026-04-17 |
| 21 | Budget-side inline edit of entry name and amount | 2026-04-17 |
| 26 | /healthz endpoint for container healthcheck |
2026-04-19 |
| 27 | Emit structured JSON logs to stdout (Loki-ready) | 2026-04-19 |
| 28 | Dockerfile for quartermaster-web container | 2026-04-19 |
| 29 | compose.yml for home-ctr-onyx deploy | 2026-04-19 |
| 30 | Forgejo Actions workflow for deploy to home-ctr-onyx | 2026-04-19 |
| 35 | uvicorn --proxy-headers so url_for works behind Traefik |
2026-04-19 |
Outstanding
#31 small cleanups from platform-prep code review is non-blocking
polish (logger placement in service.py, middleware-vs-router comment
in routes_health.py, richer template_entry_updated extras). Fold
into whichever follow-up PR naturally touches those files.
#23 MCP proposal for exposing Quartermaster to AI agents is a design discussion, not committed work.
Deferred
Things we have explicitly called out as future work. File an issue when the time comes.
Constrain posting dates to the month
Postings are free-dated today (a May 3 transaction can live on an April entry). Most users would expect the date to fall within the month of the entry. A small validator + UI hint would tighten this without closing the escape hatch for one-off overrides.
Bank-statement reconciliation
A view that ingests a CSV or OFX export and matches rows against existing postings. Would need a "cleared" flag on postings and a match-by-amount + date workflow.
Recurring posting schedules
For regular bills (mortgage on the 1st, subscription on the 15th), let the user register a recurrence rule on a month_entry so the posting appears automatically when activating a new month.
Closed-month "archived" visual treatment
Closed months currently carry a muted state badge and disabled inputs. A deeper treatment would desaturate the page palette, add a subtle "Closed" watermark, and visually retire the closed month from the editing canvas.
Copy-forward month
A "new month" that snapshots a previous month rather than the budget
config. Useful when reality has drifted far enough from the plan that
last month is a better starting point. Would augment create_month to
accept a from_month_id parameter.
Cross-month summary and charts
A view that shows how zero-amount, applied, and category totals have
moved over time. Would use the existing month_entry data, no new
schema. First pass: a sparkline per category across the last N months.
CSV import / export
Bulk in for seeding a fresh install, bulk out for taxes or external analysis. Month-scoped and budget-scoped variants.
App-level auth (future)
Today auth is Traefik-side (basic auth at the edge). If the app ever needs per-user views or a richer session model, an app-level login would slot in. Until then, there is no login page inside Quartermaster.
localStorage persistence of collapsed groups
Today the open/closed state of section groups resets on every page
load. A tiny localStorage hook would remember which groups a given
browser last had open.
Browser-rendered-page smoke test
The /healthz smoke in the deploy workflow doesn't exercise template
URL generation, which is how #35 slipped past CI and into production.
A CI step that loads / through Traefik and asserts every <link>
and <img> href is https-scheme would have caught it before the user
did.
Rollback automation
Rollback today is manual: set QUARTERMASTER_TAG in the host's
.env to a prior SHA, docker compose up -d. A one-line re-deploy
job that accepts a tag would be worth ~30 minutes of work once we
have a reason to roll back under pressure.
Observability follow-ups
The launch alert set is container-down + TLS expiry + elevated 5xx
rate, all wired platform-side. Richer signal (histograms for
http_request latency, a Grafana dashboard for Quartermaster events,
Prometheus /metrics endpoint) is out of scope for launch. File if
the single-user Loki view ever proves insufficient.
Out of scope (probably forever)
- Multi-currency
- Multi-user / shared budgets
- Mobile app
- Cloud sync