Last Updated: April 2026 — Phase 14 Complete | 94 tests passing
A privacy-first financial simulation and planning tool built with .NET 8, Blazor Server, and PostgreSQL. No bank integrations. No credential storage. Manual data entry with deterministic modeling.
| Layer | Technology |
|---|---|
| Backend | .NET 8, ASP.NET Core, EF Core 8 |
| Database | PostgreSQL (Npgsql 8) |
| Frontend | Blazor Server, Radzen.Blazor v9 |
| Auth | ASP.NET Core Identity + JWT + TOTP 2FA + Google OAuth |
| SendGrid | |
| Logging | Serilog (console + rolling file) |
| Tests | xUnit — 94 tests (unit + user-isolation + auth flow integration) |
Clean architecture with strict layer boundaries:
src/
Ledgerly.Domain # Entities, enums, core rules. No EF or infra references.
Ledgerly.Contracts # Sealed record DTOs and request types. References Domain only.
Ledgerly.Application # Use case services, repository interfaces, validation.
Ledgerly.Infrastructure # EF Core DbContext, repository impls, SendGrid, Serilog.
Ledgerly.Api # Controllers, JWT auth, DI wiring. Depends on Application only.
Ledgerly.Web # Blazor Server UI, API clients, view models.
tests/
Ledgerly.Tests # xUnit test project
Domain → Application → Infrastructure. Controllers never reference DbContext directly.
- Snowball and Avalanche strategies
- Month-by-month amortization with per-debt snapshots
- Total interest and payoff timeline
- Scenario duplication for "what-if" branching
- Side-by-side comparison: months saved, interest saved, winner label
- Log actual payments per debt per scenario
DriftServicecomputes ahead/behind per debt and overall- Updated payoff timeline recalculated from actual payment history
- Monthly budget plans with category-based lines
- Transaction CRUD linked by date range
- Planned vs actual summary with variance
- 30 / 60 / 90-day daily balance simulation
- Income and bill event markers
- Negative balance warnings, low-cash alerts, burn rate overlay
- Multiple income sources with frequency normalization to monthly values
- Recurring and one-off planned expenses with due dates and priority levels
- Paid / Overdue / Upcoming status tracking
- Recurring expense auto-creates next month's copy on mark-as-paid
- Range-based estimation (not FICO)
- 3-factor model: utilization, account age, payment history
- Month-by-month projections tied to debt payoff scenarios
- Assets vs liabilities calculation
- Monthly snapshot system
- 12-month trend chart (area + line)
- Named goals with target amount, current amount, and target date
- Progress bars with color-coded status (On Track / At Risk / Complete)
- Rule-based financial insights (no AI)
- Budget overrun warnings, debt prioritization signals, cash shortfall alerts
- Severity levels: Info / Warning / Danger
- Debt-free-by-date and savings target constraints
- Outputs: required monthly effort, feasibility status, shortfall, confidence level
GET /export/json— full data snapshotGET /export/csv— ZIP archive (accounts, debts, income, expenses, transactions, scenarios)- CSV transaction import with preview and category mapping
- TOTP via authenticator apps (Google Authenticator, Authy)
- QR code + manual key setup in Settings
- Login challenge step when 2FA is enabled
- Global EF query filters — all queries scoped to the authenticated user's ID
- JWT (15-min expiry) + rotating refresh tokens (30-day)
- Rate limiting on auth endpoints: sliding window, 5 req / 60s per IP
- TOTP 2FA support
- Google OAuth sign-in
- No bank credentials stored
Prerequisites: .NET 8 SDK, Docker
# Start PostgreSQL
docker run -d --name ledgerly-postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres
# Apply migrations
dotnet ef database update --project src/Ledgerly.Infrastructure --startup-project src/Ledgerly.Api
# Run API
dotnet run --project src/Ledgerly.Api
# Run Web
dotnet run --project src/Ledgerly.Web
# Run tests
dotnet testConfigure appsettings.Development.json in Ledgerly.Api with connection string, JWT secret, and SendGrid key.
dotnet ef migrations add <Name> \
--project src/Ledgerly.Infrastructure \
--startup-project src/Ledgerly.Api
dotnet ef database update \
--project src/Ledgerly.Infrastructure \
--startup-project src/Ledgerly.Api| Phase | Description |
|---|---|
| 0 | Foundation — EF Core, PostgreSQL, migrations |
| 0.5 | Clean architecture hardening |
| 1 | Debt projection engine (Snowball/Avalanche, unit tests) |
| 2 | Budget system (BudgetCategory, BudgetPlan, Transactions) |
| 3 | Scenario comparison and duplication |
| 4 | Reality tracking (ActualPayment, DriftService) |
| 5 | Credit score estimation (3-factor model) |
| 6 | UI/UX — Radzen.Blazor v9, dialogs, notifications |
| 7 | Auth — Identity + JWT + SendGrid + user isolation |
| 8 | Dashboard, income sources, planned expenses, dark/light theme |
| 9 | TOTP 2FA |
| 10 | Export (JSON + CSV), net worth chart, overdue email notifications |
| 11 | Rate limiting, refresh tokens, Google OAuth, Serilog, savings goals |
| 12 | Cash flow forecast, account model, net worth tracking |
| 13 | Insight engine, goal planner |
| 14 | Onboarding wizard, empty states, what-if slider, inline recommendations |