Vue 3 / Nuxt frontend for cupcake. Lets javaBin heroes (helter group) browse JavaZone conferences and sessions to find potential speakers for local events.
- Framework: Nuxt (SPA mode)
- UI: Nuxt UI + Tailwind CSS
- Auth: OIDC Authorization Code flow via
oidc-client-ts - Icons: Nuxt Icon (Carbon, Lucide, Logos, OpenMoji)
- Metrics: Prometheus via
@artmizu/nuxt-prometheus - Package manager: pnpm
| Route | Description |
|---|---|
/ |
Home — shows authenticated user and role check |
/conference/[conferenceId] |
Session browser with filtering for a conference |
/conference/[conferenceId]/session/[sessionId] |
Session detail with full speaker info (bio, email, location) |
The app uses the OIDC Authorization Code flow. Tokens are stored in browser sessionStorage. All API requests are automatically sent with a Bearer token, and a 401 response triggers a silent refresh before retrying.
Access requires membership in the helter group in Cognito. The home page displays a warning if the authenticated user is not a member.
Install dependencies:
pnpm installStart the dev server (proxies /api/* to http://127.0.0.1:8080 by default):
pnpm devThe cupcake backend must be running locally unless you override CUPCAKE_BACKEND. With JWT_ENABLED=false on the backend, no auth configuration is needed.
The frontend OIDC authority defaults to the Cognito internal pool. To log in locally, set NUXT_PUBLIC_OIDC_CLIENT_ID (see Configuration).
pnpm build
pnpm previewpnpm lint # check
pnpm lint:fix # auto-fixESLint and Prettier are also enforced via pre-commit hooks (lint-staged).
| Environment Variable | Description | Default |
|---|---|---|
CUPCAKE_BACKEND |
Backend base URL for the server-side proxy | http://127.0.0.1:8080 (dev) / https://cupcake-backend.java.no (prod) |
CUPCAKE_FRONTEND |
Hostname the dev server allows (Vite allowedHosts) |
localhost |
NUXT_PUBLIC_OIDC_AUTHORITY |
OIDC authority (issuer) URL | Cognito internal pool issuer |
NUXT_PUBLIC_OIDC_CLIENT_ID |
OIDC client ID | empty |
In the platform deployment both are injected via auth.env in app.yaml (aliases of COGNITO_ISSUER_URL and COGNITO_CLIENT_ID for the platform-created public Cognito client). For local login against Cognito, set NUXT_PUBLIC_OIDC_CLIENT_ID to that client ID; http://localhost:3000/ is a registered callback.
The Nuxt server middleware transparently proxies the following paths to the cupcake backend:
/api/*— conference and session data/login— OIDC login initiation/refresh— token refresh
This keeps the frontend and backend on the same origin from the browser's perspective, avoiding CORS issues.
Multi-platform images (linux/amd64, linux/arm64) are published to ghcr.io/javabin/frosting.
To build locally:
docker build -t frosting .The image uses a multi-stage build (Node build stage, slim runtime stage) and serves via the Nitro server on port 3000.
| Trigger | Workflow | What it does |
|---|---|---|
Push to main |
build.yaml |
Builds and pushes multi-platform Docker image, tags as staging |
| Pull request | pr.yaml |
Runs pnpm lint and pnpm build |
Tag v* |
release.yaml |
Promotes staging image to release and version tag |