2026-03-01 21:19:34 +00:00
2026-03-02 19:44:52 +00:00
WIP
2026-03-02 17:05:47 +00:00
2026-03-01 18:17:42 +00:00
2026-03-01 18:17:40 +00:00
2026-03-01 19:00:23 +00:00
WIP
2026-03-02 19:35:38 +00:00
2026-03-02 19:44:52 +00:00

💰 Budgeteer

Build and Test Docker Publish

A personal finance dashboard built with Blazor Server (.NET 10).

Status: beta — see the in-app badge.

Features

  • Multi-account support — current accounts, savings, credit cards, each with its own currency and colour
  • Transaction tracking — income & expenses with date, category, and account assignment
  • Recurring transactions — daily, weekly, monthly, or yearly recurrence with automatic materialisation up to one year ahead
  • Dashboard — balance trend chart (Chart.js), recent & upcoming transaction lists, account filter toggles, inline balance editing, and configurable time window
  • Reports — doughnut charts for expenses and income by category, monthly income vs expenses bar chart, and a category summary table with filterable date range and account selection
  • Categories — emoji-icon categories with sensible defaults and full CRUD
  • Transactions table — sortable columns, search, pagination, per-account filtering, time-window presets, bulk selection & delete, and responsive column hiding on mobile
  • Authentication — ASP.NET Identity with registration, login, password change, account deletion, and 5-attempt lockout
  • SSO providers — optional Google, Microsoft, and GitHub sign-in (configured via appsettings.json)
  • Settings — change password, reset all data (with confirmation), delete account
  • Toast notifications — inline validation feedback via a toast system
  • Help & About pages — in-app guides, tips, and project info
  • Responsive UI — Bootstrap 5, mobile-friendly layout with collapsible sidebar, responsive table columns, and scoped CSS
  • CI/CD — GitHub Actions for build/test and Docker Hub publishing
  • Docker — multi-stage Dockerfile with volume-mounted SQLite, OCI image labels, and automatic security patching

Tech Stack

Layer Technology
Framework .NET 10 / Blazor Server (InteractiveServer)
Database SQLite via EF Core
Auth ASP.NET Core Identity + optional Google / Microsoft / GitHub SSO
Charts Chart.js (CDN) with JS interop
CSS Bootstrap 5, scoped CSS
Tests xUnit
CI/CD GitHub Actions
Container Docker (multi-stage build)

Getting Started

Prerequisites

Run Locally

cd BudgetApp
dotnet run

The app will be available at https://localhost:5001 (or the port shown in the console). A budgetapp.db SQLite file is created automatically on first run.

Run Tests

dotnet test

Run with Docker

# Build
docker build -t budgeteer .

# Run (persists database in a named volume)
docker run -d -p 8080:8080 -v budgeteer-data:/app/data --name budgeteer budgeteer

Note: The SQLite database is stored at /app/data/budgetapp.db inside the container. Always mount a volume to /app/data so your data survives image updates and container replacements.

The app will be available at http://localhost:8080.

Project Structure

BudgetApp/
├── Components/
│   ├── Layout/          # MainLayout, AuthLayout, NavMenu
│   ├── Pages/           # Home, Accounts, Transactions, Categories,
│   │                    # Reports, Settings, Help, About, Login, Register
│   ├── ToastContainer.razor
│   └── ToastValidator.razor
├── Data/                # EF Core entities, DbContext, Identity user
├── Migrations/          # EF Core migrations (SQLite)
├── Services/            # AccountService, TransactionService, CategoryService,
│                        # DashboardService, ToastService, AppState
└── wwwroot/
    ├── app.css          # Global styles
    └── js/
        └── chart-interop.js  # Chart.js interop (line, doughnut, bar charts)

BudgetApp.Tests/
├── Helpers/             # TestDbContextFactory
├── Models/              # AccountModelTests
└── Services/            # AccountService, TransactionService, CategoryService,
                         # DashboardService tests

Configuration

Default connection string in appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=budgetapp.db"
  }
}

Override at runtime via environment variable:

export ConnectionStrings__DefaultConnection="Data Source=/path/to/budgeteer.db"

SSO Providers (optional)

Add client credentials to appsettings.json (or via environment / user-secrets). Each provider is only registered when both ClientId and ClientSecret are non-empty.

{
  "Authentication": {
    "Google": {
      "ClientId": "",
      "ClientSecret": ""
    },
    "Microsoft": {
      "ClientId": "",
      "ClientSecret": ""
    },
    "GitHub": {
      "ClientId": "",
      "ClientSecret": ""
    }
  }
}

Licence

This project is provided as-is for personal use.

S
Description
A simple budgeting and forecasting app built on Blazor (SSR) and Entity Framework
Readme
1 MiB
0 Stars 1 Watchers 0 Forks
Languages
C# 58.1%
HTML 31.4%
CSS 6%
JavaScript 3.9%
Dockerfile 0.6%