PoPunkouterSoftware is a .NET 10 Blazor Web App with a server host, a WebAssembly client, and operational endpoints for the Azure inventory report, the app portfolio, and diagnostics.
src/PoPunkouterSoftware.API/: ASP.NET Core host + BFF. Feature slices underFeatures/<Area>/(Config, Diag, Portfolio, SignIns); host-level plumbing that belongs to no slice lives inHost/. Hosts the Blazor WASM shell.src/PoPunkouterSoftware.Client/: WASM UI, layouts, pages, and static assets.src/PoPunkouterSoftware.Shared/: contracts and models shared between the host and client.src/PoPunkouterSoftware.Infrastructure/: Azure and integration adapters.tests/PoPunkouterSoftware.Unit/: xUnit, strictly no-I/O.tests/PoPunkouterSoftware.Integration/:WebApplicationFactory+ Azurite Testcontainers.tests/PoPunkouterSoftware.E2EAPI/: pure-HTTP contract tests against a live instance.tests/PoPunkouterSoftware.E2EUI/: C# Playwright browser tests (run on demand against a live instance).SCRIPTS/: setup and automation helpers.
Prerequisites:
- .NET SDK from
global.json - Node.js for Playwright tests
- Docker Desktop for Azurite-backed integration scenarios
Common commands:
dotnet build .\PoPunkouterSoftware.sln
dotnet test .\tests\PoPunkouterSoftware.Unit
dotnet test .\tests\PoPunkouterSoftware.IntegrationAvailable VS Code tasks in this workspace include:
buildtest-unitstart-azuritestart-api-serverdeep-clean(removes everybin/andobj/;dotnet cleanleavesobj/behind)
The app runs locally on HTTP port 8000.
/healthis the deep probe (Key Vault, Table Storage);/healthzis a static liveness ping./api/diag/*(summary, report, refresh, cancel-refresh, restart/{name}, ai) expose diagnostics;/diagitself was removed 2026-09-04 — diagnostics surface in the/azureAdvanced diagnostics drawer.restart/{name}restarts (or starts) one scanned App Service and sits behind the same management gate asrefresh; in Azure it also needs Website Contributor, which infra does not grant.- Each scan also reads Azure Resource Health (for down apps), Azure Advisor, 24h exception counts per app from the shared Application Insights component (
SignIns:ResourceId), and open Dependabot alerts per matched repo (needs Dependabot enabled on the repo and a PAT with "Dependabot alerts: read"). - Push alerts go through ntfy (
Alerts:NtfyTopic): app down/up, failed scan, spend spike, an SSL certificate crossing 14 days, the month-end forecast crossing the budget.deploy.yml(rollback) andscreenshots.yml(Lighthouse drop of 15+ points) send to the same topic via the optionalNTFY_TOPICGitHub secret, falling back to the Key Vault secret. deploy.ymlbacks up the live site, smoke-tests/healthz,/healthand/api/diag/summaryafter deploying, and redeploys the backup if the smoke test fails.- Azure behavior prefers Key Vault and managed identity when available, with local fallback configuration for development.
- The client dashboard consumes the shared Azure report models generated by the server and infrastructure layers.
/settingsholds every visitor preference — theme, density, sound and effects — inlocalStorage, each defaulting to the simplest option. Full effects (fluid, flocks, scars, the health orb, the palette jump) are opt-in.
- Unit tests (
PoPunkouterSoftware.Unit) cover pure logic and API helpers, no I/O. - Integration tests (
PoPunkouterSoftware.Integration) cover host configuration, diagnostics endpoints, and Azure Table Storage behavior viaWebApplicationFactory+ Testcontainers Azurite. - E2E tests (
PoPunkouterSoftware.E2EAPI,PoPunkouterSoftware.E2EUI) cover the HTTP contract and browser flows against a live instance; on demand, not in CI. E2EUI runs axe-core's WCAG 2.1 A/AA rules over every page (Deque.AxeCore.Playwright) and fails on serious or critical violations. - Each tier has a hard test budget — 100 Unit, 50 Integration, 25 E2E-API, 25 E2E-UI. Adding a test means removing one; prefer widening an existing test's assertions.
- Read
CLAUDE.mdbefore broad changes — it is the single context map. (AGENT.MDwas merged into it and deleted;AGENTS.mdonly points there.) - Keep
/api/diag/*available but do not link them from the UI — diagnostics surface only in the/azureAdvanced diagnostics drawer. - Preserve Po-prefixed naming and strict build quality defaults from
Directory.Build.props.