Epiphany Lab / web and mobile

Five products, built solo and shipped.

From first commit to store approval. All five are live right now, all five on the web. famula, Tavo and Tonecraft are on the App Store and Google Play. cura, the newest, has its apps in App Store review. Every one of them is open to try.

5products live
6app store listings
2native platforms
10+yrs in software
Selected work

Every link below opens a running product.

famula

Your partner who works while you are away · iOS, Android, Web

famula is your partner for the everyday things that quietly eat your time and money. Tell it what you would like looked after, connect an account, and it gets on with it, even while you are away.

It notices what you would want to know before you do: a bill that crept up, a subscription you stopped using, a refund that never came through. Then it follows through, and everything it does is written down as it happens, so you can see what it did, or watch while it works.

A few things famula does for you

  • Finds a cheaper phone, internet or insurance plan, and helps you switch
  • Tells you when a bill goes up, and finds the subscriptions you stopped using
  • Plans the week's dinners and fills the grocery cart
  • Chases a refund or a disputed charge until it is settled
  • Helps you buy a house, from the search to the keys
  • Watches something you want and tells you when it hits your price
  • Reads a bill or letter you share, and reminds you before anything is due
  • Teaches you anything you have always wanted to learn, or talks with you like a coach
famula's welcome: Hi, I'm famula. I work while you are away. A conversation with famula: a cancelled subscription, a question about the refund, and famula reporting the refund secured
cura app icon

cura

A place for what's on your mind · Web, with iPhone, iPad, Mac and Apple Watch in store review

cura is a place for what is on your mind. Speak a thought or type it, on whatever is nearest: your phone, your watch, your computer or a browser. cura keeps it, and you find it again in order.

What you say arrives written, punctuated and tidied, in your own words. Each note is sorted, and the dates and tasks inside it come forward on their own. Every earlier version is kept, so nothing you write is lost. A note you mark private is encrypted on your device and readable only by you.

A few things cura does for you

  • Writes out a voice note on the device that recorded it, then tidies it into punctuated writing
  • Sorts your notes and brings forward the dates and tasks inside them
  • Finds a note by what it means, not only by the words in it
  • Keeps every version of a note, so you can restore any of them
  • Encrypts a private note on your device, so no server and no model can read it
  • Shares a note with a person or a team, who can edit it only if you let them
  • Exports everything as plain Markdown whenever you ask
cura's sign-in screen: the cura wordmark, an email field with Send a code, and Continue with Apple and Continue with Google
Tavo app icon

Tavo

Real-time city discovery · iOS, Android, Web

What is alive near you at the hour you open it: places open now, events under way or about to start, and every New York neighbourhood a tap away. No sign-in. Places are ranked on what is true of them right now, never on how many people vouch for them.

The hard part was never the map. It was making a cold-start location product feel alive in any city on the first open, which meant pulling several event sources into one schema and filling a city's events the moment someone first opens the app there. Ask Tavo answers in plain words and names only places it has just looked up.

What I built

  • Next.js on Vercel with Supabase Postgres and row-level security
  • A live event pipeline over Ticketmaster, SeatGeek, Eventbrite and New York's park and library listings, normalised into one schema
  • Google Maps and Places, with a feed scored on the hour, distance and opening hours
  • A live page for every New York neighbourhood, readable by search engines
  • An AI companion that falls through three inference providers, checked so every place it names is real
  • Native iOS and Android through Capacitor, both approved and published
  • Stripe purchases on the web, with every upgrade hidden in the native apps to stay inside store rules
Next.jsTypeScript SupabasePostgreSQL CapacitorGoogle Maps StripeVercel
Tavo home screen: Ask Tavo, Start a Vibe, and a live feed of nearby places Ask Tavo answering with a pick from the live nearby feed

StripeRescue

B2B SaaS · Stripe revenue recovery · Web

Failed payments, expired cards and silent churn cost subscription businesses real money every month. StripeRescue notices a failed payment within seconds and emails the customer in the business's own name, with a reminder at three days and a last note at seven, each one click from Stripe's own page to pay. A business can also drop its Stripe invoice export on the page and see what failed, read in the browser and never uploaded. It is in early access, attaching the Stripe account a business already bills through on request.

The interesting half is the second product inside it, Auto-Fix. For apps on Next.js or Vite with Supabase, including the ones AI builders produce, it proposes a page where customers update their card and a notice when a payment has failed, then checks the code every day so the Stripe integration stays current. Every change is proposed for review first. Two integrations, two very different trust boundaries, one onboarding that has to feel safe enough to connect both.

What I built

  • Next.js on Vercel with Supabase behind it
  • A Stripe App and one Connect webhook that sees every connected account's failed invoices
  • A three-email recovery sequence in the business's name, stopped the moment the customer pays
  • An invoice-export audit that runs entirely in the browser
  • GitHub integration that detects the repo's stack and proposes fixes, with a daily rescan
  • Two-tier subscription pricing with a 30 day free trial
Next.jsTypeScript SupabaseStripe Connect GitHub APIWebhooks Vercel
StripeRescue landing page
Tonecraft app icon

Tonecraft

AI conversation simulator · iOS, Android, Web

Rehearse a hard conversation before you have it. Describe the situation, choose your intent and tone, then rehearse six turns: at each one, read what you could say and pick from three plausible ways they might answer. You leave with a forecast of how it could go, with a stated confidence, and a closing message you can edit and send.

A different shape of problem from Tavo: no map, no third-party data, but a stateful multi-turn LLM flow that has to stay coherent across turns and degrade safely when the model does something unexpected. It ships as one container, which keeps the whole thing cheap to run and trivial to reason about.

What I built

  • React and Vite front end, FastAPI and Python back end
  • One Docker container on Fly.io with a persistent volume and an HTTP health check
  • Multi-turn LLM flow with scoring and outcome prediction
  • Guest-first: a rehearsal needs no account, then an email code or Google sign-in keeps the guest's work
  • Findable pages for common hard conversations, each one leading into a rehearsal
  • Stripe subscriptions on monthly and annual plans
  • Transactional email and Sentry error tracking
  • Native iOS and Android through Capacitor, both published
ReactVite PythonFastAPI DockerFly.io StripeOAuth
Tonecraft landing screen Tonecraft conversation setup screen
AI in production

Not "I can call an API". The parts that break.

Tavo and Tonecraft both put a language model in their critical path, which means I have spent my time on grounding, structured output, failover and testing against the real model rather than on prompt demos.

Grounding, so it stops inventing

Tavo's assistant answers over live venue data. Getting it to stop naming places that do not exist took re-injecting the candidate set on every turn, replacing free-text place names with a structured id token, dropping temperature, and matching on the last mention rather than the first. When it still drifts, it falls back to the real feed instead of guessing.

Failover across providers

One shared streaming layer fronts three inference providers and moves to the next on any non-200 or network error, so a single vendor outage does not take a feature down. Streaming is server-sent events, so the interface fills in as tokens arrive.

Multi-turn state that holds

Tonecraft simulates a six-turn conversation where each turn depends on the last, offers three plausible reactions at every turn, then forecasts the outcome with a stated confidence. The hard part is coherence across turns and degrading safely when the model returns something unexpected.

Cost control as a design constraint

Consumer apps cannot absorb frontier-model pricing per interaction. These run on small fast models with capped output, chosen per task, because the product has to stay solvent at the price the user actually pays.

Tested against the real model

Tonecraft is walked end to end against the production model every few hours: a cold arrival, setup, six turns, the outcome and the closing message. A mocked model passes where the real one drifts, so the walk uses the real one.

Knowing when not to use it

Most of what these products do is ordinary engineering. A model is used where it earns its latency and its cost, and nowhere else. StripeRescue's code changes come from fixed detectors and templates, not a model, and a person reviews every one.

Capabilities

What the work covers.

Web apps, end to end

Next.js or React, with auth, payments and a real database. Deployed, monitored, and documented down to the deploy path.

Native from a web app

An existing web app onto iOS and Android through Capacitor, then through both store reviews. Tavo and Tonecraft both went this way, and both are live on both stores.

The hard integrations

Stripe, OAuth, LLM APIs, maps, third-party data sources. The kind that has to keep working after everyone stops looking at it.

Build and release pipelines

Builds that fail, deploys nobody trusts, a release process that needs one person present. I have untangled all three.

The conversation around the code

A decade as a sales engineer, running technical evaluations with customers and exec teams as well as with the codebase.

One person, front to back

Every product on this page was built by one person: schema, API, front end, native shell, payments, store submission.

TypeScriptReactNext.js PythonFastAPINode.js PostgreSQLSupabaseDocker CapacitoriOSAndroid StripeOAuthLLM APIs VercelFly.ioSentry
Background

Ten years explaining software. Then I went and built some.

I spent a decade as a sales engineer and solutions architect at Port, Lacework, Spot.io, SignalFx and Couchbase, running technical evaluations for Fortune 500 buyers and building the demos and proofs of concept that decided them. Before that I wrote C++ and JavaScript on the mortgage-backed securities analytics team at Bloomberg.

I have sat on the other side of enough technical evaluations to know which corners get cut and which ones get found, and I write the code myself. Degrees from the University of Pennsylvania and the University of Delaware.