Thunderstrux is a Docker-based Next.js App Router SaaS for student societies. It supports member and organisation accounts, organisation event management, public event discovery, ticket checkout, and Stripe Connect.
Last reviewed: 2026-04-28
- Next.js 16 App Router with Turbopack
- React 19
- Auth.js / NextAuth Credentials provider
- Prisma
- PostgreSQL 16
- Tailwind CSS
- Docker Compose
- Stripe Checkout
- Stripe Connect Express
- pnpm
Development is Docker-only.
The project .env uses:
DATABASE_URL=postgresql://thunderstrux:thunderstrux@db:5432/thunderstrux?schema=public
The host name db only resolves inside the Docker Compose network. Do not run host next dev with this .env; it will fail to connect to Postgres.
Start the stack:
docker compose up -dOpen:
http://localhost:3000
Database from host:
postgresql://thunderstrux:thunderstrux@localhost:5433/thunderstrux?schema=public
Database from app container:
postgresql://thunderstrux:thunderstrux@db:5432/thunderstrux?schema=public
docker compose up -d
docker compose restart app
docker compose exec app pnpm dev:doctor
docker compose exec app pnpm dev:webpack
docker compose exec app pnpm prisma:migrate
docker compose exec app pnpm prisma:generate
docker compose exec app pnpm seed
docker compose build app
docker compose up -d --build --force-recreate app
docker compose logs -f appEquivalent package helpers exist for host use:
pnpm docker:up
pnpm docker:restart
pnpm docker:migrate
pnpm docker:seed
pnpm docker:db:sync
pnpm docker:build
pnpm docker:rebuildDo not run this against a running app container:
docker compose exec app pnpm buildThe production container serves the .next-build output through a running next start process. Running pnpm build inside that same container mutates .next-build while the server still has the previous build manifest in memory. That can desynchronise CSS/static chunks and routes, causing assets to return 404.
Use these commands instead:
pnpm docker:build
pnpm docker:rebuildIf an in-container build was already run, recreate the app container:
docker compose up -d --build --force-recreate appUser.accountRole is either:
memberorganisation
Member accounts can complete a profile, join organisations, browse public events, buy tickets, and view /tickets.
Organisation accounts represent exactly one organisation via Organisation.accountUserId and manage it at /dashboard.
For MVP, organisation committee members may share one organisation login. Future security work should add named staff users, staff invites, MFA, audit logs, and per-user permissions.
All seeded accounts use:
password123
Organisation accounts:
engineering.org@example.comarts.org@example.comrobotics.org@example.compayments.lab@example.comempty.org@example.com
Member/test accounts:
user1@example.comuser2@example.comadmin@example.comevent.manager@example.comfinance@example.comcontent@example.commember@example.comempty@example.comoutsider@example.com
Public:
//events/[eventId]/login/signup
Member:
/dashboard/dashboard/organisations/tickets
Organisation:
/dashboard/dashboard/create/dashboard/events/dashboard/events/new/dashboard/events/[eventId]/edit/dashboard/orders/dashboard/settings
Legacy compatibility redirects:
/dashboard/[orgSlug]/dashboard/[orgSlug]/events/dashboard/[orgSlug]/events/new/dashboard/[orgSlug]/events/[eventId]/edit/dashboard/[orgSlug]/orders/dashboard/[orgSlug]/settings
- Dev output writes to
.next. - Production build output writes to
.next-build. pnpm devclears.next/devbefore startup.pnpm devuses Turbopack by default.pnpm dev:webpackis the safe fallback if Turbopack route manifests or hot reload become unstable.pnpm dev:doctorprints a read-only report for stuck dev-server symptoms and stale generated metadata.pnpm buildrunsscripts/prepare-next-build.mjsandprisma generatebeforenext build.pnpm buildis blocked inside the running production-like app container. Rebuild the image instead.tsconfig.jsonmust not include.next/dev/types/**/*.ts; stale dev route types can break production builds.- The current route guard uses
proxy.ts, not deprecatedmiddleware.ts. - Turbopack root is pinned in
next.config.tsso unrelated lockfiles outside the repo do not affect workspace detection. scripts/assert-docker-runtime.mjswarns by default, but blockspnpm devoutside Docker when.envpoints atdb:5432.
app/ App Router pages and API routes
components/ UI and feature components
lib/ Auth, Prisma, validators, Stripe, client helpers
prisma/ Schema, migrations, seed script
docs/obsidian/ Internal codebase notes
docker/ Dockerfile and container setup
scripts/ Local development safety scripts