TypeScript
Default for frontends and Node backends.
The tools behind the work, and how often I actually use each one.
Default for frontends and Node backends.
The core of Huble’s desktop tracker since the move off Electron.
The language under all the TypeScript, and plenty of older code.
Scripts, automation, and Python backends.
The language behind Flutter, used to build AmnisLive.
Schemas I design myself, not just what an ORM generates.
Small, fast, locked-down desktop apps with a Rust core.
Component architecture, state, and routing, including Tall Tavern’s frontend.
Huble’s web app, deployed on Vercel.
Styling that stays consistent without a separate CSS layer.
Accessible components I own and restyle, not a black box.
Shipped and scaled No Hesi’s server platform on it.
Interactive maps for finding nearby courts on Duelgeek.
Fast, content-first sites, including this portfolio.
Built No Hesi’s first launcher and Huble’s first desktop tracker.
The runtime under most of my APIs.
Huble’s backend: structured APIs with modules that scale with a team.
Lean REST APIs when Nest is more than the job needs.
Typed, async Python APIs, including Tall Tavern’s backend.
Batteries-included Python web apps.
Small Python services and APIs.
Queues and background jobs on Redis, scaled with load.
Live updates in Huble and No Hesi’s in-game chat.
Subscription-gated channels for No Hesi, and an HR bot for leave requests.
My default relational database, and what Huble runs on.
Offline storage in Huble’s desktop tracker, synced when back online.
Backs BullMQ queues at scale, kept on a private network.
Fast to start on, and I’ve migrated a product off it once it outgrew it.
Serverless Postgres with database branching.
Relational work on existing stacks.
Document storage when the data really is documents.
Wide-column storage built for heavy write loads.
Graph queries for when the relationships are the data.
VPC, EC2, RDS, Lambda, WorkSpaces, IAM Identity Center, Secrets Manager, CloudTrail, and S3.
Whole AWS platforms defined as code, nothing clicked together.
The machines Huble’s backend runs on.
Deploys and custom domains for Huble and Duelgeek.
Huble’s backend ships as a container, same from dev to production.
Reverse proxy in front of Huble’s and No Hesi’s backends.
One monorepo for Huble’s backend, web app, desktop tracker, and website.
Dev, Staging, and Production pipelines that reach AWS through OIDC, not stored keys.
Servers and the self-hosted CI runners that build our apps.
Every change goes through a reviewed pull request.
Passwords, magic links, and Google and Discord OAuth, with users migrated from Supabase Auth.
Browser-based sign-in for Huble’s and No Hesi’s desktop apps.
Single sign-on and automatic user provisioning from Google Workspace.
Custom agents that speed up development and review pull requests.
Scene narration and DALL·E art for Tall Tavern.
Research, second opinions, and first drafts.
Long-context reading across big docs and codebases.
Quick answers with a different model’s take.
UI ideas turned into React components in minutes.
Fast prototypes, and I’ve taken a Lovable-built MVP to production.
Funnel events like sign-ups and trial starts, feeding follow-up emails.
Deploys and manages tracking tags without touching app code.
Cookie consent, so visitors choose what gets tracked.
Built Huble’s subscription billing, webhooks included.
Built No Hesi’s subscription webhooks and gifting.
Transactional email that reliably reaches the inbox.
Email and notifications for Duelgeek.
High-volume and marketing email.
Signaling, ICE, and SFUs, learned building AmnisLive.
Real-time video for AmnisLive’s live streams.
Push notifications and data storage for AmnisLive.
Built AmnisLive with it.