
Boba
Multi-chain spot and perpetuals trading.
- Role
- Senior Full Stack Engineer
- Company
- Able Labs
- Year
- Early 2025 to present
- Platform
- Web
- Status
- Live
- Stack
- TypeScript · React · Next.js · Valtio · Go · PostgreSQL · Redis
Boba is a crypto trading app. You can trade tokens on Solana and nine EVM chains, and trade perps on Hyperliquid.
I'm a founding engineer there. I own the web app and our internal admin tools, and I work on the backend too, mostly auth and the database.

01The trading app
It covers a lot: spot trading across every chain, perps with leverage, TWAP and stop-losses, live positions and fills, and a portfolio that adds up everything you hold everywhere.
The hard part is that every chain works a little differently, with its own tokens, fees and deposit rules. The app has to hide that and feel like one product.
Perps run on Hyperliquid, with the order book, leverage, positions, orders and fills all updating live.

02Making it fast
Early in 2026 I went through the app page by page, counting renders. The same problem kept showing up: components re-rendering on every price update, even ones that didn't use it.
The reason was where the data lived. Live prices sat in React state, so one price change re-rendered everything underneath it.
So I moved live data into small stores outside React, where each component only listens to the values it actually uses. The wallet tracker was the worst case and the clearest win, and the pattern spread to the rest of the app after that.
A colleague and I also built the realtime connection. It's built to drop and recover: clients reconnect gradually instead of all at once after a deploy, dead connections get noticed, and anything missed while disconnected gets filled back in.
03Login and sessions
I built Boba's auth service. You can sign in with a wallet, Google, X or a passkey. The service signs tokens with a private key and publishes the public one, so the gateway can check them without every service doing it. Staff sign in separately, with Google and a passkey.
One bug I liked fixing: people were getting logged out at random. It turned out two open tabs could refresh the same session at the same moment. Both refreshes went through, but only one new token was kept, so the other tab's token looked stolen and the session was shut down everywhere.
A lock in the service wouldn't fix it, because we run more than one instance. I moved the check and the refresh into one Redis script that runs all at once, so one tab wins and the other just gets the new token.
I also moved rate limiting into our API gateway after noticing our per-IP limits had turned into per-server limits behind the proxy.
04The database
All our Go services share one database package, and I look after it: the schema, the migrations and the queries. A lot of that work is cleanup, like dropping indexes we didn't need, adding missing foreign keys, and tightening columns once old rows were backfilled.
05able.xyz
Able Labs is Boba's parent company. I made its landing page, able.xyz.
06The 404 page
Able's 404 page started as its first landing page, built on my first night working at Able Labs. We all stayed up through the night, each of us working on a different piece. Later we turned it into the 404 page, and that night is still one of my favorite moments at Able.