Personal engineering portfolio
OngoingThis site: Next.js 16 on Railway, with GitHub Actions checks, Prisma migrations and private client rooms.
- Next.js 16
- TypeScript
- Tailwind CSS v4
- shadcn/ui
- Prisma 7
- PostgreSQL
- Auth.js
- Vitest
- Playwright
- Docker
- GitHub Actions
- Railway
Outcome
Every merge passes five CI jobs before it deploys to Railway.
Context
The code, tests and CI config are public on GitHub.
Decisions
- Framework: Next.js 16 App Router with TypeScript strict mode. Server components by default, client boundaries only where needed.
- Styling: Tailwind CSS v4 with OKLCH design tokens and shadcn/ui. Geist Sans and Geist Mono, dark only.
- Database: PostgreSQL with Prisma 7. Content status and visibility are separate concerns (draft/published/archived × public/privateRoom/adminOnly).
- Auth: Auth.js v5 beta with GitHub OAuth, owner-only access. No client accounts in v1.
- Private Rooms: Signed, revocable, SHA256-hashed tokens for read-only client project views.
- Testing: Vitest unit tests, Playwright end-to-end tests and axe accessibility scans, all in CI.
- CI/CD: GitHub Actions validates Prisma, migrations, seed data, typechecking, unit tests, production build, Docker image creation, smoke flows, accessibility, and private-room access.
- Deployment: Multi-stage Dockerfile, Next.js standalone output, Railway container deployment, Railway-managed PostgreSQL, and runtime environment variables for secrets and canonical URLs.
- Migration discipline: Production starts with
prisma migrate deploybeforenode server.js, keeping local, CI, and Railway schema evolution on the same path. - Custom domain:
bagtyyar.devis the canonical production URL, with Auth.js and SEO metadata configured through Railway variables.
Tests and deployment
GitHub Actions quality gate
CI/CDPrisma validate, migration deploy, seed verification, typecheck, Vitest unit tests, production build, Docker image verification, smoke checks, private-room checks, and accessibility scans run before code reaches production.
Playwright tests in 4 CI jobs
TestingPublic navigation, admin guard, accessibility (axe-core), and private room flows tested across 4 dedicated CI gates.
Multi-stage production Dockerfile
DockerDockerfile uses deps, builder, and runner stages with Next.js standalone output. CI verifies the image, and the Railway container runs Prisma migrations before starting the Next.js server.
Railway deployment with custom domain
DeploymentRailway hosts the Dockerized Next.js app, manages PostgreSQL, stores production environment variables, and serves the canonical bagtyyar.dev domain.
Accessibility scans
TestingAutomated axe-core scans on every PR. prefers-reduced-motion support, semantic HTML, and keyboard-navigable private room fallbacks.
Private rooms with signed revocable tokens
ArchitectureSHA256-hashed access tokens with explicit revocation. Invalid and revoked tokens fail safely without leaking project existence or content.