mn

projects

things I've designed, built, and shipped

A mix of flagship work, ventures, and open-source tools — from architecture tooling and enterprise knowledge systems to agent workflows and client platforms.

selvage

live · public

  1. your data×4
  2. normalise
  3. store
  4. rank (no LLM)×3
  5. fuse
  6. clients×3
how it works

Selvage is a thin, hybrid-searchable layer over the places team knowledge actually lives — Slack, wikis, code, and databases. Connectors normalize every source into one Postgres + pgvector table, so the same query serves a person at a CLI, an agent over MCP, or the web UI. Local-first and MIT-licensed, with embeddings running on your own CPU.

your datanormalisestorerank (no LLM)fuseclientsfolder / gitSlackany Postgrescustomconnectorconnectorsshared schemaPostgres+ pgvectorfull-textGINvectorHNSWrare-termIDFRRF k=60recency decaycross-encoderCLIMCP serverweb UI
Selvage retrieval: connectors normalise every source into one Postgres + pgvector table; three ranked lists (full-text, vector, rare-term) fuse with RRF, decay by recency, and are reranked by a local cross-encoder before reaching the CLI, MCP server, or web UI.

why three signals instead of one

signalexact tokenparaphraserare term
full-text (GIN)
vector (HNSW)
rare-term (IDF)
all three, fused by RRF

Vector search alone misses an exact error code; full-text alone misses a paraphrase. RRF needs only ranks, so the three lists fuse without their scores having to be comparable.

source: selvage README

TypeScript · Postgres + pgvector · MCP · ONNX (local models)

sequence

building · private

  1. design
  2. spec
  3. build
  4. guard
  5. ci
how it works

Sequence turns system architecture into an infinite canvas you author as an archgraph.json. An agent scaffolds the repo from the graph, sequence scan reads the code back into it, and sequence diff fails CI the moment the implementation drifts from the spec — a wrong HTTP method, path, or database table. Built as a TypeScript pnpm monorepo spanning a CLI, a web canvas, and a desktop app.

designspecbuildguardcidraw systemas a grapharchgraph.jsonagent scaffoldsthe reposequence scanreads code backdiff fails CIon drift
Sequence: you draw the system as a graph, that graph becomes archgraph.json, an agent scaffolds the repo from it, and a CI check fails the build the moment the code drifts from the design.

TypeScript · Node.js · pnpm monorepo · Electron · CLI

private — no public link

schwai

live · private

  1. company content×2
  2. ingest
  3. store×2
  4. retrieve
  5. ask in plain english
how it works

Project Brain is SCHWAI’s internal enterprise knowledge base, built to improve itself through feedback loops from live usage — open-source models fine-tuned on the organization’s own knowledge so the company operates at higher efficiency over time. It’s one app in a larger multi-app platform I build across schwai.com on FastAPI, React, Supabase, Redis, and Cloudflare Stream.

company contentingeststoreretrieveask in plain englishbooks workereverythingelse producedbackgroundworkersPostgres+ SupabaseRedisfast pathRAG over thecompany corpusFastAPI+ React
Project Brain: background workers pull the company's own content into Postgres and Supabase with Redis on the fast path, retrieval runs over that corpus with open-source models fine-tuned on top, and the answers surface through a FastAPI backend behind a React frontend.

FastAPI · React · Supabase · Redis · Cloudflare Stream · Fine-tuning

web-vid

live · public

  1. your repo×2
  2. plan
  3. build
  4. check
  5. render
how it works

web-vid is a Claude Code plugin that recreates a website as a promo video from the site’s own design tokens and copy — deterministic React scenes rendered to MP4, not a screen recording. An adversarial fidelity pass forbids invented text and colors, so the video stays true to the real product.

your repoplanbuildcheckrenderreal designtokensreal copyfreezetimelineReact scenes(Remotion)adversarialfidelity passMP416:9 / 9:16 / 1:1
web-vid: the promo is a build artifact of the repo — real design tokens and real copy become React scenes, an adversarial pass checks every word against source, and Remotion renders an MP4 that can be re-rendered instead of re-shot.

Claude Code plugin · Remotion · React · TypeScript

revenue-squad

live · public

  1. research
  2. prove it×3
  3. score
  4. pipeline
  5. draft (files)×2
  6. human gate
how it works

revenue-squad is a Python CLI that runs a solo operator’s full outbound B2B workflow — prospect research, cold email, and proposal drafting — by driving the Claude CLI headless through a set of Markdown skills. It never invents a prospect fact: emails are MX-checked and every claim traces back to an evidence URL, enforced at the tool boundary.

researchprove itscorepipelinedraft (files)human gatefetchprospect siteson-pageemail proofMX checkblocklistlead score0–10 rubricpipeline.csvNotionSupabase3-touch emailday 1 / 3 / 7proposalfrom call notessquadmark-sent
revenue-squad: research finds prospects and proves every email against an on-page source, scoring feeds a CSV/Notion/Supabase pipeline, and drafts stay as files — mark-sent is the only human action that changes state.

pokerly

building · private

Pokerly is a production full-stack app I co-founded and shipped end to end in two months — a React front end, a Node.js back end, and REST APIs, with integrated AI/LLM assistance and content generation. Features were iterated directly on user feedback.

React · Node.js · REST APIs · LLM

private — no public link

localleadfinder

live · public

  1. input
  2. geocode
  3. search
  4. filter×2
  5. export×2
how it works

localleadfinder is a Python CLI and MCP server that pulls verified local-business contact data through the official Google Places API (New) — ToS-compliant, with no scraping. It runs geocode to text search to pagination to CSV/JSON, with great-circle radius filtering to keep results inside the target area.

inputgeocodesearchfilterexportlocation+ categoryGeocoding API→ lat / lngPlaces APItext search+ field maskpaginatemax 60haversineradius dropCSV / JSONterminalpreview
localleadfinder: one geocode plus three Places API search requests return up to 60 businesses with phone and website inline; results outside the radius are dropped by great-circle distance, and a missing field is left empty rather than guessed.

why it is cheap to run

API requests for one 60-result run

  • legacy per-place lookup60+
  • this (field mask)4

The new Text Search returns phone and website inline via X-Goog-FieldMask, so no per-place enrichment call is needed.

source: localleadfinder README

Python · MCP server · Google Places API · CLI

socialsweep

live · public

  1. link
  2. fetch
  3. transcribe×2
  4. summarise
  5. remember
how it works

socialsweep is a Claude Code plugin that takes any Instagram, YouTube, TikTok, or podcast link and produces a transcript, then a summary with takeaways, saved to persistent memory with source attribution. It stays free and local — using platform captions or local Whisper — and bootstraps yt-dlp, ffmpeg, and faster-whisper into an isolated virtual environment.

linkfetchtranscribesummariserememberIG / YouTubeTikTok / Xpodcastyt-dlpcaptions(instant)Whisperlocal, free3 sentences5 takeawaystagged memory+ attribution
socialsweep: any media link is fetched with yt-dlp, transcribed from platform captions when they exist or local Whisper when they do not, summarised by the model already in the session, and stored as durable agent memory with creator attribution.

Claude Code plugin · Python · Whisper · yt-dlp

market-research-skill

live · public

  1. input
  2. search
  3. record
  4. data
  5. render×3
how it works

market-research-skill is a Claude Skill that maps a company’s competitive landscape into a markdown report — a feature comparison matrix plus a Mermaid product-maturity roadmap — with every claim source-linked. It’s open source under the MIT license.

inputsearchrecorddatarendercompany+ categoryweb search3–5 rivalspositioning+ source URLresearch_data.jsonreport.mdcomparisontable.mdroadmap.mmd
market-research: live web search selects 3–5 direct competitors, every claim is recorded with a source URL into structured JSON, and a bundled script validates it and renders the comparison table and the Mermaid maturity roadmap.

gamecam

building · public

gamecam is no-signup WebRTC video chat with strangers where the icebreaker is a gamebox: 8-Ball Pool, Connect 4, Wordle Race, and Hangman, all built from scratch, plus text chat, skip matchmaking, and invite links. It runs as a single Node process with no database.

medical-intake-ai

live · private

A client platform that runs medical intake as an AI-led questionnaire: admin-issued ticketed links open a pre-qualification step, then a checklist-based AI interview for each family member, with binary gates and AI follow-up questions feeding a staged admin workflow. Built on React and TanStack with a FastAPI and PostgreSQL back end and Azure OpenAI.