* feat(property): Layer 3 — Dream House Simulator Add /dream page with a four-phase simulation engine: Phase 1 — Save the down payment (uses current property equity) Phase 2 — Construction period (both loans running simultaneously) Phase 3 — Sell current house, apply proceeds to construction loan Phase 4 — Final state: just the construction loan remaining Inputs: dream cost, down payment %, construction loan rate/term, build duration, monthly savings, expected sale price. All pre-filled from existing property/loan data when available. Output: per-phase timeline cards, monthly cost bar chart, total interest, final payoff date, and a key levers section. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(plan): rename Dream House to Goal Planner at /plan - Route /dream → /plan - Nav label "Dream House" → "Goal Planner" - Template dream.html → plan.html - All user-facing labels generalised (construction loan → new loan, build duration → acquisition/build period, current property → current asset, dream house cost → new goal cost, etc.) - Empty state updated with generic copy and 🎯 icon Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(goals): merge Goal Planner into /goals as a second tab - /goals now has two tabs: "Committed goals" and "Goal Planner" - Goal creation only happens from the Planner tab (simulate first, then "Save as goal" → creates an uncommitted goal) - Commitment, deadline adjustment, and deletion stay on the Goals tab - Off-track goals show an "Adjust deadline →" button that pushes the deadline to the realistic date based on current savings rate - /plan and /dream both redirect to /goals?tab=planner (301) - "Goal Planner" nav link removed; plan.html kept for redirect compat - GoalsData gains Tab, PlanProperties, PlanLoans, HasPlanResult, PlanResult, PlanForm fields Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(goals): type-driven planner — Save for a purchase vs Sell & upgrade Goal Planner tab now opens with two goal type cards: 🛒 Save for a purchase — name, target, monthly savings, optional deadline. Shows time-to-reach at current rate, monthly needed to hit the deadline, and a feasibility banner. 🔄 Sell & upgrade — the full four-phase transition simulator (existing asset + loan → acquire new → sell old → payoff). Each type has its own focused form and result section. Selecting a type highlights the card and loads the matching form. Results include a "Save as goal" action that drops an uncommitted goal into the Goals tab. Also adds runPurchaseSim() and PurchaseSimResult model. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Gonçalo Rodrigues <guga@Goncalos-MacBook-Pro.local> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
k3s Home Lab
- author: @GoncaloRodri
Finance App
A self-hosted personal finance dashboard running on k3s. Tracks transactions, budgets, and investments — with the goal of becoming a full financial co-pilot.
Current features
- Import bank transactions via CSV (CGD, Trade Republic, generic)
- Categorise transactions with auto-categorisation and colour-coded badges
- Monthly budget tracking with progress bars (over-budget alerts)
- Dashboard with income vs expense split and 90-day balance trend
- Monthly reports (stacked bar chart, 12-month breakdown)
- Spending projections based on 6-month average
- Investment portfolio with live prices via Yahoo Finance and a 3-D allocation chart
- Dark / light mode with system preference detection
- Read-only sharing between users
Architecture
Deployment
GitHub Actions CI/CD. Each app has its own workflow triggered by path filters (apps/<name>/**) so a change to the finance service does not rebuild or redeploy unrelated apps.
Apps and services
Each app lives under apps/<name>/ and follows a shared layout:
apps/<name>/
services/
api/ # Go service
k8s/ # Kubernetes manifests (deployment, service, ingress)
.github/ # App-specific CI workflow (if separate from root)
Database
All apps share a single MongoDB instance but each app owns a dedicated database: homelab_finance, homelab_smarthome, etc. The users service writes to homelab and is the canonical auth source — other apps query the users collection directly rather than making HTTP calls between services.
Auth
A shared users service handles registration and login. Apps that need to identify the current user resolve the session against the shared MongoDB users collection.
Secrets
Kubernetes Secrets managed manually with kubectl. Secrets are never committed to git — .gitignore covers *.env and any manifest containing literal credentials.
Adding a new app
Copy an existing app directory as a starting point. Conventions to follow:
- Use the app's own MongoDB database (not the shared
homelabdatabase) - Add a path-filtered GitHub Actions workflow under
.github/workflows/<name>.yml - Place k8s manifests under
apps/<name>/k8s/with at minimum:deployment.yaml,service.yaml,ingress.yaml - Read the MongoDB URI and any credentials from environment variables injected by Kubernetes Secrets
Roadmap
The main goal is to evolve from a ledger (records what happened) into a financial co-pilot (tells you what to do next, based on where you want to end up).
Phase 1 — Dashboard redesign + disposable income number (next)
Replace the current information-dense dashboard with a focused layout that immediately answers the questions that matter:
Hero block — "Available to spend until payday"
- A single, always-visible number calculated as:
Income − fixed expenses − goal contributions − category budgets - Month-progress bar showing how much of the disposable budget has been used
3 diagnostic cards
- Bank balance should be — exact breakdown: rent + bills + subscriptions + investments + safety buffer = minimum recommended balance right now
- Savings rate — % of income saved, with month-over-month delta
- Portfolio today — total market value and today's change
Supporting panels (below the fold)
- Stocks at a glance — per-ETF value and P&L, without navigating to the full portfolio page
- Budget health — thin progress bars per category, highlighted when near or over limit
- Recent activity — last 4–5 transactions with colored category dots
Underlying data work
- Auto-detect fixed/recurring expenses from transaction history (rent, subscriptions, utilities)
- Separate fixed costs from variable spend so budgets only cover what you can actually control
- Savings rate trend (% of income saved each month)
Phase 2 — Goals: explore mode
Before committing to a financial goal, plan it first.
- Goal types: one-off purchase (Nintendo Switch, laptop, holiday), deposit / down-payment (house, apartment), emergency fund (auto-sized to N months of your average spend), recurring investment (links to the portfolio)
- Input: target amount + deadline
- Output: monthly contribution needed, impact on disposable income, months to target at current savings rate
- No commitment required — explore as many scenarios as you want
Phase 3 — Goals: commit + plan
- Committed goals generate a monthly "reservation" deducted from your disposable income
- Conflict detection: "you can't fund both the Switch by June and the house deposit by 2028 at this savings rate"
- Goal progress tracking over time
Phase 4 — Net worth
- Cash accounts + portfolio market value − credit card balances = net worth
- Historical net worth chart (all data already exists, just needs aggregation)
Phase 5 — "What if" simulator + savings rate
- Drag a slider for income change, a one-off expense, or a new goal — see how it ripples through disposable income and goal timelines
- Savings rate history and trend once several months of goal data exist
Phase 6 — Alerts and nudges
- "You've spent 80% of your Food budget and it's only the 15th"
- "You're on track to miss your Switch goal by 2 months"
- Delivered as dashboard banners initially, push notifications or email later
Future / backlog
- Household mode — merge incomes and goals for couples planning together (extends the existing sharing feature)
- Automatic transaction import — scheduled CSV fetch or open banking integration
- Tax summary — annual income, investment gains, and deductible expenses export