Hey, I'm Stefan.
I build the platforms behind discovery and recommendations, the systems that shape what gets surfaced and whether it lands, a show worth staying up for, a game someone didn't know they wanted. At Disney+ and now Epic. Experimentation and data run underneath it. On the side I build my own products zero to one, because shipping is how I figure out what's worth getting serious about. What's in flight is below.
Marquee
v0One platform for the whole event: RSVPs, schedule, photos, group chat. Built for weddings first, running live on ours this September.
stack Next.js · TypeScript · Supabase · Tailwind · Anthropic SDK · Resend · Vercel
Built this because the wedding-tech market is a junkyard and we were drowning in research tabs. Wanted to see if a single platform could carry the whole guest experience: RSVPs, schedule, photos, group chat. Shipping it for our own wedding in September is the deadline.
The live demo runs on fake events so no real guest data is exposed. The real thing is running privately for our wedding this September.
▸version history
- v0 first build. RSVPs, schedule, photos, group chat in one app. running live on our own wedding this September.
CivicSwipe
v0Strip the name off a voting record and people vote their values more honestly. That's the experiment.
stack Next.js · React · TypeScript · Tailwind · Framer Motion · Vercel Blob · Gemini image gen · Vitest · Vercel
Political apps are either rage-bait or homework. I wanted to actually test something instead of shipping another quiz. Same real voting records, shown three ways: the real politician, an attractive AI-generated face, or a cartoon animal. You swipe align or reject, and only at the very end does it unmask who you were judging and score how often you voted your own values. The bet is that the wrapper hijacks judgment, that the less identity you can see, the more honestly you vote your values. I pre-registered the cohort numbers before launch and they go live once real sessions roll in. Records are AI-generated and caveated hard. The point is the experiment, not the encyclopedia.
Voting records are AI-generated and can be wrong, the point is the experiment, not the source of truth. Two of the three identity skins are fully synthetic. We store only anonymous cohort counts: no names, no accounts, nothing personal.
▸version history
- v0 first build. the blind-values experiment: same real voting records shown under three identity skins (the actual politician, an AI-generated face, or a cartoon animal), an end-of-deck unmask and a fidelity scorecard, with anonymous cohort counters running live on Vercel Blob.
Bandolier
v0.5.0Bandit-driven stock picker. Strategies that beat the S&P stick around. The rest get killed.
stack Python · pandas · numpy · yfinance · uv · pytest · GitHub Actions · Vercel Blob
Built this to see if a portfolio could be run the way an experimentation platform runs A/B tests. Twelve strategy sleeves are arms of a multi-armed bandit; capital flows toward whatever's earning on a risk-adjusted basis, and laggards get benched. The KPI started as raw return vs the index. v0.4.0 changed the objective: beat SPY without SPY's drawdowns. The book now gives up some upside and takes way less pain on the way down, and that's the trade I wanted.
▸version history
- v0.5.0 deal flow. an activist-stakes arm off 13D filings and a merger-arb arm off real deal spreads, validated on five years of EDGAR history. backtest-only for now: the live headline stays price-based until the filing pipeline is point-in-time clean.
- v0.4.0 the cast rework. six arms became twelve sleeves, each a strategy plus a risk budget plus a mandate it cannot leave. the defensive sleeves flipped the risk profile: drawdown went from worse than SPY to 10 points better, for about 40 points of raw return. took the trade.
- v0.3.0 return-with-guardrails objective (a risk-adjusted bandit plus a hard drawdown breaker), an evolving agent population across a risk spectrum, and a live daily paper-trading track. headline reframed to the reproducible price-based core so the live number does not wobble on a scraped data source.
- v0.2.0.1 RegimeDefensive arm. real downside defense that parks in cash when the market rolls over, replacing the accidental protection a v0.1 bug had been faking.
- v0.2.0 engine rework. strategies with no signal now sit out instead of teaching the bandit fake zero returns, plus a shift timeline logging what moved between arms and whether the move paid off.
- v0.1 the alt-data arms: congressional trades (House + Senate) and Form-4 insider clusters. universe grew to 37 names, with real transaction costs baked in.
- v0 first cut. Thompson-sampling bandit over 4 price strategies, weekly rebalance, 5-year backtest. proving the allocation math before anything fancy.
Background processes.
amateur. mostly food, friends, and places I'm in. occasionally good.
view gallery →weekly jam group in Seattle. not technically good but having a great time.
a buddy throws a backyard BBQ music festival every summer. I help him run sound.
pickup when I can get on the ice. more hustle than hands.
lifelong. Donkey Kong Country 2 is the GOAT, no debate. still chasing 102%.