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; 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 + Vite app served from Cloudflare’s edge network
  • A sport/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 & dead cap, the draft, scheme fits, and snap-by-snap live play-calling.

๐Ÿ€

Hoops GM

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

โšพ

Diamond GM

30 teams, 162 games, the farm system, arbitration & 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, FA, offseason) testable in Node
  • Shared account hub with cross-subdomain sign-in
  • Supabase auth + 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, Edge Functions)
  • Stripe payment links + webhook tier flips
  • Netlify hosting, Capacitor-ready for future mobile wraps
  • Automated engine + UI smoke tests before every deploy
3
Sports, one engine
1
Login across all games
$5
One-time Pro unlock
0
Framework dependencies
Live · Daily game, three leagues

Stat Path

An owned product: a daily sports chain game. Connect two stars through a required number of shared teammates (the same puzzle for everyone, every day, across the NBA, NFL, and MLB), then chase the best combined stat total on that day's leaderboard.

🔍

Solvable by construction

Every daily pair is breadth-first verified against the full teammate graph before it ships, so a player never hits a dead end.

🏀

Three leagues, one engine

NBA, NFL, and MLB each get their own dataset, stat categories, daily seed, and leaderboard out of a single shared codebase.

No build step

The whole game is one hand-written HTML file: vanilla JS, lazy-loaded data, in-memory cache. Nothing to compile, nothing to break.

The challenge

  • Ship a daily puzzle that is always solvable: never an unwinnable board
  • Model decades of rosters as one connected teammate graph, in three sports
  • Keep endpoints recognizable to a modern audience without gutting historical depth
  • Run a leaderboard per league per day, with one honest submission per device
  • Stay fast on a phone with no framework and no build pipeline

What we built

  • A teammate graph keyed on shared team-and-season stints, spanning three leagues
  • Deterministic daily puzzles seeded on league plus Eastern date: everyone gets the same board
  • Breadth-first verification of every pair at its required chain length, with automatic fallback
  • Per-league stat categories, scored on both highest-total and lowest-total days
  • Per-league leaderboards on Postgres with row-level security and one entry per device per day
  • A Python pipeline reconciling several raw sources into three fully connected datasets

Stack & approach

  • Vanilla JavaScript in a single file: no framework, no build step
  • Supabase (Postgres with RLS) backing scores and leaderboards
  • Python data pipeline with identity matching across mismatched historical sources
  • A Node test harness running 24+ assertions across all three leagues
  • Deployed on Netlify
3
Leagues live
16k+
Players in the graph
Daily
One puzzle, one shot
BFS
Every pair verified solvable
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, 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, 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, Tailwind
  • Supabase (Postgres, Auth, Storage, RLS)
  • tRPC for type-safe calls with no hand-written API contracts
  • Recharts for projections; 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, 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, no group text, 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, 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, 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, assignments) with row-level security throughout

Stack & approach

  • A framework-agnostic TypeScript core package with no platform dependencies
  • Web demo on Vite + 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 · Website Business 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, 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 → static rebuild

Hand-built HTML/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 Netlify Forms–powered contact flow with spam honeypot and email routing
  • A Supabase-backed client portal (auth, document vault, 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/JS: no framework, no build step
  • Supabase (Postgres, Auth, Storage, RLS) for the portal
  • Netlify hosting + 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
Also handle the business side

Need the operations to match the build?

Animora Labs also runs financial back-office, HR & operations, and systems auditing for clients who want the business itself running as clean as the software.

See Business Services
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