Co-design Frontend
Nuxt 4 frontend for the Co-design assistant. The app provides:
authenticated project workspace and chat experience
AI-assisted project threads and template generation flows
a project knowledge hub and a user guide area
server-side proxy routes under
/services/*for auth and backend API access
Stack
Nuxt
4.xVue
3.xTypeScript
Nuxt UI
Nuxt Image
Nuxt Icon
Pinia
@sidebase/nuxt-auth(Keycloak via Auth.js)AI SDK (
@ai-sdk/vue,@ai-sdk/openai)
Project Structure
app/: UI pages, components, composables, Pinia storesserver/routes/services/: server endpoints proxied to auth/backend servicesserver/middleware/auth.ts: protects/services/*routes (except auth public paths)server/utils/: auth context and upstream API helpers for proxy routespublic/: static assetsdocker-compose.yml,Dockerfile: containerized run/build
Prerequisites
Node.js
>= 20(project Docker image uses Node 24)npm
Keycloak environment values
Backend API reachable from
NUXT_AI_BASE_URL
Setup
Install dependencies.
npm install
Create local environment file.
On macOS/Linux:
cp .env.example .env
On Windows PowerShell:
Copy-Item .env.example .env
Fill required variables in
.env.
Environment Variables
Current setup requires or recognizes the following variables:
NUXT_PUBLIC_KEYCLOAK_ISSUER: Keycloak issuer URLNUXT_PUBLIC_KEYCLOAK_CLIENT_ID: Keycloak client idNUXT_KEYCLOAK_CLIENT_SECRET: Keycloak client secretNUXT_AUTH_SECRET: Auth.js secret used byNuxtAuthHandlerNUXT_AUTH_ORIGIN: auth origin (example in.env.example:http://localhost:3000/services/auth)NUXT_AI_BASE_URL: backend base URL used by server proxy routesFRONTEND_PORT: used in Docker Compose mappingENV: used in Docker Compose image/container naming and env file selection
Run Locally
Development server:
npm run dev
Build production bundle:
npm run build
Preview built app:
npm run preview
Default local URL is usually http://localhost:3000 unless changed by env/port config.
Format the codebase:
npm run format
Docker
Build and run with compose:
docker compose up --build
Notes:
docker-compose.ymlexpectsENVandFRONTEND_PORT.It loads
.env.ci.${ENV}throughenv_file.The runtime container exposes ports
3000and3001; compose bindsFRONTEND_PORTto the appPORT.
Frontend Routes
Defined pages currently include:
/(app/pages/index.vue): home and project entry/project/[id](app/pages/project/[id]/index.vue): main chat workspace/project/[id]/knowledge-hub(app/pages/project/[id]/knowledge-hub.vue): templates/knowledge base/project/[id]/settings(app/pages/project/[id]/settings.vue): project editing, export, and members management/about-co-design(app/pages/about-co-design/index.vue): user guide content
Server Routes
Main route groups under server/routes/services/:
/services/auth/*-> auth handler (server/routes/services/auth/[...].ts)/services/diagnosis/questions/pages-> diagnosis question pages/services/diagnosis/flashand/services/diagnosis/flash/:id/convert-> flash diagnosis flows/services/diagnosis/:id/rerunand/services/diagnosis/project/:id-> diagnosis rerun and project conversionGET|POST /services/projectsPOST /services/projects/joinGET /services/projects/userGET|PATCH|DELETE /services/projects/:projectIdGET|POST /services/projects/:projectId/inviteGET|PATCH /services/projects/:projectId/membersPOST /services/projects/:projectId/members/:memberId/manageGET /services/projects/:projectId/notificationsGET|PATCH /services/projects/:projectId/project_userGET /services/projects/:projectId/exportGET|POST|PATCH /services/projects/:projectId/templateGET|POST|PATCH /services/projects/:projectId/chatGET|PATCH /services/projects/:projectId/chat/:threadIdGET|POST /services/projects/:projectId/chat/:threadId/messages
All /services/* routes are protected by server/middleware/auth.ts except public auth endpoints.
Chat and State Overview
Chat UI is page-scoped per project/thread and uses
@ai-sdk/vue(app/store/chat.ts).Thread/project state is managed in Pinia (
app/store/project.ts,app/store/main.ts,app/store/chat.ts).Template and project operations are executed via app composables/stores through
/services/*routes.
VS Code Recommendations
Recommended extensions:
ESLint (
dbaeumer.vscode-eslint)Tailwind CSS IntelliSense (
bradlc.vscode-tailwindcss)PostCSS Language Support (
csstools.postcss)Vue extension pack / Volar-based support
Troubleshooting
401 Unauthorizedfrom/services/*: ensure Keycloak values are set and login completed, then verifyNUXT_AUTH_ORIGIN, issuer, and client settings.App loads but no project/chat data: verify backend reachability at
NUXT_AI_BASE_URL.npm run previewfails: runnpm run buildfirst.
Scripts
From package.json:
npm run dev: start dev servernpm run build: build appnpm run generate: static generationnpm run preview: preview built appnpm run format: run Prettier on the repositorynpm run postinstall:nuxt prepare
Versioning
Effective app versioning with npm:
Prepare a release version
Use npm version to automatically bump the version and create a git tag:
npm version patch -m "Upgrade to %s for production"
%sis automatically replaced with the new version numberUse
minorormajorinstead ofpatchto increment accordingly
git checkout main
git merge dev
# Push code to main
git push origin main
# Push the git tag that npm created
git push origin --tags
This workflow ensures consistent versioning across npm registry and git history.