Dashboard is an ASP.NET Core MVC (.NET 10) homelab launcher for self-hosted apps. It renders title-only cards in a responsive grid, stores data in SQLite, supports drag and keyboard reordering, and includes Origami light/dark themes.
| Light | Dark |
|---|---|
![]() |
![]() |
- Title-only app cards (no visible URL text)
- Add, edit, and delete cards from the UI (right-click a card to edit or delete)
- URL validation (
http:///https://absolute URLs only) - Customizable dashboard title via settings gear, persisted per browser
- Browser tab title syncs with the dashboard title
- Deterministic ordering (
SortOrder, thenTitle) - Drag-and-drop reorder with persistence
- Keyboard reorder (
Alt+ArrowUp,Alt+ArrowDown) - Help dialog (
?orF1) with keyboard shortcuts and usage reference - Origami light/dark theme toggle with browser persistence
- SVG favicon
- SQLite persistence for simple backup/restore
- Serilog file logging with daily rolling files retained for 30 days
src/Dashboard.Web- MVC app, EF Core, views, static assetstests/Dashboard.Web.Tests- unit teststests/Dashboard.Web.IntegrationTests- SQLite integration testsdocker-compose.yml- production-oriented local container rundocker-compose.dev.yml- containerized dev workflowbuild.csando- ANDO build/publish scriptdocs/deployment/truenas.md- deployment notes
Requirements:
- .NET SDK 10+
- Docker + Docker Compose (for dev container workflow)
dotnet restore Dashboard.slnx
dotnet build Dashboard.slnx
dotnet test Dashboard.slnx
dotnet run --project src/Dashboard.Web/Dashboard.Web.csproj --urls http://127.0.0.1:8080Open http://127.0.0.1:8080.
./run-dev.shStop dev environment:
./stop-dev.shThis repo use the Ando Build System.
Run build/test pipeline:
andoPublish version
ando releaseUse TrueNAS Apps -> Discover Apps -> Custom App and paste YAML. Mount a single persistent dataset to /app/storage.
Security note: this app has no built-in auth. Keep it on LAN/VPN-only networks.
- TrueNAS SCALE Apps pool configured.
- Dataset created for app data, for example:
/mnt/tank/apps/dashboard/data
- Dataset writable by the container runtime user (or equivalent ACL).
- Docker image available in GHCR.
services:
dashboard:
image: ghcr.io/aduggleby/dashboard:latest
pull_policy: always
container_name: dashboard-web
restart: unless-stopped
environment:
ConnectionStrings__DashboardDb: Data Source=/app/storage/data/dashboard.db
ASPNETCORE_HTTPS_PORT: 443
ports:
- "80:8080"
- "443:8443"
volumes:
- /mnt/tank/apps/dashboard:/app/storage
- dashboard-certs:/app/certs
volumes:
dashboard-certs:Notes:
- A self-signed TLS certificate is auto-generated on first startup and persisted in the
dashboard-certsvolume. - The app creates
/app/storage/dataand/app/storage/logsat startup.
| Variable | Default | Notes |
|---|---|---|
ConnectionStrings__DashboardDb |
Data Source=/app/storage/data/dashboard.db |
SQLite DB location inside container |
ASPNETCORE_ENVIRONMENT |
Production |
Use Development only for local dev |
ASPNETCORE_URLS |
http://+:8080;https://+:8443 |
Container bind addresses/ports |
ASPNETCORE_HTTPS_PORT |
(not set) | External HTTPS port for HTTP→HTTPS redirect (e.g. 443) |
Logging defaults:
- Production file logs:
/app/storage/logs/dashboard-.log - Rolling interval: daily
- Retention: 30 files (roughly 30 days)
- Because
/app/storageis volume-mounted in TrueNAS YAML, logs are persisted on disk with application data.
Back up the dataset mounted to /app/storage (minimum file: data/dashboard.db).
Restore procedure:
- Stop app.
- Restore dataset/files.
- Start app.
- Validate cards and ordering.

