
RIDR
ios & android · currentCommunity-driven mountain biking app with GPS ride tracking, trail records, and a social feed
4,500+ riders in 3 months · 19 releases · launched jun 2026I build software: apps, websites, CLI tools, automations, whatever the problem needs, and I've been doing it for pay since 2019. I built Burn, a fitness app for an influencer with two million followers that's passed $1.3M in lifetime revenue, and I'm one of two engineers on RIDR, a mountain biking app that hit 4,500+ riders in its first three months. Most days Claude sessions work the tickets in parallel while I QA what comes back, triage bugs, and talk to the people who need the work done.

Community-driven mountain biking app with GPS ride tracking, trail records, and a social feed
4,500+ riders in 3 months · 19 releases · launched jun 2026
Subscription fitness app for influencer Cara Loren, with guided workout programs and goal-based progression
$1.3M+ lifetime revenue · 45K+ downloads · daily churn down 9%
V School's in-house learning management system for bootcamp students, instructors, and admins
airtable sync from minutes to 3s · 3 major nx upgrades · team of four
Ticket sales and registration site for the 2022 New Jersey inaugural ball at MetLife Stadium
solo build · feb – apr 2022 · payments through authorize.net
Browser Reversi, my General Assembly final project and the code that got me hired at Smash Creative
ga final project 2018 · rewritten in react · local play only today| Project | Description | Links |
|---|---|---|
| paid work | ||
| LinkFront | Affiliate app for athletes modeled after Shop LTK, built at Smash Creative as an installable web app. I built the Expo app nearly solo and most of the Laravel API. | |
Prospect Sports | Sports-betting PWA for trading players and competing in games, built on contract for a startup. Never finished, and it runs on fake data. | Site ↗︎ |
| Smashboards | Smash Creative's project dashboard, joining Asana projects with Harvest time and invoices. I inherited it in 2023 and modernized it: TypeScript, React Query, Clerk auth, Vitest. | |
| Bioworld Merchandising Website | Squarespace Developer Platform build for Bioworld Merchandising, with a React timeline by year deployed into the template. Client work, winter 2020 to 2021. | |
Blitz Reader | Chrome extension that speed-reads a page's text one word at a time at a chosen words per minute, with the focal letter highlighted. Paid freelance work. | |
MSNY Company Website | Showcase site for Media Solutions of New York, a video production company. Paid freelance work. | Site ↗︎ |
| side projects | ||
| Burn Rebuild | A ground-up rebuild of Burn on my own time. Never shipped. | Read more about Burn Rebuild |
Pulsechain to Coin Tracker | Converts Pulsechain explorer exports into the CSV format Coin Tracker imports. The conversion logic is mine; the front end was generated with Replit. | Code ↗︎ |
Minecraft Locations | Saves the coordinates of places in Minecraft so you can find your way back to them, plotted on a map. | Site ↗︎ |
The Brilliance App | CRM, events, inventory, and staff management for the lighting company I worked for. A hobby project, built hoping to modernize its systems. | Code ↗︎ |
| tools | ||
| Commit Analyzer | CLI that has an LLM label every commit in a repo as a feature, tweak or process change, then writes a CSV and a report. On npm. I used it to build the evidence behind my résumé. | Code ↗︎ |
| add-ts-expect-error | ts-morph codemod that adds @ts-expect-error above every current type error, for when a tsconfig change surfaces more than one sitting can fix. Built during the V Hub contract. | Code ↗︎ |
| airtable-schema-gen | CLI that generates Zod schemas and a typed accessor for an Airtable base. On npm. Built during the V Hub contract. | Code ↗︎ |
| take-homes | ||
Plantifilm | Movie dashboard built as a take-home for Plantiful: browse by category, search, and detail pages against their test API. | Code ↗︎Site ↗︎ |
Manatee Ticker App | Stock quote lookup built as a take-home: a React front end on a tRPC API, with Cypress tests. | Code ↗︎Site ↗︎ |
| coursework | ||
Rock The Vote | Reddit-style voting on political issues, with accounts and comments. A V School assignment on the MERN stack. | Code ↗︎ |
Crypto Rankings | Ranks cryptocurrencies by market cap from the Nomics API, with favorites and coin detail pages. A V School assignment. | Code ↗︎Site ↗︎ |
Zen Garden | A responsive clone of the CSS Zen Garden home page, built at V School to practice HTML and CSS. | Code ↗︎ |
Get Busy | Find and attend events near you, in the spirit of Meetup and Eventbrite. A General Assembly group project. | Code ↗︎Site ↗︎ |
Food Log | Nutrition tracker that logs meals through Nutritionix's natural-language API. Built at General Assembly, for web and mobile from one codebase. | Code ↗︎Site ↗︎ |
One init layer for Mixpanel, AppsFlyer, GrowthBook flags, Intercom, Smartlook, Referral Factory, and App Tracking Transparency.
Cached exercise video with background audio, image capture and sharing, right-sized thumbnails, and S3 uploads with signed URLs.
Expo config plugins, EAS build hooks, and dev-client versus Expo Go targeting across four build profiles.
Three Expo SDK upgrades with React Native 0.74 to 0.76, RevenueCat SDK 4, gluestack v0 to v1, and moment to dayjs across a monorepo.
Expo push with Intercom, AppsFlyer OneLink deep links, and push-tap navigation that queues during a live ride.
An Expo Router app built as an installable web app with Progressier, an add-to-home-screen gate, and a Metro web export.
Idempotent uploads keyed by a client id, crash recovery from snapshots, stationary-drift gating, and a no-GPS watchdog.
RevenueCat paywalls and entitlements on iOS and Android, StoreKit test configs, and RevenueCat webhooks on the server.
A Rails CRM, an Asana and Harvest dashboard, a student DataTable, and map review tooling for trail imports.
A Manifest V2 speed reader that walks the page DOM and streams one word at a time into an overlay.
React brochure sites deployed to Surge, a Squarespace Developer Platform template with an embedded React timeline, and Astro sites for the family studio.
Victory charts behind date and brand filters, Nivo budget charts replacing react-vis, Recharts on web admin.
Authorize.net card charges with client-side validation and Jotform registration for a $300-a-ticket event, and RevenueCat on mobile.
Lighthouse-driven: this site's First Load JS from 171 to 110 kB, ISR instead of force-dynamic, purged CSS and subset fonts on static sites.
Better Auth, SuperTokens, Clerk, Firebase Auth, and Sanctum, plus hand-rolled JWT sessions and account migration between providers.
OpenStreetMap trails at country scale, Awin affiliate feeds into Laravel, Airtable to Firestore sync, and CSV converters with tests.
A Firebase cache with a 24-hour TTL in front of Notion, batched Harvest calls under a rate limit, and bounded Convex reads for a country-scale map.
Sanity schemas and GROQ, a zero-downtime Strapi to Sanity migration through a dual Prisma schema, and Decap for a client site.
Backup and restore scripts per environment, hourly backups from CI, and proxied access to production Postgres.
SendGrid campaigns driven from Airtable scripts, Resend invites, and React Email templates sent over SMTP.
OpenStreetMap trail import, elevation from terrain tiles, ride-to-trail matching, and a versioned map dataset served from a CDN.
Goal-based workout progression for Burn, and a typed challenge task evaluator with XP, streaks, and QR tasks for RIDR.
Convex schemas, migrations, crons, and workflows, kept backward compatible with the app already in the stores.
Schema design and migrations in Rails, Prisma, Drizzle, and Convex, with seeds for every environment.
Google Calendar two-way sync, Asana and Harvest joined by project code, Notion, Airtable, Awin, Jotform, Apify, Figma, Linear, and ClickUp.
tRPC with Zod validation over Express, Prisma or Drizzle on Postgres, with trpc-panel for exploration.
RevenueCat webhooks into Postgres, hourly jobs behind a Redis lock, and Scribeless letters to users who convert or churn.
A ticket orchestrator on Sandcastle and ClickUp, pooled git worktrees, and board status driven from CI.
GitHub Actions and GitLab CI: tag-driven staging and production, quality gates that block deploys, and Slack alerts on failure.
Docker and Fly.io deploys, Terraform for Fly, and hosting on Heroku, Vercel, DigitalOcean, and shared hosts over rsync.
EAS builds, OTA updates, and staged native releases driven from CI.
Sentry with source maps on mobile, web, and Node, plus PostHog events, insights, and alerts.
Doppler per environment on every Smash repo, the 1Password CLI for scripts, and secrets pushed into EAS.
Vitest and convex-test on the backend, Cypress and Maestro end to end, Jest and supertest on APIs.
A published MCP server, agent CLIs, and Claude Code wired into CI.
commit-analyzer and airtable-schema-gen on npm, a ts-morph codemod, and an MCP server for Figma comments.
PHPStan and Rector pipelines, a ts-morph codemod, and lint, format, and type gates on every pull request.
Small tools on the OpenAI and Anthropic APIs: commit labeling, Figma frames to Linear issues, an LLM file organizer, Whisper transcription.
Lerna and Yarn workspaces since 2018, an Nx monorepo on Nx Cloud, Turborepo with pnpm catalogs, and layer-boundary linting.
Home Assistant automations, scripts, and dashboards kept in git, and a Philips Hue library for Scriptable driven from Siri Shortcuts.
I got into software trying to build myself an Ironman-inspired personal trainer: a home-gym tracker in Excel that told me exactly what to do each session, progressive overload automated in spreadsheet formulas, all before I knew anything about real programming. Chasing that led me to General Assembly's Web Development Immersive. I was done with lighting production and wanted work I could do from anywhere.
It took two more years to land the first job. In between came paid freelance work (the MSNY site, a speed-reading Chrome extension) and a CRM I built to try to modernize the lighting company's systems. Since then I've worked inside product teams and directly with clients, mostly on React and React Native codebases, usually across the whole stack rather than one slice of it.
These days I'm one of two engineers on RIDR, and on the side I take on website work through Benzinger Media, my family's web studio. I work remotely from Thailand. If you're hiring a senior full-stack engineer, or have a project that needs one for a while, my email's below.