A multi-project solution for building and experimenting with web APIs, frontends, and authentication playgrounds.
- .NET SDK 10+ — https://dot.net/download
- Node.js 25+ — https://nodejs.org/
- pnpm 10+ — https://pnpm.io/
- Aspire 13.3+ (used for orchestration) — https://aspire.dev
- Mise (optional runtime manager) — https://mise.jdx.dev
On Windows PowerShell:
$env:Parameters__github_client_id = ""
$env:Parameters__github_client_secret = ""
aspire run -dOn macOS / Linux (bash/zsh):
export Parameters__github_client_id=""
export Parameters__github_client_secret=""
aspire run -dVisit the Aspire dashboard link after startup to open the web UI.
This repository includes a GeeksHackingPortal.DbMigrator tool to inspect and apply schema changes. Typical workflow:
# show CLI help
dotnet run --project GeeksHackingPortal.DbMigrator -- --help
# show schema diff
dotnet run --project GeeksHackingPortal.DbMigrator -- diff
# apply changes
dotnet run --project GeeksHackingPortal.DbMigrator -- apply
# apply changes and seed development data
dotnet run --project GeeksHackingPortal.DbMigrator -- apply --seed-development-templateapply will stop on potentially destructive changes unless --allow-destructive is specified.
- The database stores every timestamp as UTC, and the API returns every timestamp as UTC (ISO 8601, e.g.
2026-03-07T01:00:00Z), regardless of the host'sTZ. - Requests may use any offset (the web app submits schedule fields with the event's
+08:00offset); the API converts them to UTC before storing. - Presentation is up to the client. The web app formats timestamps in the event time zone (
Asia/Singapore, seeapp/utils/hackathon-date-time.ts); server-rendered content such as emails usesEventTimeZone.
- A participant's name belongs to their user profile (
User.FirstName/User.LastName), not to a hackathon or workshop registration. It is first taken from the GitHub display name and changed withPATCH /users/me. - Signing up confirms the profile name: the hackathon registration form and the workshop "Start registration" step show it, require both parts, and save any edit back to the profile, so the change applies everywhere (see
app/composables/useProfileName.ts). - Organizer views, participant emails and OIDC
given_name/family_nameclaims all read the profile name. - Names are never registration answers: the
first_nameandlast_namequestion keys are reserved.
Common helper tasks (see project-specific READMEs for frontend/backend details):
- Start local services and dashboards:
aspire run -dor use the projectjustfileif present. - Frontend: see
GeeksHackingPortal.WebApp/README.md. - OIDC playground: see
GeeksHackingPortal.OidcWebPlayground/README.md.
Open issues or PRs against this repository. Include migration diffs when proposing schema changes.