No Hesi
The platform behind No Hesi's modded Assetto Corsa servers and its 200K+ member racing community. I led it through two migrations and built its desktop launcher, in-game chat overlay, league badges, and Discord-synced subscriptions.
Visit nohesi.gg ↗
Overview
No Hesi is an Assetto Corsa community with 200K+ members, built around modded multiplayer servers. It started on Discord, where the community ran everything. I led development of the platform that grew around it.
How the stack evolved
- Next.js. The first version was built in Next.js, but cache management caused performance problems, so I migrated it to SvelteKit.
- SvelteKit, full stack. SvelteKit ran both the frontend and the backend, since it’s a full-stack framework, with Supabase as the database and deploys on Vercel.
- Express on AWS. Once real users arrived, I migrated the backend to Express, with AWS RDS for the database and Redis on AWS. The backend runs on EC2 behind an Nginx reverse proxy, with SvelteKit staying on the frontend. The move improved both performance and reliability.
Data and APIs
I designed the database schema and built the REST APIs that connect the frontend and backend.
Desktop launcher
I built the base of No Hesi’s desktop launcher in Electron. It lists the servers, the cars, and who’s playing on each server right now, and players can join a server straight from the launcher. Players sign in through the browser using OAuth with PKCE, so the launcher never handles their password.
Friends and chat
Players can add each other as friends on the website and chat directly. I also built a chat app that loads inside the game itself: it sits as an overlay on top of Assetto Corsa, so players can talk mid-race without leaving the game.
Both run on the same Socket.IO backend, with one deliberate difference:
- Website chat keeps its history, so conversations are still there next time
- In-game chat lasts only for the session
Players can send emoji and GIFs from Tenor, and an abuse filter catches abusive words and masks them.
Authentication
Sign-in started on Supabase Auth and later moved to Auth.js. I migrated every existing user across, so accounts carried over. Players can sign in four ways:
- Email and password
- Magic link by email
- Google OAuth
- Discord OAuth
Discord integration
The website couldn’t replace the Discord server; it had to work alongside it. Some channels are only open to members on certain subscription tiers, so I built a Discord bot that keeps channel access in step with what each player pays for on the web.
Leagues and leaderboards
Competition runs in leagues, and each league has its own leaderboard. When a league ends, the top players are awarded badges that show on their profiles. I built the badge system around a database snapshot: the moment a league closes, the database captures its top players, badges are assigned from that snapshot, and every past league keeps a permanent record of who finished where.
The leaderboard data comes from an external source, and it doesn’t arrive in a clean shape. I built the pipeline that pulls it in:
- Scheduled syncs: cron jobs refresh the data regularly, so the leaderboard never goes stale for long
- Preprocessing: each batch is cleaned and restructured before it’s stored, so the rest of the platform works with consistent data
Subscriptions
I built the Stripe webhooks behind No Hesi’s subscriptions, and subscription gifting, so a player can buy a plan for another user.
Duelgeek →
A tennis app that helps Vancouver players find courts, players, and matches nearby. I turned the client's Lovable prototype into a production MVP on Next.js and Supabase, from the match-up system and Mapbox courts map to launch on Vercel.