Open source · built in public Building

Dashboard Starter

Dashboard Starter is an open-source starter for React, ASP.NET Core, and SQL Server: a working, production-shaped dashboard app you can clone, rename, and build your real product on. Most starters stop where the hard part begins, so this one covers the boring middle, from real auth and permissions to a server-side data grid, tests, and a deploy pipeline. I'm building it in public and writing up every significant decision, so you can take what's useful and argue with the rest.

Status: Step 8 done: every visitor gets a private demo sandbox on the live demo at dashboard.mvmorten.com, cleaned up by a background job. Post 8 tells how. Next: the CRUD module.

Stack

  • React + TypeScript, built with Vite, with React Router, TanStack Query, and plain CSS (no UI kit)
  • ASP.NET Core Web API with controllers, in C# on the current .NET LTS
  • SQL Server, one shared database for every tenant
  • Dapper with hand-written SQL, and schema changes as idempotent SQL scripts applied by an explicit migrate command
  • Multi-tenant from day one: one account across tenants, with SQL Server Row-Level Security as a safety net
  • Users, roles, and permissions built into the app, with cookie auth and Argon2id password hashing
  • Docker Compose runs SQL Server for local dev, GitHub Actions for CI
  • Azure App Service and Azure SQL host the live demo, deployed by GitHub Actions on every merge to main

How it fits together

BROWSER Phone or desktop dashboard.mvmorten.com one origin · no CORS AZURE APP SERVICE · LINUX React + TypeScript Vite build in wwwroot ASP.NET Core API controllers + Dapper One build, one zip front end and API ship together, one build number AZURE SQL Azure SQL Database Tenants · Users · TenantUsers Row-Level Security schema API login: app_runtime reads and writes data can't change the schema GITHUB ACTIONS Build + lint front end and API Schema checks real SQL Server migrate admin login app-user data-only login Zip deploy to App Service Health check deployed commit? every pull request and merge main only, after the checks pass · schema first, then code Local dev Vite proxies /api to the API · Docker runs SQL Server only · the same migrate command as CI and deploy BROWSER Phone or desktop dashboard.mvmorten.com · one origin AZURE APP SERVICE · LINUX React + TypeScript Vite build in wwwroot ASP.NET Core API controllers + Dapper One build, one zip front end and API ship together AZURE SQL Azure SQL Database Tenants · Users · TenantUsers API login: app_runtime reads and writes data, no schema changes GITHUB ACTIONS Build + lint front end and API Schema checks real SQL Server migrate admin login app-user data-only login Zip deploy to App Service Health check deployed commit? first two on every pull request; the rest on main only, after the checks pass Local dev Vite proxies /api · Docker runs SQL Server

Posts

Roles and Permissions: Check What, Not Who

Roles, permissions, and a Members page. Why the code checks permissions and never role names, why permissions come from the database instead of the cookie, and how a tenant always keeps an admin, even when two admins demote each other at once.

Read the post →

RSS feed for new posts.