Modern app-launcher portal for internal teams with SSO, credential fallback, and admin-managed catalogues.
- Next.js App Router + TypeScript + Tailwind
- Microsoft Entra ID SSO with optional credentials fallback
- Prisma + Postgres catalogue with role-based visibility
- Drag-and-drop ordering per user (guests stored locally)
- Search, category headings toggle, and theme switcher
- Docker build + compose database
- Security headers, CSP with per-request nonce, and credential rate limiting
- Next.js 15, React 18
- NextAuth (JWT sessions)
- Prisma 5 + Postgres 16
- Tailwind CSS
- Install Node.js 20+ and Docker Desktop.
- Copy
.env.exampleto.envand set values. - Install dependencies:
npm install - Start database:
docker compose up -d db - Generate Prisma client:
npm run prisma:generate - Apply schema:
npm run prisma:push - Seed sample data:
npm run prisma:seed - Start app:
npm run dev
- Copy
.env.exampleto.envand set values. - Build and run:
docker compose up --build
The compose entrypoint runs prisma db push and prisma db seed before npm start.
NEXTAUTH_SECRET: required for NextAuth JWT signingNEXTAUTH_URL: app base URL (usehttp://localhost:3000locally)AZURE_AD_CLIENT_ID: Entra ID application (optional)AZURE_AD_CLIENT_SECRET: Entra ID secret (optional)AZURE_AD_TENANT_ID: Entra ID tenant (optional)ADMIN_EMAIL: seeded admin user emailADMIN_PASSWORD: seeded admin user passwordDATABASE_URL: Postgres connection string
npm run dev: start development servernpm run build: build production bundlenpm run start: run production servernpm run lint: lintnpm run prisma:generate: generate Prisma clientnpm run prisma:push: push schema to databasenpm run prisma:migrate: create dev migrationnpm run prisma:migrate:deploy: apply migrationsnpm run prisma:seed: seed roles, admin user, and sample apps
- Visit
/adminto create, edit, and remove apps. - Admin access requires the
adminrole on the user. - Promote users by adding a
UserRoleentry (or update the seed and re-runnpm run prisma:seed).
- Signed-in users store ordering in Postgres via
/api/app-order. - Guests store ordering and search state in local storage.
- Icon uploads are stored in
uploads/and served via/uploads/*. - Icons are limited to PNG and JPEG only.
- Max icon upload size is 2 MB.
- Docker compose mounts a named volume at
/app/uploadsto persist icons.
- CSP is applied via middleware with a per-request nonce for scripts and styles.
/api/app-orderreturns 400 for invalid JSON or payloads.
- Set a strong
NEXTAUTH_SECRETand change the seeded admin password. - If you prefer migrations, use
prisma:migrateandprisma:migrate:deployinstead ofprisma:push. - Restrict access to
/adminbehind role assignment and SSO as appropriate.