Shipped solo, used for real.

Products I took from a problem to real use, alone: picked the problem, designed the answer, built it, shipped it, and kept improving it in production.

HyperDraft landing page: "Sketch it in a sentence. Watch it get real." beside a hand-drawn wireframe that builds into a page

HyperDraft

Describe a UI, watch it build live.

Open HyperDraft

The problem

AI UI builders are slow and unpredictable: every message reruns the model, and one small edit can rewrite the whole page.

What I shipped

Describe a UI in plain language and watch it get built from real component libraries. A ~1s structured decision on every message routes the work, so the LLM only runs when it is needed.

  • TypeSafe Jev decides on every message: new page or edit, which elements are in scope, option values, and change type.
  • Deterministic edits run in code with no LLM call. Scoped edits only see the elements in scope, and code rejects anything outside it.
  • New pages are planned as streamed JSON; each section is built by its own LLM call, 4 at a time, and patches stream into a live preview.
  • Production hardening: model fallback chain, per-visitor rate limits, request validation, sanitized AI-written links.

Stack React 19, Bun, TypeSafe Jev, json-render, shadcn

CCTP Bridge: a transfer form moving USDC from Ethereum to Base, with fast and standard modes

CCTP Bridge

Native USDC across Stellar and EVM chains.

Open CCTP Bridge

The problem

Moving dollars between chains usually means wrapped tokens, opaque fees, and no idea where your transfer is.

What I shipped

Cross-chain USDC transfers on Circle's CCTP V2 burn-and-mint protocol, across Stellar/Soroban to EVM and EVM to EVM, with live fee quotes and a step-by-step approve, burn, attest, mint rail.

  • Wallet connections for each ecosystem, built with viem and the Stellar SDK.
  • Fast and standard transfer modes with live Iris fee quotes.
  • Every transfer is tracked through approve, burn, attestation, and mint.

Stack React 19, Vite, viem, Stellar SDK, Tailwind

Zap on a phone: a dinner receipt split three ways, with the line "Dinners, rent, trips, split with friends in one calm place"

Zap

Realtime expense splitting for groups and trips.

Open Zap

The problem

Shared expenses fall apart when a group spans currencies and nobody trusts the running balance.

What I shipped

A live multi-currency expense-splitting PWA on Convex with groups, settlements, recurring expenses, analytics, and web push.

  • Balances are materialized snapshots. An invariant check re-derives every snapshot from the raw ledger, so a mutation that forgets to update balances fails in tests.
  • End-to-end type safety: client types are derived from server return contracts, with no unchecked casts.

Stack React 19, Convex, PWA, Web Push, Tailwind

fig. 04 / tally rest
private, in use

Money ledger

Physical cash, counted note by note, across routes.

Ask for a walkthrough

The problem

Cash handled by hand gets counted, written down, and reconciled later, and the totals rarely agree.

What I shipped

A private PWA used by a few people to run their cash: operators count notes by denomination along routes, vouchers are verified against what was counted, and every excess or shortage is recorded.

  • Every entry is a count of notes per denomination, ₹500 down to ₹1. Balances are derived from the counts, never typed in.
  • Vouchers are verified against counted cash, and any excess or shortage is recorded instead of smoothed over.
  • Firestore security rules check server-side that the denomination counts add up to the amount, so a bad write is rejected.
  • Separate admin and operator roles. Installable and works offline.

Stack React 19, Firebase, Firestore rules, PWA, Zustand, Tailwind