01 / 02FEATURED PROJECT

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.

NEXT.JSTYPESCRIPTPRISMAPOSTGRESQLGEMINI AI
Rezlo preview
ROLE
Solo Developer
TEAM
Solo Project
YEAR
2026
STATUS
LIVE
01OVERVIEW
WHAT IS IT?

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.

WHY DID I BUILD IT?

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.

WHAT MAKES IT INTERESTING?

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.

02PROBLEM

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.

01

No visibility into whether a resume actually matches a job description before applying

02

Rewriting the same resume content repeatedly for different roles

03

Finding and manually emailing recruiters doesn't scale past a handful of applications

04

No structured way to track which applications got a reply, bounced, or went nowhere

03OBJECTIVE

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.

LET USERS GO FROM AN EXISTING RESUME TO A STRUCTURED, EDITABLE ONE IN SECONDSGIVE MEANINGFUL, ACTIONABLE ATS FEEDBACK, NOT JUST A SCOREAUTOMATE RECRUITER OUTREACH WITHOUT RISKING THE USER'S EMAIL REPUTATION OR MY AI COSTSKEEP THE AI STRICTLY SCOPED TO RESUME/CAREER TASKS, NEVER A GENERAL-PURPOSE ASSISTANT
04SOLUTION

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.

INPUT

Drop an existing resume (parsed automatically) or build one from scratch

REFINE

AI-assisted editing, ATS scoring, and per-job tailoring

DISCOVER & QUEUE

Browse sourced job listings or add jobs manually with contact emails

OUTREACH

AI generates personalized emails per job, sent on a scheduled, rate-limited cadence via the user's own Gmail

05USER FLOW
01DROP RESUME

Upload an existing PDF/DOCX — parsed into structured data automatically

02BUILD & EDIT

Refine content with AI assistance, section by section

03CHECK ATS FIT

Score against a specific job, or get a general readiness score

04DISCOVER JOBS

Browse sourced listings or add roles manually

05QUEUE OUTREACH

Attach contact emails to jobs of interest

06SCHEDULE & SEND

AI drafts personalized emails per job, sent at spaced intervals

07TRACK RESULTS

Monitor sent, replied, and bounced outreach in one view

06FEATURES

Add feature screenshots — edit in project-data.ts

07ARCHITECTURE

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.

CLIENT
Next.js App RouterReactTypeScriptTailwind CSSshadcn/uiZustand
SERVER
Next.js API RoutesCentralized AI Gateway (scope policy, rate limiting, credit reservation)Feature-specific AI endpoints only — no generic prompt-passthrough route
DATA
PostgreSQL via PrismaRedis (caching, rate limiting)
AI
Google Gemini APIPer-feature token limits and output schema validation
INTEGRATIONS
Clerk (auth)Gmail API (OAuth, send-only scope)Razorpay (billing)Greenhouse Job Board API (job sourcing)
08CHALLENGES
CHALLENGE 01

AI editing the wrong content

PROBLEM

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.

APPROACH
  • 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
RESULT

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.

CHALLENGE 02

Automating email without risking deliverability or cost

PROBLEM

Sending AI-generated outreach emails at scale risks both spam-flagging the user's Gmail account and uncontrolled AI API spend if left unchecked.

APPROACH
  • 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
RESULT

Outreach sends at a safe, spaced cadence, and AI usage is bounded per user regardless of plan.

CHALLENGE 03

Handling job descriptions of very different sizes

PROBLEM

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.

APPROACH
  • Set generous, feature-specific input token budgets sized around real-world job description lengths rather than one flat limit
RESULT

Long, detailed job descriptions now process correctly across every AI feature that accepts one.

09ENGINEERING DECISIONS

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.

10TECH STACK
FRONTEND
  • Next.js 16
  • React
  • TypeScript
  • Tailwind CSS
  • shadcn/ui
  • Zustand
BACKEND
  • Next.js API Routes
  • Prisma
  • Centralized AI Gateway
DATABASE
  • PostgreSQL
  • Redis
AUTH
  • Clerk
  • Separate isolated admin authentication
AI
  • Google Gemini API
INTEGRATIONS
  • Gmail API (OAuth)
  • Razorpay
  • Greenhouse Job Board API
11PERFORMANCE & SECURITY
PERFORMANCE

Add measured performance numbers — edit in project-data.ts

SECURITY
  • 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
12RESULTS
FULLY FUNCTIONAL END-TO-END PIPELINE FROM RESUME PARSING TO SCHEDULED RECRUITER OUTREACHPRODUCTION-STYLE AI SAFETY ARCHITECTURE BUILT BEFORE LAUNCH, NOT RETROFITTED AFTER
13WHAT I LEARNED

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

14WHAT'S NEXT
  • 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
PROJECT COMPLETE

Rezlo