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:
15
CHANGELOG.md
Normal file
15
CHANGELOG.md
Normal 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
11
app.py
@@ -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)
|
||||
|
||||
@@ -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
19
templates/changelog.html
Normal 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
26
version.py
Normal 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.",
|
||||
],
|
||||
},
|
||||
]
|
||||
Reference in New Issue
Block a user