Skip to content
FRFaizan Raza
All work
AI product · four codebasesLive

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
2025 — present
Context
Personal product
My role
Sole engineer — backend, mobile, dashboard, marketing site

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
Django · DRF · Channels · Celery · PostgreSQL · Redis
Mobile
Expo · React Native · Uniwind
Dashboard
React 19 · Vite · Tailwind 4 · Zustand · Recharts
Marketing
Astro 6 · Tailwind 4
Billing
RevenueCat, token-metered credits
Deploy
Docker · nginx · Gunicorn
  • Django
  • DRF
  • Channels
  • Celery
  • PostgreSQL
  • Redis
  • Expo
  • React 19
  • Tailwind 4
  • Zustand
  • Astro
  • RevenueCat
  • Docker