Add version chip (v0.1.0) + changelog

- version.py: __version__ = 0.1.0 + structured CHANGELOG (newest first).
- footer version chip on every page (base.html) links to /changelog.
- /changelog page renders release notes; CHANGELOG.md mirrors it.
- 0.1.0 captures the storage/SQLite/settings/suggestions/backup work.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-06 16:55:25 -05:00
parent dc9717a59b
commit e381b615d6
5 changed files with 77 additions and 0 deletions

15
CHANGELOG.md Normal file
View File

@@ -0,0 +1,15 @@
# Changelog
All notable changes to Moon Household Budget. Newest first.
This file mirrors the structured changelog in `version.py` (shown at `/changelog`).
## 0.1.0 — 2026-06-06 — First tracked release
- Crash-safe data storage — saves are now atomic and a corrupted file can no longer take the app down.
- Transactions moved to a SQLite database: faster, and safe when edited from two tabs at once. Existing transactions were migrated automatically.
- New Settings page (⚙️) to store your Gmail login and reminder preferences securely — no passwords in the code anymore.
- Suggestions & feedback (💡) is now reachable from every page; what you send becomes a tracked issue.
- Bill email reminders now use the Gmail login from Settings.
- Automatic daily backups of all your data (local for now; Backblaze cloud once a bucket is set up).
- Fixed the Monthly view crashing on the budget total.
- Added this version number and changelog.

11
app.py
View File

@@ -8,6 +8,7 @@ import calendar as cal_module
from storage import load_json, save_json
from settings import load_settings, save_settings, SECRET_KEYS
import txns_db
from version import __version__ as APP_VERSION, CHANGELOG
from categories import CATEGORIES, CATEGORY_COLORS
from bills import load_bills, save_bills, bills_for_month, calendar_grid, get_week_num
from sinking import (load_funds, save_funds, FUND_COLORS, monthly_needed,
@@ -167,6 +168,11 @@ def inject_unreviewed_count():
# Fast COUNT query instead of parsing the whole transaction store per request.
return dict(unreviewed_count=txns_db.count_unreviewed())
@app.context_processor
def inject_version():
return dict(app_version=APP_VERSION)
DATA_DIR = os.environ.get("DATA_DIR", os.path.join(os.path.dirname(__file__), "data"))
TRANSACTIONS_FILE = os.path.join(DATA_DIR, "transactions.json")
RULES_FILE = os.path.join(DATA_DIR, "rules.json")
@@ -2878,5 +2884,10 @@ def settings_view():
saved=request.args.get("saved"))
@app.route("/changelog")
def changelog_view():
return render_template("changelog.html", changelog=CHANGELOG, app_version=APP_VERSION)
if __name__ == "__main__":
app.run(debug=os.environ.get("FLASK_DEBUG") == "1", port=5000)

View File

@@ -36,6 +36,12 @@
{% endif %}
{% block content %}{% endblock %}
</main>
<footer style="text-align:center;padding:1.5rem 0 2.25rem;">
<a href="{{ url_for('changelog_view') }}" title="What's new"
style="display:inline-block;font-size:.75rem;color:#B0A89E;text-decoration:none;border:1px solid #EDE8E2;border-radius:999px;padding:.2rem .65rem;">
🌙 Moon Household Budget · v{{ app_version }}
</a>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function () {
// Wrap all number budget-inputs with a $ prefix and format on blur

19
templates/changelog.html Normal file
View File

@@ -0,0 +1,19 @@
{% extends "base.html" %}
{% block content %}
<div style="max-width:720px;">
<h1>📒 What's New</h1>
<p style="color:#7A6E68;margin-bottom:1.25rem;">Current version: <strong>v{{ app_version }}</strong></p>
{% for rel in changelog %}
<div style="border:1px solid #EDE8E2;border-radius:10px;padding:1rem 1.25rem;margin-bottom:1rem;">
<div style="display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap;">
<h2 style="margin:0;font-size:1.1rem;">v{{ rel.version }}</h2>
<span style="color:#B0A89E;font-size:.85rem;">{{ rel.date }}{% if rel.title %} · {{ rel.title }}{% endif %}</span>
</div>
<ul style="margin:.6rem 0 0;padding-left:1.2rem;">
{% for c in rel.changes %}<li style="margin:.3rem 0;">{{ c }}</li>{% endfor %}
</ul>
</div>
{% endfor %}
</div>
{% endblock %}

26
version.py Normal file
View File

@@ -0,0 +1,26 @@
"""App version + changelog.
To cut a release: bump __version__ and prepend a new entry to CHANGELOG
(newest first), then keep CHANGELOG.md in sync. The version chip in the footer
links to /changelog, which renders these entries.
"""
__version__ = "0.1.0"
# Newest first. Each release lists what's new in plain language.
CHANGELOG = [
{
"version": "0.1.0",
"date": "2026-06-06",
"title": "First tracked release",
"changes": [
"Crash-safe data storage — saves are now atomic and a corrupted file can no longer take the app down.",
"Transactions moved to a SQLite database: faster, and safe when edited from two tabs at once. Existing transactions were migrated automatically.",
"New Settings page (⚙️) to store your Gmail login and reminder preferences securely — no passwords in the code anymore.",
"Suggestions & feedback (💡) is now reachable from every page; what you send becomes a tracked issue.",
"Bill email reminders now use the Gmail login from Settings.",
"Automatic daily backups of all your data (local for now; Backblaze cloud once a bucket is set up).",
"Fixed the Monthly view crashing on the budget total.",
"Added this version number and changelog.",
],
},
]