From a fresh machine to the dashboard running locally against the shared dev databases, signed in with a test login and looking at dev transactions. There is no container and no local database: the app reads every connection string from an Azure Key Vault when it starts.
Checked against development at 2ccf8cf on .
Install the tools, then ask the WAVit team for the access in the list below.
| Tool | Version | Why |
|---|---|---|
| .NET SDK | 8.0 (the pipelines use 8.0.x) | All four projects target net8.0. A newer SDK builds them too, but running the app needs the ASP.NET Core 8 runtime, which the 8.0 SDK includes. |
| Git | Any recent version | The code is in Azure DevOps: project WavitSystems, repository WAVitDashboard. |
| Azure CLI | Any recent version | az login gives the app your Azure identity. The app uses it to read the dev Key Vault. |
| Visual Studio 2022 or later | Optional | What the repo's README assumes. Signing in to Visual Studio with the same account also works for Key Vault. |
az login. Ask for the vault's URI as well. It goes into your Development settings.The dashboard is database-first. It has no EF migrations, and no script in the repo builds MiPoint or the Identity database. Everyone works against the same dev databases, so treat their data as shared.
Work starts from development. Pull requests go into development, which deploys to the dev site on every push. main reaches production through release/prod/v* tags.
git clone https://micampdev.visualstudio.com/WavitSystems/_git/WAVitDashboard
cd WAVitDashboard
git switch development
git switch -c us/<story-id>/main
dotnet restore WAVitDashboard.sln
dotnet build WAVitDashboard.slnus/<story-id>/main for a story, us/<story-id>/task/<task-id>-<short-name> for a task under it.WAVitDashboard/WAvitDashboardWeb.csproj (the web app), MiCamp.Models and MiCamp.DataAccess (MiPoint entities and data access), and WAVitDashboard.Tests.There is very little local configuration. At startup the app reads five secrets from the Key Vault named by KeyVault:Uri, and it stops if any of them is missing.
The committed appsettings.json sets KeyVault:Uri to the production Key Vault, because production reads it from there. If you run without your own Development settings and your account can read that vault, your local app uses the production databases. Create the file below before your first run.
{
"KeyVault": {
"Uri": "https://<dev-key-vault-name>.vault.azure.net/"
},
"Clarity": {
"ProjectId": ""
}
}The file is listed in .gitignore, so it stays on your machine. Every launch profile sets ASPNETCORE_ENVIRONMENT to Development, and that is what makes the app load it. An environment variable named KeyVault__Uri works too. User secrets are not set up (the project has no UserSecretsId), and the app never reads connection strings from configuration anyway.
| Key | Where it is set | What it does |
|---|---|---|
KeyVault:Uri | appsettings.json (production). Override it in appsettings.Development.json. | Required. The vault every secret is read from, with DefaultAzureCredential. |
Clarity:ProjectId | appsettings.json | Microsoft Clarity session replay on signed-in pages. Set it to an empty string locally so your sessions do not land in the shared Clarity project. |
Clover:BaseUrl | appsettings.json | Clover's web address, for the receipt fallback. Leave it as it is. |
ApplicationInsights:ConnectionString | Not set | Optional. Without it no telemetry is sent, which is what you want locally. |
ASPNETCORE_ENVIRONMENT | Properties/launchSettings.json | Development in every profile. Loads your Development file and shows the detailed error page. |
| Secret | Used for |
|---|---|
MiPointConnectionString | The MiPoint database (both MiPoint EF contexts) |
AzureIntegrationManagerConnectionString | The Identity database: logins, passwords, 2FA |
smtp2goPassword | Email over SMTP2GO: confirmations, password resets, invitations and receipts |
SlackFeedbackWebhookUrl | Posting survey responses to Slack |
MiPointApiKey | Creating and cancelling invoices through the MiPoint API |
az login # the account that can read the dev vault
dotnet dev-certs https --trust # once per machine
dotnet run --project WAVitDashboard --launch-profile https| Profile | Address |
|---|---|
https | https://localhost:7036 and http://localhost:5139 |
http | http://localhost:5139 |
IIS Express (Visual Studio) | http://localhost:63279, SSL port 44369 |
The browser opens on the public landing page. Before you sign in, open /health to check that the app reached the vault and both databases. It answers 200 when every check passes and 503 when one fails. It shows statuses only; the reason for a failure is logged in the console where dotnet run is running.
{
"status": "Healthy",
"checks": [
{ "name": "identity-db", "status": "Healthy" },
{ "name": "mipoint-db", "status": "Healthy" },
{ "name": "key-vault", "status": "Healthy" }
]
}Email really goes out through SMTP2GO: confirmations, invitations and Resend Receipt. New Invoice calls the MiPoint API, whose base URL is fixed in Program.cs rather than in configuration, and that sends a real email or text. The public survey posts to Slack. Settings and PIN changes write to the shared dev MiPoint. Use test addresses and test units only.
A read-only tour that proves the whole chain works: the Identity database, MiPoint, and the per-user scoping of units.
https://localhost:7036/Identity/Account/Login, or use the sign-in link on the landing page, and sign in with the dev test login. Every successful sign-in lands on Home, /Dashboard/Portal/Home, whatever page you started from./Dashboard/Transaction/Index). The page opens on today's date range for every unit your login can see.The unit tests need no database, vault or sign-in. They use EF Core InMemory and Moq.
dotnet build WAVitDashboard.sln --configuration Release
dotnet test WAVitDashboard.Tests/WAVitDashboard.Tests.csproj --configuration Release --no-buildOn development at 2ccf8cf this runs 151 tests, and all of them pass. Pull requests into development and main run the same restore, build and test (azure-pipelines.yml). Every push to development runs the tests again before it deploys to the dev site.
A Playwright end-to-end suite, WAVitDashboard.E2E, lives on unmerged branches (the newest is us/1693/main). It reads E2E_BASE_URL, E2E_USER and E2E_PASSWORD from a .env file that you copy from .env.example, it must never point at production, and no pipeline runs it yet.
| What you see | What to do |
|---|---|
Startup stops with Failed to read secret 'MiPointConnectionString' from Key Vault. | Your Azure identity cannot read the vault. Run az login with the account that has access (az account show tells you which one is active), or sign in to Visual Studio with it. The inner exception says whether sign-in or permission failed. |
Startup stops with KeyVault:Uri is not configured. | The key is empty in every settings file. Set it in WAVitDashboard/appsettings.Development.json. |
| Merchants or totals look like production | Your Development settings were not loaded, so the app used the production vault from appsettings.json. Stop the app. Check that your file sits next to appsettings.json and that ASPNETCORE_ENVIRONMENT is Development. It is not when you pass --no-launch-profile or run the DLL directly. |
/health shows identity-db or mipoint-db as Unhealthy | The secrets loaded but the database did not answer. The console has the SQL error. If it is a network or firewall error, ask the team for access to the dev database server. |
Sign-in says User Not Found. | No login with that email exists in the dev Identity database. |
Sign-in says Please, confirm your email . | The email is not confirmed yet. Use the resend link on the login page. The email really goes out. |
Sign-in says User temporarily disabled. | The email's master MID record is marked Hidden. |
| Signed in, but Home sends you to the error page | The email has no master MID record in the dev MiPoint, and no unit lists it as its contact email, so the dashboard cannot tell which units it may show. |
| Transactions shows an empty table | The default range is today. Pick Last 7 Days and press Search. If it is still empty, the login's units have no recent dev payments, or they are unticked under Account settings, Preferences. |
The README says to uncomment connection strings in Program.cs | That step is out of date, and so is its clone URL. Connection strings now come only from the Key Vault, so there is nothing to uncomment. |
| You need a schema change | There are no EF migrations, so dotnet ef will not help. Schema changes are SQL scripts under db/, run once per environment. db/DashboardAuditLog.sql is the example. |