Skip to content
Stack

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

Core

Daily driver. I have made and defended architectural decisions here.

Strong

Shipped production code with it; comfortable without documentation.

Working

Used it on real features; reach for docs on the deep end.

Familiar

Read the model, built something small, know when it applies.