BA AI Engineer & Full-Stack TypeScript Developer

Tech skills

The stack, and what I've actually done with it

Check the overlap in about fifteen seconds. Names first, evidence underneath — because anyone can type “RAG” on a website.

70 skills, each with evidence in a repository
9 areas, from retrieval maths to CI gates
7 at Expert — built the pattern from scratch
49 at Strong — production integration

The level on every row is anchored to what the code demonstrates, not to what would look good on a page like this. That is why there are things below marked working and familiar instead of being quietly promoted or dropped.

The list

Looking for something specific?

Literal names, grouped the way a technical team thinks about them. If what you use is here, there's a row for it in the table below.

AI & agents

Where the interesting work is. Agents with typed tools, retrieval you can audit.

  • Mastra
  • Vercel AI SDK v6
  • Model Context Protocol (MCP)
  • OpenAI GPT + embeddings
  • pgvector RAG
  • AG-UI runtime

Language & runtime

One language end to end, strict, with schemas as the source of truth.

  • TypeScript (strict)
  • Node.js 22
  • ESM
  • Zod

Frontend

App Router for products, Astro for content. Both in production.

  • Next.js 16 App Router
  • React 19 + React Compiler
  • Astro 7
  • Tailwind CSS 4
  • dnd-kit
  • GSAP + Lenis

Data

Postgres first, and close enough to it to write the SQL by hand.

  • PostgreSQL
  • Neon + Neon Auth
  • Supabase + Supabase Auth
  • Drizzle ORM
  • pgvector
  • Sanity + GROQ

Platform & delivery

Managed platforms on purpose — no cluster to babysit.

  • Vercel
  • Netlify
  • Railway
  • Turborepo + pnpm
  • GitHub Actions
  • Workflow DevKit

Product surface

Billing, email, analytics and the tests that keep them honest.

  • Stripe
  • SendGrid
  • MailerSend
  • PostHog
  • Playwright
  • Cypress
  • Vitest

The receipts

Same list, with the proof attached

Search it, filter by area, or filter by level. The evidence column names what in the code demonstrates the claim — a queue primitive, a rerank formula, a specific fix. Search covers the evidence too, so looking for 'SKIP LOCKED' or 'ivfflat' works.

SkillAreaLevelEvidence in code
API design & streamingBackend & APIExpertStreaming chat route, service-to-service proxy with timeout + idempotency + shared secret, build-time query endpoints.
Event taxonomy as a typed contractAnalyticsExpertA ~40-event discriminated union mirroring a 69 KB taxonomy doc, versioned super-property, compile-time PII invariant.
Mastra multi-agent systemsAI / LLM EngineeringExpertTwo production agents with per-request instruction override, Postgres-backed memory, analyzer/learning agents via structured output.
MCP server authoringAI / LLM EngineeringExpert26 Zod tools, 5 resources and 3 prompts over streamable HTTP, on the same business layer as the REST API — conversations, proposals, skills, bundles, knowledge CRUD, retrieval and two analytics tools. The team's own AI clients work the review queue through it.
Next.js 16 App RouterFrontendExpert'use cache' + cacheTag/revalidateTag, Cache Components and React Compiler enabled, ~40 route handlers, a soft-404 fix in proxy.ts.
PostgreSQL (raw SQL, JSONB, concurrency)Data & PostgresExpertSKIP LOCKED job queue, JSONB merge UPSERT that fixed a real first-write race, forward-only idempotent migrations.
TypeScript (strict, advanced types)LanguagesExpertA ~40-event discriminated union, satisfies plus type guards, z.infer as the single source of truth; strict and no-any across every repository.
ADR governanceArchitectureStrongMulti-agent ownership model with boundaries and defer rules, ADR requirement, three-repo topology.
Anti-corruption layersArchitectureStrongMappers that normalise a third-party payload and prefer structured fields over stale strings.
Auth engineeringBackend & APIStrongargon2 bearer keys verified in constant time, Neon Auth OAuth loop fixed via sameSite, one unified requireAuth seam.
Client + server capture & identity stitchingAnalyticsStrongA before_send hook dropping ~4,300 scanner exceptions a week, immediate capture on exit paths, distinct_id normalised on email.
Content migrationData & PostgresStrongA ~510-line Portable Text serialiser with no library behind it, a concurrent image downloader, custom HTML-to-markdown rules.
Cross-era methodology & bot filteringAnalyticsStrongWindows anchored on cutover dates plus a uniqIf($pageleave) cohort that corrected roughly 5-10x scanner inflation.
Custom CI gatesInfra & DevOpsStrongA scanner reading both CMS documents and code strings for house-style violations, wired in as a required check.
Deterministic prompt-as-productAI / LLM EngineeringStrongA pure function compiling a template's HTML plus a JSONB token manifest into a framework-specific brief for six targets, snapshot-tested.
Distributed lockingBackend & APIStrongReconcile lease as an atomic JSONB compare-and-swap with a crash-recovery TTL; job queue on FOR UPDATE SKIP LOCKED.
Drizzle ORMData & PostgresStrong~17 tables including two embedding tables, ivfflat + GIN + partial indexes, check constraints, 13 SQL migrations.
Durable workflow orchestrationBackend & APIStrong12 workflows / 10 steps on Workflow DevKit v4: fatal-vs-backoff classification, idempotent email steps, cron-level retry.
Funnels, cohorts & dashboardsAnalyticsStrongEight funnels with pinned insight IDs, documented dashboards and cohorts — and this repo owns the contract the other apps implement.
Git worktree & protected-branch flowInfra & DevOpsStrongmain is PR-only, one worktree per task, squash merges, one agent per worktree so parallel work cannot collide.
GitHub Actions CIInfra & DevOpsStrongPR-gated workflow with cancel-in-progress, cached installs, typecheck/test/lint plus Playwright e2e.
Guardrails & structured outputAI / LLM EngineeringStrongPinned enums plus a guard stack (meta-language, price-in-prose, PII) that throws and forces a retry rather than shipping a bad object.
Idempotency & exactly-onceBackend & APIStrongPending-before-write with ON CONFLICT DO NOTHING, sha256 keys, webhook stamp-claim, payment dedupe on unique violation.
Idempotent resumable ETLData & PostgresStrongDry-run by default, JSON checkpoints, SIGINT-safe saves, transient-vs-durable failure classification.
LLM pipelines & dedupeAI / LLM EngineeringStrongTwo-step analyzer → learning pipeline, embed + cosine dedupe at 0.92, every LLM enum validated server-side.
LLM tool design & typed tool I/OAI / LLM EngineeringStrongThe retrieval tool hard-codes its audience so an agent cannot ask for the wrong one; the thread tool strips fields owned by another service.
LLM tools over HogQLAnalyticsStrongA safelisted metric catalogue with injection-safe raw HogQL escaping and an automatic LIMIT, exposed through MCP and an agent tool.
Migration safety & data repairArchitectureStrongA repair pass classifying every row OK / FIX / REVIEW by re-deriving from the source system, and refusing to touch the won-order set.
Multi-tenant data modellingArchitectureStrongGIN-indexed agent arrays with caller = ANY(...) membership, widened by an explicit share operation.
Neon serverless & Data APIData & PostgresStrongTuned serverless pools, PostgREST client with per-user JWT and auth.user_id() policies.
Node.js (ESM, streams)LanguagesStrongESM scripts with AbortSignal.timeout, SIGINT-safe checkpointing, tooling that runs on native type stripping.
OpenAI embeddingsAI / LLM EngineeringStrongtext-embedding-3-small at 1536 dimensions, recomputed only when a content hash or the model changes — so token cost stays flat.
pgvectorData & PostgresStrongvector(1536) columns with vector_cosine_ops, raw cosine search, 0.92 dedupe threshold.
Playwright E2ETesting & QualityStrongA smoke suite asserting 200s, canonicals and no stray noindex on raw HTML, sitemap agreement and hard 404s — run on every PR.
pnpm workspacesInfra & DevOpsStrongworkspace:* conventions across packages, frozen-lockfile CI, per-app tasks via --filter.
Privacy engineeringAnalyticsStrongBanded counts, email only as distinct_id, name-leak scrubber, consent versioning, session-replay masking.
Production alerting & observabilityInfra & DevOpsStrongThree-layer throttle, fingerprint folding, deploy/commit/region embedded — and it never throws.
RAG & semantic searchAI / LLM EngineeringStrongpgvector cosine with k*2 over-fetch, custom rerank (similarity 0.8 + log recency 0.2), citation extraction.
React 19 + React CompilerFrontendStrongA 1,466-line chat panel with memoised hooks under the compiler, clean server/client split.
Reconciliation / self-healing systemsArchitectureStrongPredicate-gated idempotent steps, at-most-once email keyed on a sent_at null check, terminal-error classifier.
Repository & adapter seamsArchitectureStrongA repository interface with a getRepository() swap between an in-memory mock and Neon on an env flag, sharing one pure compute core.
REST & OAuth2 integrationBackend & APIStrongAn OAuth2 client-credentials client with token caching and a dev/prod endpoint selector, plus SendGrid and Static Maps.
Sanity, GROQ & content modellingData & PostgresStrongA ~1,200-line query library and a 522-line document schema with cross-field custom validation rules.
SEO metadata, sitemaps & feedsFrontendStrongOne central seo.ts behind generateMetadata; sitemap.xml, atom feeds and llms.txt all generated from CMS queries at build time.
Service-to-service resilienceBackend & APIStrongTwo deliberate cadences for the same call — hot path fire-and-forget, cold path throw-to-retry — degrading gracefully when the far side is down.
Skill versioning & knowledge platformsAI / LLM EngineeringStrongA publish step writing SHA256 manifests to private blob storage; approval merges markdown sections into immutable versions agents load at runtime.
Stripe subscriptionsBackend & APIStrongSigned webhook with a processed-events table, per-org upgrade/downgrade, invoice trigger.
Structured data & JSON-LDFrontendStrongA JSON-LD @graph combining four schema types on one route type, plus a custom validator that checks the graph rather than trusting it.
Tailwind CSS 4FrontendStrongCSS-first @theme tokens across projects; 26 self-authored style-system demos.
Transactional emailBackend & APIStrongA hand-built HTML email component system with a dev-redirect guard, and a fail-soft provider client that never takes a request down with it.
TurborepoInfra & DevOpsStrongdependsOn ^build pipelines with scoped outputs and ~74 declared build env vars — undeclared ones get stripped from the cache key silently.
Unit testing (Vitest)Testing & QualityStrong119+ colocated tests; the modules that matter are kept import-free specifically so they stay testable.
Vercel AI SDK v6AI / LLM EngineeringStrongcreateUIMessageStreamResponse bridge, useChat over a custom transport, hand-written v6 tool-part parsers.
Vercel deployment & CronInfra & DevOpsStrongFive cron schedules driving reconciliation sweeps and lead retries through a cron → route → workflow.start() pattern.
Webhook design & constant-time authBackend & APIStrongSigned handlers verified with timingSafeEqual behind a length guard, then stamp-claimed so a replay is a no-op.
Zod boundary validationBackend & APIStrongsuperRefine on the lead request schema, enums pinned to the CMS, validation at every boundary rather than once at the edge.
Accessible drag & drop (dnd-kit)FrontendWorkingDndContext + sortable lists with both pointer and keyboard sensors, so reordering works without a mouse.
AstroFrontendWorkingAstro 5/6/7 across three projects, one of them live on Netlify.
Cypress E2ETesting & QualityWorkingTODO — which repo, and what the suite actually asserts.
EU VAT invoicingBackend & APIWorkingA REST client written from scratch: reverse charge for EU B2B, the Romanian small-business article, and the VAT mode each case needs.
Feature flags & experimentationAnalyticsWorkingA flag gating an entire capture module, experiment variants read from config, and a dashboard tracking flag usage.
Image processing & map generationData & PostgresWorkingsharp turning SVG markers into PNGs; geodesic static maps in brand colours with an auto-closed loop.
In-app agents (AG-UI runtime)AI / LLM EngineeringWorkingAn AG-UI runtime wired to Mastra agents inside a multi-tenant SaaS, with plan gating in front of it.
Motion (GSAP, Lenis, ScrollTrigger)FrontendWorkingA 46-demo internal guide: 26 style systems, 10 scroll studies, 10 UX patterns.
Multi-agent orchestration & tiered memoryAI / LLM EngineeringWorkingA five-advisor council with anonymous peer review and a chairman pass; a knowledge base with raw → episodic → semantic → procedural tiers.
Performance benchmarkingTesting & QualityWorkingA bench harness isolating embedding time from vector-SQL time over N=20 with warmup and min/p50/p95.
Product strategy & monetisation designArchitectureWorkingWedge and pricing documents, stickiness-hook design, and written planning for two solo products.
Snapshot testingTesting & QualityWorkingSnapshots of generated output across six framework targets, behind an explicit fixture-update flow.
Supabase (Postgres, Auth, RLS)Data & PostgresWorkingServer/client/admin clients, token refresh in middleware, plan limits enforced on an org/workspace RLS model.
Visual editors & game devFrontendFamiliarA Puck visual-editor proof of concept in one SaaS, and a browser game on Phaser 3 + Vite against a portal SDK.

Showing 70 of 70. Every row has evidence in a repository — the level is anchored to what the code demonstrates, not to what would look good.

FAQ

Before you check the overlap

Four questions this list raises, including the one where the answer is no.

My stack isn't on this page. Is that a no?

Usually not. This is a list of what I have shipped with, not a list of what I am willing to touch. Whether “I'll pick it up” is a real answer or a glib one depends entirely on how far your stack sits from something on this page.

A different framework in the same language, or a different managed Postgres, is a few days of ramp and I would not charge you for the learning. A different runtime, a different paradigm, or an area named as a gap is a real cost and I will quote it as one rather than discovering it later.

What do the levels on each row actually mean?

They are anchored to what the code demonstrates, not to how confident I feel. Expert means I have made and defended non-obvious decisions in it and can tell you what I got wrong. Strong means shipped and maintained in production. Working and familiar mean exactly what they sound like, and they stay on the page rather than being quietly promoted or dropped.

The evidence column is the check on all of it: each row names the thing in a repository that demonstrates the claim, so a level with a thin evidence line is visibly a thin claim.

Do you work in Python?

Not as the main language, and I would rather be direct about it than sell you a compromise. This is a TypeScript stack end to end — the agents, the tools, the workflows, the schema and the front end all in one language, which is a large part of why one person can hold the whole system.

If your AI work is genuinely Python-shaped — training, notebooks, a data-science team you need to fit into — I am the wrong hire and you should be told that early rather than politely late.

Why publish the things you're only “familiar” with at all?

Because a page where everything reads as expert tells you nothing, and you already know it is not true. The mixed levels are what make the top of the list worth believing.

It also saves a conversation. If the row you care about says working, you can ask about it directly instead of finding out on a call three emails from now.

Overlap?

If your stack is on this page, we'll skip the ramp-up

Tell me what you're building and which of these it runs on. If the honest answer is that I'm the wrong fit, you'll get that in the reply rather than after a discovery call.