Context
A portfolio shouldn't just claim skills — it should demonstrate them. This site is built as a real production system: Next.js App Router, SQLite with Drizzle ORM, JWT-based auth via Auth.js, and self-hosted on a KVM VPS. Every architectural decision is visible and justified.
Stack Decisions
Next.js 16 App Router for server components and route handlers. SQLite with better-sqlite3 for zero-config data — each project gets its own database file. Drizzle ORM for typed schemas. Auth.js for stateless JWT sessions. Zod for validation. Framer Motion for purposeful animations. Tailwind CSS v4 + shadcn/ui for the design system.
Why Self-Hosted
better-sqlite3 needs Node.js filesystem access — incompatible with serverless edge. Instead, the app runs on a Hostinger KVM VPS with nginx reverse-proxy and PM2 process management. Self-hosting gives full control over the runtime, database files, and deployment pipeline.
Design System
The Dark Studio design system uses a near-black canvas (#0f0f0f), amber signal accent (#f59e0b), Fraunces for display serif headings, and Plus Jakarta Sans for UI. Motion is purposeful and reduced-motion safe. The anti-slop checklist bans gradient text, glassmorphism defaults, and emoji-first product cards.
Auth & Payments
Auth.js provides stateless JWT sessions — no database round-trip per request. The payment layer is abstracted behind a provider-agnostic interface supporting Stripe, Paddle, and LemonSqueezy, switchable via environment variables.
What I'd Do Next
Add a shared analytics layer across projects. Implement a performance dashboard. Explore SQLite read replicas for scaling.