Selected work

Things we've designed, built, and shipped.

A curated look at recent Animora Labs work — products of our own, a custom CRM built for an advisory practice, 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 — 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
Private beta · Access by request

OneConnect

A custom CRM built for a financial advisory practice — replacing an off-the-shelf system the firm couldn't control or extend with one it owns outright: clients, cases, policies, and pipeline tracked the way the practice actually works, automatic Exchange email and calendar sync, and a security model built for regulated data from the first commit.

📧

Exchange sync

Calendar events and matched client email land in the record automatically on a 30-minute cycle, deduplicated so nothing logs twice.

🔒

Security at the database

Row-level security on every table, TOTP multi-factor enforced in Postgres itself, and an immutable audit log admins can read but nobody can edit.

🔗

Scoped API

Per-advisor hashed, scoped, revocable keys so an advisor's own AI assistant can work against the book without ever holding a password.

The challenge

  • Replace a vendor CRM the firm neither controlled nor could extend
  • Model clients, cases, policies, and pipeline as the practice actually runs them
  • Get email and calendar history onto the record without advisor data entry
  • Meet the security bar regulated client data demands — not approximate it
  • Make commission math consistent and auditable instead of hand-entered

What we built

  • A React single-page app over Postgres, with every role boundary enforced in the database
  • Scheduled Exchange sync for calendar and client email, deduplicated on message and event IDs
  • An immutable, trigger-backed audit log covering every write
  • A scoped REST API with per-advisor hashed keys, minted and revoked in-app
  • Commission calculations as generated columns — computed, never typed
  • Cross-application linking with the planning platform, so a household opens in either system

Stack & approach

  • React and Vite, deployed on Netlify
  • Supabase — Postgres, Auth, Edge Functions, RLS
  • Scheduled Edge Functions on pg_cron for background sync
  • TOTP multi-factor enforced in the app and again at the database level
  • CSP and security headers at the edge; SOC 2 track from day one
Beta
In private testing
MFA
Enforced in the database
30 min
Automated sync cycle
API
Scoped, revocable keys
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
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