Rezlo
AI-powered resume builder and job-application platform — from resume parsing and ATS scoring to automated, scheduled recruiter outreach.
Rezlo is an AI-powered platform that takes a job seeker from an existing resume (or none at all) all the way through to actually reaching recruiters — parsing resumes, scoring them against job descriptions, tailoring content with AI, and sending personalized outreach emails automatically from the user's own Gmail account.

- ROLE
- Solo Developer
- TEAM
- Solo Project
- YEAR
- 2026
- STATUS
- LIVE
Rezlo is an AI-powered platform that takes a job seeker from an existing resume (or none at all) all the way through to actually reaching recruiters — parsing resumes, scoring them against job descriptions, tailoring content with AI, and sending personalized outreach emails automatically from the user's own Gmail account.
Job searching involves a lot of repetitive, low-leverage work: rewriting the same resume for every application, guessing whether it'll survive an ATS filter, and manually finding and emailing recruiters one application at a time. Rezlo was built to compress that entire repetitive loop into a single AI-assisted workflow, end to end.
The most technically interesting part isn't the resume builder — it's the AI Gateway underneath it. Every AI feature routes through one centralized layer enforcing scope policy, prompt-injection defenses, rate limiting, and a weighted credit system, so the product can never be turned into a general-purpose AI proxy or have its Gemini usage silently abused.
Job seekers applying to multiple roles face the same friction repeatedly: tailoring a resume per job, checking if it'll survive ATS screening, and reaching out to recruiters — all manually, one application at a time.
No visibility into whether a resume actually matches a job description before applying
Rewriting the same resume content repeatedly for different roles
Finding and manually emailing recruiters doesn't scale past a handful of applications
No structured way to track which applications got a reply, bounced, or went nowhere
Build an end-to-end platform that reduces the job-application loop to a few deliberate actions, with AI handling the repetitive tailoring and outreach work under strict safety and cost guardrails.
A pipeline that takes a user from resume input through AI-assisted refinement to scheduled, personalized outreach — with every AI call passing through a centralized gateway that enforces scope, rate limits, and cost controls.
Drop an existing resume (parsed automatically) or build one from scratch
AI-assisted editing, ATS scoring, and per-job tailoring
Browse sourced job listings or add jobs manually with contact emails
AI generates personalized emails per job, sent on a scheduled, rate-limited cadence via the user's own Gmail
Upload an existing PDF/DOCX — parsed into structured data automatically
Refine content with AI assistance, section by section
Score against a specific job, or get a general readiness score
Browse sourced listings or add roles manually
Attach contact emails to jobs of interest
AI drafts personalized emails per job, sent at spaced intervals
Monitor sent, replied, and bounced outreach in one view
Add feature screenshots — edit in project-data.ts
A Next.js full-stack app with every AI-touching request routed through a single gateway layer, rather than individual routes calling the LLM provider directly.
AI editing the wrong content
An early version of the AI-assisted editor let the model edit any part of a resume during a targeted request — in testing, asking it to improve one bullet point caused it to also silently modify an unrelated bullet elsewhere.
- Stopped relying on prompt instructions alone to constrain scope
- Locked tool-calling parameters so a field-targeted AI request can structurally only touch the one field it was invoked on
AI edits are now scoped at the API level, not just the prompt level — the model can't touch content outside what a specific request explicitly targets.
Automating email without risking deliverability or cost
Sending AI-generated outreach emails at scale risks both spam-flagging the user's Gmail account and uncontrolled AI API spend if left unchecked.
- Capped daily send volume with randomized jitter between sends to avoid patterned, bot-like sending behavior
- Built weighted AI credits per feature (expensive operations cost more) reserved before the AI call and only consumed on success
- Used Gmail's `gmail.send`-only OAuth scope rather than a broader scope, deliberately trading away automatic reply-tracking to avoid a heavier Google security review
Outreach sends at a safe, spaced cadence, and AI usage is bounded per user regardless of plan.
Handling job descriptions of very different sizes
Real job descriptions range from a few lines to dense, multi-thousand-character enterprise postings — a single fixed token limit either rejected long real JDs or wasted budget on short ones.
- Set generous, feature-specific input token budgets sized around real-world job description lengths rather than one flat limit
Long, detailed job descriptions now process correctly across every AI feature that accepts one.
Why Greenhouse for job sourcing, not multiple ATS providers?
NEED — A way to source real job listings with enough detail to both generate a tailored email and support referral requests, which require a specific requisition ID.
DECISION — Built job discovery around Greenhouse's public API exclusively.
WHY — Greenhouse was the only evaluated provider offering both full job description content and a real internal requisition ID in one clean API — other providers required trading off one for the other.
Why Gmail's send-only scope instead of full mailbox access?
NEED — Send outreach emails on the user's behalf from their own inbox.
DECISION — Used the narrower `gmail.send` scope and dropped automatic reply-tracking.
WHY — Broader scopes require a much heavier Google security review process; the narrower scope ships faster and replies still land in the user's real inbox, just tracked manually instead of automatically.
Why a cron-polling send engine instead of a persistent job queue?
NEED — Send scheduled, spaced-out emails without a long-running background process.
DECISION — Used a periodically-polling scheduled job rather than a dedicated queue worker.
WHY — Fits a serverless deployment model without needing a separately-hosted always-on worker process.
Why Razorpay instead of Stripe?
NEED — Accept subscription payments in Indian Rupees from an India-first user base.
DECISION — Used Razorpay for billing.
WHY — Native INR support and local payment methods (UPI, netbanking) without cross-border card friction.
- Next.js 16
- React
- TypeScript
- Tailwind CSS
- shadcn/ui
- Zustand
- Next.js API Routes
- Prisma
- Centralized AI Gateway
- PostgreSQL
- Redis
- Clerk
- Separate isolated admin authentication
- Google Gemini API
- Gmail API (OAuth)
- Razorpay
- Greenhouse Job Board API
Add measured performance numbers — edit in project-data.ts
- Centralized AI Gateway — no route calls the LLM provider directly
- Strict AI scope policy — the model refuses anything outside resume/career-related tasks
- Prompt-injection defense — resume, job description, and GitHub content are treated as untrusted data, never as instructions
- Feature-specific AI endpoints only — no generic prompt-passthrough route
- Output schema validation (Zod) on every AI response before it reaches the client
- Per-feature rate limiting and a weighted, reserve-before-consume AI credit system
- Gmail OAuth restricted to the minimal `gmail.send` scope
- Admin authentication fully isolated from regular user authentication
Prompt instructions alone aren't a reliable safety boundary — scope needs to be enforced structurally (locked tool-call parameters, feature-specific endpoints), not just requested of the model
OAuth scope choice is a real product trade-off, not just a technical detail — a broader scope can mean a much longer review process for a feature that may not need it
Building a centralized AI gateway early made it far easier to add rate limiting, credits, and validation later than retrofitting it across a dozen existing endpoints would have been
Naming a product is its own project — most short, obvious names in the AI/job-search space are already taken
- 3-panel AI resume editor with conversational, tool-calling-based editing and inline click-to-edit
- Full mobile-responsive redesign across the whole app
- A file-based template registry so new resume designs can be added without touching shared code
- Complete Razorpay verification and switch on real billing