Resumy AI
Tailors a resume to a specific job post, tracks every application afterwards, and answers questions about your own profile. Django and Channels on the back, Expo and React on the front.
- Period
- Context
- My role
The problem
Job seekers rewrite the same resume over and over for every posting, then lose track of what they sent where. The first version of Resumy tried to solve the front of that problem with a job feed and matching scores — but the feed was never real, and a feature that looks finished while nothing is wired up behind it is worse than no feature at all. I cut it.
How it was built
Three things, done properly
The product is now a tailored resume generator, a status tracker for every application, and an assistant that has read your profile. Jobs enter only when the user shares a LinkedIn or Indeed post, which a parsing endpoint turns into structured data. A generated resume and a job application are the same record, so nothing has to be reconciled later.
Streaming over WebSocket, not SSE
Generation takes long enough that a spinner is unacceptable, so output streams token by token. Django Channels and channels_redis were already carrying resume-generation progress, so the assistant runs over the same WebSocket rather than introducing a second streaming transport with its own auth and reconnect story.
Metering an integer credit against fractional usage
Credits are bought through RevenueCat in packs, and one credit is roughly one resume generation. A chat turn costs a fraction of that, which an integer field cannot represent. Instead of changing the purchase model I accumulate token usage and deduct a credit each time the accumulator crosses a threshold. The gate runs before the stream opens; metering runs after it closes, since real usage is not known until the model stops.
Where it landed
- Four codebases in production: Django API, Expo mobile app, React dashboard, Astro marketing site
- Streaming assistant and resume generation share one WebSocket layer
- Billing survives sub-credit usage without changing the integer credit model
Specification
- Backend
- Mobile
- Dashboard
- Marketing
- Billing
- Deploy