Minimal Atrium web app using ASP.NET Core Minimal API (.NET 10).
Default port: 5103 (PORT env override).
dotnet run --project HelloAtrium.csprojYour process reads ATRIUM_SETUP_SECRET to verify the first lifecycle.setup call. That is your app’s own setup secret: COHO mints it when you register the app and shows it once in the create response (regenerate it from My apps if lost). On Atrium Hosting, COHO injects the env var for you; when self-hosting, set it yourself before connecting. Set ATRIUM_DATA_DIR to persist connection secrets and config across restarts. Set ATRIUM_FRAME_ANCESTORS and ATRIUM_PARENT_ORIGIN to the Store origin for the environment you embed from (same value for both). Playground and production values are in developer spec §6; when unset, these kits default to http://localhost:4200 for local ng serve.
Endpoints
Section titled “Endpoints”Same runtime contract as the other hello samples:
/health- signed
/webhooks/atrium/* - signed native config at
/config/schemaand/config - signed iframe quick view at
/ui - external app-owned page at
/configure
COHO opens /ui and /configure with a short-lived signed launch URL that includes connectionReference, atriumUsageToken (person + organisation + connection JWT), and atriumSignature. Prefer Authorization: Bearer <atriumUsageToken> for interactive Public API calls from the quick view; keep the connection apiKey from lifecycle.setup for background/webhooks. See developer spec §6 / §8.
For local Store registration, use manifest.example.json.
Signature verification is pinned to the published test vectors in the app developer spec.
If you add a Dockerfile for Atrium Hosting, you can keep Microsoft aspnet USER app. Hosting runs the task as UID/GID 65532 to match the /data mount — see app developer spec §5.6.
dotnet test HelloAtrium.Tests/HelloAtrium.Tests.csproj