Every claim comes with evidence
A skills list is worthless without proof, so each entry below says what I built with it. 50 tools, 23 of them things I use daily and have made architectural decisions about.
The ratings are deliberately conservative. If something is marked “Working” rather than “Core”, that is me telling you where I would still reach for documentation.
50 skills shown
Backend & API
Where most of my work lives: modular monoliths, guard chains, background workers, and contracts that hold under load.
- TypeScript
Strict mode across 841 files; type-check is the primary CI gate
- NestJS
37-module modular monolith, 57 controllers, 337 REST endpoints
- Node.js
API, queue worker, and a published CLI on Node 20+
- Python
38k-line FastAPI inference service, mypy strict, ruff-clean
- FastAPI
AI orchestration service — streaming, tool loops, JWT verification
- REST API design
Versioned /api/v1 surface with OpenAPI 3.1 as a codegen source
- Django / DRF
SociaLink ingestion API and admin surface
- Socket.IO / WebSockets
Realtime messaging gateway with the Redis adapter for multi-node fan-out
- BullMQ / queues
Import pipeline, embedding jobs, and a reaper for stalled sessions
- Celery
Async enrichment stages in the SociaLink pipeline
- Zod / class-validator
Env schemas that refuse to boot the API on a missing variable
- OpenAPI contracts
Generated wire types shared between NestJS and Python, with a drift guard in CI
Data & Persistence
Schema-first. I would rather spend a day on a migration than a quarter on a data-fix script.
- PostgreSQL
69-model schema, 62 migrations, append-only tables enforced by rules
- Prisma
Shared @prom/db package generating a client for five deployables
- pgvector
vector(1024) column with an HNSW cosine index backing the knowledge graph
- Redis
Queue backend, socket adapter, idempotency keys, rate-limit storage
- MongoDB
Document store in SociaLink's polyglot persistence layer
- SQL & query tuning
Index design for tenant-scoped reads and vector recall
- Data modelling
org to product to team to workflow to task, with tenancy on every row
- ETL & ingestion
Bronze-Silver-Gold layers; chunk, embed, map and apply import engine
- S3 / MinIO
Signed uploads and image derivatives via sharp
Applied AI & Retrieval
Treating models as an unreliable dependency you engineer around, not a magic box you trust.
- RAG architecture
Layered context assembly: system, memory, RAG, lineage, phase rollups
- Embeddings & vector search
Voyage AI behind an Embedder interface with a deterministic offline mock
- Knowledge graphs
kg_entities and kg_edges in Postgres — no external vector database
- LLM tool calling
Tools call back into the core API with the user's token, so AI cannot bypass RBAC
- Anthropic Claude API
Provider abstraction with per-model sampling allowlists and graceful degradation
- Prompt engineering
~130 versioned prompt templates with methodology-aware system prompts
- Model routing & cost control
FAST / BALANCED / QUALITY / AUTO tiers with heavy-kind routing and output budgets
- LangChain
Retrieval chains in SociaLink before moving to a hand-rolled orchestrator
- MCP
An MCP server in the API plus a published CLI that proxies it over stdio
- Streaming & SSE
Token streaming with best-effort context so retrieval failures do not kill the stream
Frontend & Product
Enough depth to own a product surface end to end, including the parts that are actually hard: state, realtime and accessibility.
- React 19
157 components across the PROM web app
- Next.js App Router
72 routes — marketing, auth, onboarding and the authenticated product
- Tailwind CSS
Token-driven design system with data-theme dark mode
- TanStack Query
Server-state cache across the whole authenticated surface
- Zustand
Workspace store — including learning why selectors that build arrays loop forever
- Radix UI & a11y
Keyboard-complete dialogs, menus and tooltips
- Framer Motion
Page transitions and the landing-page motion system
- Three.js / R3F
3D carousel on the PROM landing page
- Design systems
A written design and copy standard both apps are held to
Platform, Security & Ops
The unglamorous half. Most of what makes software trustworthy happens here.
- Docker & Compose
Full local stack: Postgres, Redis, MinIO, plus per-service images
- Turborepo
Six apps and four shared packages with a dependency-aware task graph
- Multi-tenancy
organization_id on every row, AsyncLocalStorage tenant context, per-module scope guards
- AuthN / AuthZ
Argon2, JWT access and refresh rotation, TOTP 2FA, OAuth, RBAC, IP allowlists
- Application security
CSP, helmet, origin guard, a throttling floor on every route, signed webhook bodies
- Stripe & billing
Subscriptions, entitlements, trial pause as a global guard, credit gating with 402s
- Observability
OpenTelemetry, Prometheus metrics, structured logs via pino and structlog
- CI / GitHub Actions
Type-check, lint, test and codegen-drift gates
- Testing
89 Jest specs, a testcontainers integration suite, pytest against a mocked provider
- Git & review
602 conventional commits with docs updated in the same change
Daily driver. I have made and defended architectural decisions here.
Shipped production code with it; comfortable without documentation.
Used it on real features; reach for docs on the deep end.
Read the model, built something small, know when it applies.