diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..fbf55c5
--- /dev/null
+++ b/CHANGELOG.md
@@ -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.
diff --git a/app.py b/app.py
index 4a9af04..3753d92 100644
--- a/app.py
+++ b/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)
diff --git a/templates/base.html b/templates/base.html
index fd6f9df..504285e 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -36,6 +36,12 @@
{% endif %}
{% block content %}{% endblock %}
+