Personal Project — 2025–Present
AllGearNoGame
Full-stack, security-hardened social platform for sports-gear reviews
Designed, built, and self-hosted a production-grade social platform for sports-gear reviews — TypeScript end-to-end, from a PostgreSQL/PostGIS schema to a React 19 UI, behind a zero-inbound-port Cloudflare Tunnel. A per-sport feed across 18+ sports mixes structured 1–5★ gear reviews with discussions, threaded comments, fuzzy gear search over a seeded 2,886-item catalog, and a peer-conferred credibility system.
Engineering Highlights
- —End-to-end TypeScript in a pnpm + Turborepo monorepo: Next.js 16 / React 19 frontend, NestJS API, Drizzle + PostgreSQL 17 / PostGIS, and a Valkey cache — a single Drizzle schema is the source of truth, with types flowing into both API and UI.
- —Secure auth (better-auth): Argon2id hashing, OAuth-ready social login, HIBP breached-password rejection, Postgres-backed sessions, and a BFF pattern where Next.js holds the httpOnly cookie and talks to the API server-to-server.
- —OWASP-aware hardening: strict CSP + security-header suite (HSTS, X-Frame), CSRF Origin allow-list backing SameSite cookies, Valkey-backed rate limiting, server-side ownership checks (no IDOR), and AES-256-GCM encryption of OAuth tokens at rest.
- —Database performance audit with EXPLAIN (ANALYZE, BUFFERS) against ~145k synthetic rows; partial, trigram (GIN), and GiST indexes, Valkey cache-aside, and keyset pagination — every hot query verified sub-millisecond.
- —Peer-conferred "Cred" reputation system: readers attach weighted assessments to posts; cred rolls up per-sport and globally into a 5-tier ladder, monotonic by design so it can't be farmed. PostGIS geography + GiST powers "near me" facility ranking.
- —Self-hosted on Linux via Docker Compose (separate dev/staging/prod stacks) behind an outbound-only Cloudflare Tunnel — no inbound ports, no exposed IP — with multi-stage non-root images, Pino structured logging, GlitchTip/Sentry, and health/readiness probes.
TypeScriptNext.jsReactNestJSDrizzle ORMPostgreSQLPostGISValkeyTailwind CSSDockerpnpmTurborepoCloudflare Tunnelbetter-auth