In today's competitive job market, resumes must be perfectly optimized with keywords and phrasing specific to the target job description to pass Applicant Tracking Systems (ATS). Manually performing this optimization for every application is tedious and inefficient.
- π Features & How It Works
- π§βπ» Getting Started (Installation)
- π οΈ Tech Stack
- π€ Contribution & Guidance
- π Security & Data Handling
- π Roadmap
- π License
PatchMyResume focuses on leveraging AI to create perfectly tailored resumes, maximizing your chances against Applicant Tracking Systems (ATS).
- AI-Driven Tailoring: Uses Google Gemini to analyze job descriptions and rewrite your resume sections for keyword matching and relevance.
- ATS-Optimized Export: Generates clean, structured PDF resumes that are easily parsed by ATS software using PDF-LIB.
- Structured Data First: Collects data using a strict, predefined schema to ensure consistency and quality.
- User-Owned AI: You provide your own API key, giving you control over usage and ensuring your data privacy.
- Theming: Full System/Light/Dark mode support powered by NextThemes.
- API Key/Model Setup: You securely provide your Gemini API Key and select your preferred model.
- Input: You provide your structured Resume Data and the target Job Description.
- AI Processing: Your data and the job description are sent to the Google AI (Gemini) model. Keywords are extracted, and multiple rewritten suggestions are generated for relevant sections (like experience descriptions).
- User Review: You review the AI suggestions and dynamically choose which ones to apply to your resume.
- Export: The final, tailored resume is exported as a clean, ATS-friendly PDF.
Ready to start patching? Follow these steps to set up the project locally or You can use globally hosted PatchMyResume and skip the below steps!
You'll need the following installed:
- Node.js (v18.x or later)
- npm, pnpm or yarn
- An Appwrite instance (Local or Cloud)
- A Google Gemini API Key (for development/testing the AI feature)
-
Clone the Repository:
git clone [https://github.com/Joyal-George-KJ/PatchMyResume.git](https://github.com/Joyal-George-KJ/PatchMyResume.git) cd patchmyresume -
Install Dependencies (using pnpm):
pnpm install
or
npm install
or
yarn install
-
Set Up Environment Variables:
Create a file named
.envin the root directory and populate it with your credentials. (Refer toexample.env.localor the Appwrite documentation for required variables.)Note: Appwrite setup is required. Refer to the Appwrite docs for schema details matching the
ResumeUserDataType. -
Run the Development Server:
pnpm run dev
or
npm run dev
or
yarn run dev
Open http://localhost:3000 in your browser to see the application.
PatchMyResume is built on a modern, secure, and performant stack.
The application supports authentication via popular third-party services using NextAuth:
We're excited to welcome contributions! Whether you're fixing a bug, suggesting a new feature, or improving documentation, your help is valued.
Please read our detailed Contribution Guidelines for:
- Detailed project philosophy and goals.
- Instructions for setting up your development environment.
- Specific conventions for code, commits, and pull requests.
- Coding Style: We strictly follow TypeScript and use Prettier for formatting. Ensure your code is formatted before committing.
- Design System:
- No Tailwind Default Colors: Stick to the predefined CSS Variables (e.g.,
--primary,--secondary). - No
dark:classes: Theming is handled globally via vanilla CSS variables and the[data-theme='dark']selector.
- No Tailwind Default Colors: Stick to the predefined CSS Variables (e.g.,
- Testing: We use
jest.config.jsfor unit/integration tests andplaywright.config.jsfor E2E tests. New features should include relevant test cases. - Check Project Issue section to start contributing.
We prioritize user security and data privacy. For detailed security policies and vulnerability reporting, please see security.md.
If you find a security vulnerability, DO NOT create a public GitHub Issue. Please report it privately using the designated channel:
- Navigate to the Security tab of this repository and click "Report a vulnerability" to create a private Draft Security Advisory.
- API Key Protection: The user's provided Gemini API key is hashed (
src/lib/server/crypto.ts) and stored securely. It is only used server-side (src/lib/server/appwrite.ts). - User-Owned Key: Users are responsible for their own API usage. This is a deliberate design choice for security and cost control.
- Authentication: Robust session management via NextAuth and dedicated user routes (
src/app/(auth)/user/page.tsx).
| Data Point | Storage Location | Sharing Policy | Notes |
|---|---|---|---|
| User Resume Data | Appwrite DB & Session Storage | Private | Stored securely, accessible only by the logged-in user. |
| User API Key (Gemini) | Appwrite DB (Hashed) | Private | Hashed and used server-side only to access the Gemini API. |
| Job Description | State | Not Saved | Used temporarily for a single AI tailoring request. |
| AI Suggestions | State | Not Saved | Discarded after the user makes their selection/moves on. |
| Final PDF Resume | Local User Device | Not Stored | Generated client-side (src/lib/pdfHelpers.ts) and never stored on our servers. |
This project is actively maintained. Here's a look at what's complete and what's next.
- Resume import/export (JSON
$\to$ ATS-ready PDF) - AI rewriting and tailoring (Google Gemini)
- Multiple AI suggestions per section for user choice
- User-controlled, dynamic resume preview builder
- Theming (light/dark/system)
- Custom Sections/Items: Allow users to define their own resume sections (e.g., certifications, publications) beyond the strict schema.
- More AI Model Support: Integrate other LLM providers (e.g., OpenAI, Claude) for user choice.
- Resume Template Library: Provide a selection of professional resume design templates.
- Testing Implementation: Full coverage with Jest (
src/tests/unit,integration) and Playwright (src/tests/e2e).
This project is open-source and community-focused. You are free to use and extend it under the MIT License.