Selected work

Things we've designed, built, and shipped.

A curated look at recent Animora Labs work: products of our own, a tiered sitter-coordination app in pre-alpha, and a favorite client build, designed, built, and run end to end. Most client and internal projects stay private, and we're happy to walk you through more on a call.

Live · Web, iOS & Android

PickSlip

An owned product: a sports pick’em platform for private pools. Friends, coworkers, and leagues make weekly picks across the NFL, college football and basketball, soccer, and more, with live odds, automatic scoring, and running standings. Free to play, with a Pro tier for deeper stats and commissioner tools.

🏈

Pools & leagues

Private pools with invites, commissioner controls, weekly deadlines, and season-long standings.

📡

Live odds & scoring

Scheduled ingestion from a live odds feed, with picks locked at kickoff and results graded automatically.

📱

One codebase, three targets

Installable PWA on the web plus native iOS and Android builds from the same React app.

The challenge

  • Make running a pick’em pool effortless: no spreadsheets, no manual scoring
  • Support many sports and leagues without forking the app per sport
  • Keep picks honest: hard deadlines, no edits after lock
  • Stay free to play while supporting a paid Pro tier
  • Ship to the web and both app stores without a second codebase

What we built

  • A React and Vite app served from Cloudflare’s edge network
  • A sport and league toggle architecture so new sports are configuration, not new code
  • Scheduled workers that pull odds and results and grade picks automatically
  • Stripe subscriptions with monthly and annual plans and trial handling
  • Capacitor wrappers producing native iOS and Android builds from the same source

Stack & approach

  • React, Vite, and React Router with a PWA service worker
  • Hono API routes on Cloudflare Pages Functions
  • Cloudflare D1 with versioned, reviewed SQL migrations
  • Stripe checkout plus webhook-driven entitlement flips
  • Full free-and-Pro smoke pass before every release
Multi
Sports & leagues supported
3
Web, iOS, Android
Auto
Odds, scoring, standings
Edge
Served from Cloudflare
Live · 3 games shipped

Franchise GM

An owned product: a suite of three browser-based sports "general manager" simulation games, Gridiron GM (football), Hoops GM (basketball), and Diamond GM (baseball), tied together by one account, one subscription, and one cloud-save system.

🏈

Gridiron GM

32 teams, 53-man rosters, structured contracts and dead cap, the draft, scheme fits, and snap-by-snap live play-calling.

🏀

Hoops GM

30 teams, 82-game seasons, soft cap and luxury tax, the draft lottery, best-of-7 series, and rotations.

⚾

Diamond GM

30 teams, 162 games, the farm system, arbitration and free agency, lineups, rotations, and a pennant race.

The challenge

  • Build a deep, replayable franchise sim that runs entirely in the browser
  • Reuse one engine architecture across three different sports
  • Add accounts, cloud saves, and paid tiers without a heavy backend
  • Ship free-to-play, monetize fairly with a single unlock

What we built

  • Dependency-free single-file HTML apps, no framework, no build step
  • A DOM-free simulation engine (draft, trades, free agency, and offseason) testable in Node
  • Shared account hub with cross-subdomain sign-in
  • Supabase auth and Postgres with row-level security enforcing save limits in SQL
  • Stripe checkout driving a one-time $5 Pro unlock shared across all games

Stack & approach

  • Vanilla JS, seeded RNG for reproducible sims
  • Supabase (Postgres, Auth, RLS, and Edge Functions)
  • Stripe payment links plus webhook tier flips
  • Netlify hosting, Capacitor-ready for future mobile wraps
  • Automated engine and UI smoke tests before every deploy
3
Sports, one engine
1
Login across all games
$5
One-time Pro unlock
0
Framework dependencies
Private beta · Access by request

TrueWealth

An owned product: a financial planning platform for independent advisors offering Monte Carlo retirement projections, investment and insurance modeling, cash-flow planning, and client-ready reporting, built on a modern type-safe stack with row-level security from day one.

🎲

Monte Carlo engine

Thousands of simulated retirement paths, rendered as fan charts an advisor can actually explain to a client.

📊

Whole-household modeling

Accounts, holdings, income, expenses, goals, and insurance policies modeled relationally, not bolted on.

📄

Client-ready output

Generated PDF deliverables so the analysis leaves the app looking like advice, not a data dump.

The challenge

  • Give independent advisors planning software they actually own and control
  • Model a full household: accounts, holdings, income, expenses, insurance, and goals
  • Run credible Monte Carlo projections fast enough to use live in a client meeting
  • Handle regulated client data with real access controls, not good intentions
  • Produce output a client can read without an advisor narrating it

What we built

  • A Next.js App Router application in end-to-end TypeScript
  • A relational client data model: households, accounts, holdings, policies, and goals
  • A simulation engine driving projection fan charts and cash-flow views
  • Postgres row-level security enforcing per-advisor data isolation in the database
  • Server-side PDF generation for client-ready planning deliverables

Stack & approach

  • Next.js 14, React, TypeScript, and Tailwind
  • Supabase (Postgres, Auth, Storage, and RLS)
  • tRPC for type-safe calls with no hand-written API contracts
  • Recharts for projections, and Zod for validation at every boundary
  • SOC 2 readiness work tracked alongside the build, not after it
Beta
In private testing
RLS
Isolation at the database
E2E
Type-safe, client to server
PDF
Client-ready deliverables
Pre-alpha · Demo live

SitterBranch

An owned product: tiered babysitting and pet-sitting coordination for family and friends. A parent posts a sit and the people closest to them get notified first. If nobody in that tier can take it, the offer escalates outward on its own, with no group text and no tracking who's already been asked.

🌳

Tiered escalation

Tier 1 gets notified first. If everyone declines or the round times out, the offer moves outward on its own, with no group text and no manual re-asking.

🏠

Households, not people

Grandma and Grandpa share one sitter identity with separate logins. Every household is both a family that posts sits and a sitter that takes them.

🔒

Privacy by design

The wifi password and door code are visible only to the sitter who took the job. Kids and pets are identified by first name only, and nothing is ever sold.

The challenge

  • Replace the group-text scramble with a system that asks the right people first
  • Model households, not individuals, since couples and siblings share sitting duties
  • Escalate offers automatically without leaving a parent waiting on a no-reply
  • Keep sensitive details (addresses, door codes, and kids' names) gated to whoever actually took the job
  • Prove the escalation rules once and run them identically on web and mobile

What we built

  • A pure-TypeScript escalation engine (tier resolution, timeouts, and entitlements) covered by 53 tests
  • Round timeouts that scale with lead time: 24 hours for a sit three weeks out, 45 minutes for tomorrow
  • A backup-and-release flow, where sitters commit with a notice window and are auto-released as the date closes in
  • A "renotify me" opt-in so a decline isn't final if every tier gets exhausted
  • A Supabase data model (households, tiers, sits, invitations, and assignments) with row-level security throughout

Stack & approach

  • A framework-agnostic TypeScript core package with no platform dependencies
  • Web demo on Vite and React, running the real engine live
  • Mobile app on Expo (React Native), Supabase-backed
  • Supabase Postgres with RLS migrations
  • An automated test suite proving each escalation rule before either app ships it
53
Escalation-engine tests
1
Shared core, two apps
Auto
Escalation & backup release
Pre-alpha
Core built & tested
Live · Client build

Logan Wheeler Financial Planning

A full site rebuild for an independent financial advisor, migrated off Wix onto a fast, dependency-free static build with complete regulatory-disclosure parity (FINRA BrokerCheck, SIPC, and Form CRS), a private gated client portal, and Max: a custom AI concierge built into the portal and wired to a real Claude-powered assistant.

🖥️

Wix to static rebuild

Hand-built HTML and CSS with zero framework or build step, matched image-for-image to the live site to preserve compliance sign-off.

🔒

Gated client portal

A private, unlisted portal with a document vault and trusted-partner directory, reachable by direct link only, fully separate from the compliance-reviewed public site.

🤖

Max, the AI concierge

A custom assistant embedded in the portal, wired to a real Claude-based backend, giving clients a fast way to get answers and find what they need.

The challenge

  • Rebuild a Wix-hosted site off the platform without losing SEO or compliance sign-off
  • Preserve every required disclosure, badge, and regulatory link exactly
  • Add a private client portal without touching the compliance-reviewed public pages
  • Bring in a modern AI assistant without it ever appearing to give financial advice

What we built

  • Seven static pages generated from a small build script, matched image-for-image to the live Wix site
  • Full regulatory footer, FINRA BrokerCheck badge, and Form CRS link preserved on every page
  • A contact flow powered by Netlify Forms with spam honeypot and email routing
  • A Supabase-backed client portal (auth, document vault, and row-level security) reachable by direct URL only
  • Max, an AI concierge built on Claude, gated behind compliance review before it goes fully live

Stack & approach

  • Static HTML, CSS, and JS: no framework, no build step
  • Supabase (Postgres, Auth, Storage, and RLS) for the portal
  • Netlify hosting plus Netlify Forms
  • A Claude-powered assistant behind a dedicated serverless function
  • Custom domain cutover to Netlify in progress
7
Pages rebuilt
100%
Compliance preserved
AI
Client concierge
0
Framework dependencies
Three ways to work with us

Where does your project sit?

Launch for an idea that isn't a business yet. Systems for custom software inside a business that's already running, in production in two weeks. Back-Office for the bookkeeping, payroll, and administration behind it.

Your project next

Let's build yours.

Custom software, a new site, or a rescue of one that's falling apart: tell us the goal and we'll map the path.

Start a project