Back to Experience

Refactr

Personal Project

Full-Stack AI Engineer · Jan 2026 – Present · Remote

Next.js 16React 19TypeScriptFastAPIOpenAI GPT-4o-miniSupabaseChrome ExtensionLaTeX
Illustration of a resume moving through the Refactr five-stage pipeline next to the Chrome extension

Overview

Refactr helps job seekers send a resume that fits each role. You upload your resume once, then tailor it to any job description or turn it into a clean PDF that applicant tracking systems can read. It works in the web app and as a Chrome extension on LinkedIn, Indeed, Glassdoor, and Handshake, so you can tailor a resume without leaving the posting.

Challenge

Job seekers spend hours editing a resume for every application, and they still miss keywords that recruiters' screening software looks for. AI tools make this faster but add a risk: they can invent skills or experience you don't have, which can cost you an interview. I wanted a tool that was fast, worked where people already apply, and could be trusted to stick to the truth.

Solution

Refactr reads your resume and the job description, rewrites your bullets to match what the employer asks for, and then checks every rewritten bullet against your original resume. Any bullet that adds a skill you don't have gets corrected or reverted. Your companies, titles, dates, and locations are locked and never change. One sign-in works in both the web app and the extension.

Key Features

Tailor a resume to any job in seconds

Works right on job postings through a Chrome extension

Checks every rewritten bullet so no skill is invented

Keeps companies, titles, dates, and locations unchanged

Reformat mode: a clean, ATS-friendly PDF with your wording untouched

Two resume templates, including one built for technical skills

Dashboard with your current resume, history, and application stats

Work Done

  1. 1

    Three loosely coupled pieces

    A Next.js 16 and React 19 web app, a Manifest V3 Chrome extension built with esbuild, and a stateless FastAPI backend. The web app and extension talk to Supabase directly for auth and storage, with row-level security tied to auth.uid(). The backend never sees a service-role key and only parses, tailors, reformats, and renders PDFs.

  2. 2

    Parse and Classify

    The resume and job description are parsed at the same time with OpenAI GPT-4o-mini structured-output calls bound to Pydantic schemas. The same call classifies the job's industry, so later steps can use guidance written for that field.

  3. 3

    Generate

    Bullets are rewritten with prompt guidance specific to the job's industry, so the emphasis matches what that field looks for.

  4. 4

    Verify and Lock

    Every rewritten bullet is checked against the job's required skills, and any bullet that adds a skill missing from the original resume is rewritten or reverted. Company, title, dates, and locations are locked in code, so the model can't change them.

  5. 5

    PDF output and observability

    Resumes are rendered to PDF with LaTeX in two ATS-friendly templates. Each pipeline stage is timed and returned in an X-Pipeline-Timings header.

  6. 6

    Deployment

    The backend runs in Docker on Render and the frontend on Vercel with CI/CD automation, on the custom domain refactrapp.com.

Impact

Improved keyword recall by 40%, so resumes pick up more of what employers look for

Improved ATS match alignment by 30 to 35% on test job descriptions

Tailors a resume in seconds, directly on LinkedIn, Indeed, Glassdoor, and Handshake postings

Never claims a skill that isn't on your resume, because every rewritten bullet is checked

Keeps your company, title, dates, and locations exactly as written

Live at refactrapp.com with a web app and a Chrome extension

Technology Stack

Frontend

Next.js 16React 19TypeScriptTailwind CSS

Backend

Python 3.11+FastAPIOpenAI GPT-4o-mini (structured outputs)PydanticLaTeX (pdflatex)

Database

Supabase (Postgres)Supabase AuthSupabase Storage (RLS)

Tools

Chrome Extension (Manifest V3, esbuild)DockerRender.comVercelGit/GitHubCI/CD Automation