All Projects

Work

7Projects
6Live
19Stacks
Forge BI
Full-Stack Developer & Designer2024
Personal Product
Live · in dev
AI / Fintech01

Forge BI

AI-powered business intelligence for startups. Financial insights via natural language.

Plaid pulls transaction data into a Prisma-modeled financial schema (accounts, transactions, derived metrics). The AI Chat layer is a Vercel AI SDK orchestration that translates natural-language questions into typed queries over that schema, then renders charts/tables inline. Goals are background-evaluated against the same data — no manual reconciliation step. Eight years of healthcare finance taught me which questions founders actually ask, so the schema and prompt scaffolding are tuned for variance analysis and runway over generic BI.

Next.jsTypeScriptPrismaAI SDKPlaid
  • 1 schema, 3 surfacesPlaid bank sync, AI chat, and auto-tracked goals all share one Prisma data model. No reporting DB, no ETL.
  • 8 yrs domain DNATables named in analyst language (variance, runway, burn) so the AI reasons in the user's vocabulary, not generic BI.
Read full case study
Chicknz
Founder / Full-Stack Engineer2026
Personal Product
Live · in dev
AI / Multi-tenant SaaS02

Chicknz

Multi-tenant, AI-native family management. Chores, rewards, and skill trees for kids 4–16.

One Next.js codebase, four UI tiers. CSS custom properties (`--tap-target`, `--icon-size`, `--text-density`) and CVA variants drive age-adaptive components — no per-age fork. Prisma schema is multi-tenant by `familyId`; every query is scoped at the data layer, never relying on client filtering. AI lives behind a service boundary (`packages/ai`) that takes structured intent ("create chore", "summarize week") rather than free chat — the AI is background intelligence, not a chatbot.

Next.jsTypeScriptPrismaBetter AuthAI SDKBunAbly
  • 4 UI tiers, 1 component libraryCSS custom properties + CVA variants drive little/kid/tween/teen tap targets, density, and reading level. No per-age fork.
  • Multi-tenant at the query layerEvery Prisma query and AI call scoped by familyId in extension code — a missed scope is a type error, not a security incident.
Read full case study
Cantrip
Founder / Full-Stack Engineer2026
Personal Product
Live · in dev
AI / Platform03

Cantrip

Multi-tenant AI Dungeon Master platform. Publishers ship rulesets, players play with an AI DM.

Three layers: an extractable rules engine SDK (the `cantrip-sdk` package — pure functions, no React), a tenant-isolated session runtime (Next.js App Router with oRPC procedures scoped by `tenantId`), and an AI orchestrator that's bound to the active ruleset's grammar via structured tool definitions (Vercel AI SDK + Anthropic). The same SDK powers both publisher authoring (validates rulesets at write time) and the session runtime (executes them at play time) — no schema drift between authoring and play.

Next.jsTypeScriptPrismaoRPCBetter AuthAI SDKAnthropic
  • 1 rules SDK, 2 surfacescantrip-sdk validates rulesets at authoring time and executes them at play time. No schema drift between editor and runtime.
  • AI bound to typed grammarDM tools defined per-ruleset via Vercel AI SDK structured tools, so the AI stays in-system instead of hallucinating mechanics.
Read full case study
LHBK Web
Software Engineer2024
Little Haiti BK
Live · in dev
Non-Profit / Operations04

LHBK Web

Operations platform for Brooklyn Haitian non-profit — payroll, BID property CRM, form builder.

Single Next.js App Router platform replacing what would otherwise be five SaaS subscriptions. Better Auth handles staff sign-in (with role-based gates between staff and community-facing surfaces). Prisma schema unifies properties (BID), people (staff + members), forms (schema-driven), and time entries. Paychex's API integration runs on a server action that pre-validates timesheets against budget rules before submission, so payroll exceptions surface before anyone files them.

Next.jsTypeScriptPrismaBetter AuthMapboxPaychex API
  • 5 SaaS tools → 1 platformHRIS, CRM, forms, mapping, and CMS consolidated into one Next.js app a small ops team can maintain themselves.
  • Paychex API liveSubmitted hours flow straight from staff timesheets into payroll, pre-validated against budget rules so exceptions surface before submission.
Read full case study
Good Call Technologies
Software Engineer2024
Good Call Technology
Live
Legal Tech / Telecom05

Good Call Technologies

Twilio-based voice routing connecting people in custody with attorneys 24/7.

Twilio TwiML routes incoming precinct calls into a Postgres-backed queue. A Node.js queue manager assigns calls to available operators based on schedule + capacity; the operator dashboard subscribes via Server-Sent Events for live state and uses Twilio's JS SDK for hold/transfer/conference. Failover is layered — if no operator is available, calls escalate through a configured fallback chain (different operator pools, on-call attorneys, voicemail). Call history is logged for compliance reporting.

Next.jsTypeScriptTwilioNode.jsPostgreSQL
  • 24/7 attorney routing liveTwilio TwiML + Postgres-backed queue + Node.js queue manager handle precinct call escalation from operator pools to on-call attorneys to voicemail.
  • Live call controls in browserOperator dashboard subscribes via SSE for queue state and uses Twilio's JS SDK for hold, transfer, and conference. No native client required.
Read full case study
High Tide Capital
Software Engineer2024
HiTide Capital
Live
Lending / Underwriting06

High Tide Capital

Modern underwriting platform with borrower validation and DocuSign e-signature flow.

Borrower-facing funnel (intake → identity → eligibility → contract) is a Next.js multi-step form with state persisted in Postgres at each step (so a borrower can resume a session). DocuSign integration runs through their webhook flow — the platform issues envelopes, listens for status changes, and updates loan state via a state machine that mirrors the underwriting team's actual process. Underwriter dashboards read from the same Prisma schema; no reporting database, no ETL.

Next.jsTypeScriptPostgreSQLPrismaDocuSign
  • Email + spreadsheets → 1 platformManual borrower-doc collection and offline contracts replaced with a multi-step intake funnel persisted in Postgres after each step.
  • DocuSign live, reconciledEnvelope flow runs on DocuSign's webhook with idempotent state transitions plus a reconciliation cron, catching the misses their docs glossed over.
Read full case study
Zairoo
Game Designer & Engineer2025
Personal Product
In development
Game Design / Bot Infrastructure07

Zairoo

Original Afrocentric TTRPG system. Discord bot + flagship ruleset on Cantrip.

One canonical rules layer (`packages/rules`) feeds three surfaces: the Discord bot (Hono + oRPC API + discord.js), the card-renderer package (HTML→PNG via Playwright for printable / shareable cards), and a Cantrip ruleset registration. Any rules change ships to all three with a single deploy. The bot is on Railway because that's where it runs cheapest as a long-lived process; web/card surfaces deploy on Vercel.

HonooRPCdiscord.jsNode.jsRailway
  • 1 rules engine, 3 surfacesDiscord bot (Hono + discord.js on Railway), HTML→PNG card renderer, and Cantrip ruleset all read from packages/rules. One rules change ships everywhere.
  • Game designed first, shipped as software day oneFive-stat spread (Grit / Vision / Soul / Vibe / Flow) and Fate Path progression playtested before being implemented as a typed rules package.
Read full case study