Track opportunities, organize tailored résumé versions, compare your experience with real job descriptions, and turn the results into a practical interview plan.
View hosted workspace · Explore features · Run locally
The hosted workspace is currently private and requires authorized Sign in with ChatGPT access. The repository can be run locally with a demonstration identity and realistic sample applications.
Job searching usually spreads important information across bookmarks, spreadsheets, documents, and notes. JobPilot brings that workflow into one private workspace and adds an AI copilot that works from actual résumé evidence.
Instead of producing an unexplained “fit score,” JobPilot shows what evidence supports each match, calls out honest gaps, suggests practical résumé improvements, and creates interview questions grounded in the selected role.
| Area | What JobPilot provides |
|---|---|
| Application pipeline | Add, search, filter, inspect, update, and remove opportunities across Saved, Applied, Interview, Offer, and Closed stages. |
| Résumé library | Upload and manage private PDF, DOC, and DOCX versions up to 5 MB, with ownership-checked downloads and deletion. |
| Evidence-first comparison | Match résumé experience to a real job description with supporting evidence and clearly identified skill gaps. |
| Interview preparation | Generate tailored questions, answer guidance, talking points, and role-specific preparation priorities. |
| Private AI history | Revisit previous Copilot briefs and permanently delete analyses from the workspace. |
| Responsive experience | A focused interface designed for both desktop and mobile workflows. |
Search opportunities, filter by status, and update application stages without losing the context of the role.
Select an opportunity and résumé version to build a structured Copilot brief covering matched evidence, gaps, résumé edits, and interview preparation.
- The user selects one saved application and one résumé version.
- The server verifies ownership of both records.
- The private résumé file and job description are sent to the OpenAI Responses API.
- Structured Outputs return matched skills, gaps, improvements, questions, and talking points.
- The completed brief is stored privately and can be revisited or deleted.
JobPilot uses store: false for OpenAI requests and keeps the API key entirely
on the server.
flowchart LR
U["Authenticated user"] --> UI["React + Vinext interface"]
AUTH["Sign in with ChatGPT"] --> UI
UI --> API["Server API routes"]
API --> D1[("Cloudflare D1")]
API --> R2[("Private Cloudflare R2")]
API --> OAI["OpenAI Responses API"]
D1 --> DATA["Applications, metadata, and analyses"]
R2 --> FILES["Private résumé files"]
OAI --> BRIEF["Structured Copilot brief"]
BRIEF --> D1
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Next.js-compatible Vinext |
| Styling | Responsive custom CSS |
| Server | Cloudflare Workers-compatible server routes |
| Structured data | Cloudflare D1 and Drizzle ORM |
| File storage | Private Cloudflare R2 |
| Authentication | Sign in with ChatGPT identity supplied by Sites |
| AI | OpenAI Responses API, GPT-5.6 Terra, and Structured Outputs |
| Validation | ESLint, production builds, and rendered HTML tests |
- Every application, résumé, and analysis query is scoped to the signed-in user.
- Résumé files are never placed in a public asset directory.
- Downloads pass through an ownership-checked server route.
- Only PDF, DOC, and DOCX files up to 5 MB are accepted.
- The OpenAI API key is never exposed to browser code.
- AI requests use
store: falseand a privacy-preserving safety identifier. - Users can permanently delete uploaded résumés and saved Copilot analyses.
- Skill matches include evidence instead of relying on an opaque score.
- AI output is presented as preparation guidance, never as a hiring recommendation.
- Node.js 22.13 or newer
- npm
- An OpenAI API key for Copilot generation
Clone the repository using GitHub's Code button, then run:
cd jobpilot-ai-copilot
npm installCreate .env.local in the project root:
OPENAI_API_KEY=your_openai_api_keyNever commit .env.local or expose the key in client-side code.
Start the local development server:
npm run devThe local preview uses a demonstration identity and automatically provides realistic sample applications. Hosted access uses the authenticated platform identity, and every API request verifies resource ownership on the server.
app/
├── api/ # Ownership-checked server endpoints
├── JobPilotApp.tsx # Main application workspace
├── chatgpt-auth.ts # Hosted and local identity handling
└── globals.css # Responsive product styling
db/
├── runtime.ts # D1, R2, and secret bindings
└── schema.ts # Applications, résumés, and analyses
drizzle/ # Versioned database migrations
tests/ # Rendered output tests
worker/ # Cloudflare Worker entry point
JobPilot currently includes the complete application pipeline, private résumé storage, AI comparison workflow, analysis history, authentication, responsive interface, and production deployment.
AI generation requires an OpenAI API project with active billing or prepaid credits. The rest of the workspace can still be explored locally without making an AI request.
- Public recruiter-friendly demonstration mode with synthetic data
- Calendar reminders for interviews and follow-ups
- Exportable interview preparation briefs
- Application activity timeline
- Automated accessibility and end-to-end browser tests
- Optional semantic résumé search across multiple saved versions
Career AI should help people explain their evidence—not hide decisions behind a number.



