Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

JobPilot Logo

JobPilot — Career Command Center (Web App)

ReactNode.jsFastAPISupabaseLangChain

A full-stack web application for managing job applications, networking, automated job search, and AI-assisted CV tailoring.

Features

  • Profile Management — Store personal info, detailed resume data (Experience, Skills, Network), and target roles.
  • Application Tracker — Track job applications with status, interview stages, and timeline tracking.
  • Analytics & Insights — Gain interview insights and visualize application analytics to improve your job hunt.
  • Network Edge — Manage professional contacts, relations, and interaction history.
  • Automated Job Search — Configure automated searches and web scraping across job boards.
  • Multi-Provider LLM Support — Configurable AI integration supporting multiple providers (e.g., Groq, OpenAI, etc.) for executing agentic workflows.
  • AI CV Tailoring — AI-assisted resume customization using LangGraph and multiple LLM providers, accepting PDF uploads or database profile data to tailor your CV to specific job descriptions.
  • Settings Management — Secure configuration for AI engine API keys and other app settings.

Tech Stack

  • Frontend: React 18, Vite, React Router, Supabase Client, Axios, React Quill
  • Backend (Node.js): Node.js, Express, Supabase JS, Puppeteer (Web Scraping), Multer (File Upload), pdf-parse
  • AI Service (Python): FastAPI, LangChain, LangGraph, Groq, Playwright, BeautifulSoup
  • Database & Auth: Supabase (PostgreSQL with Row Level Security, Auth)

Project Structure

JobPilot-WebApp/
├── backend/ # Node.js API server
│ ├── ai_service/ # Python FastAPI AI engine (LangGraph, Groq)
│ ├── controllers/ # Route handlers
│ ├── routes/ # Express routes
│ └── services/ # Business logic and database interactions
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application views (Profile, Analytics, Tailor, etc.)
│ │ ├── hooks/ # Custom React hooks (Data fetching, auth)
│ │ └── api.js # Frontend API client
├── README.md
└── .gitignore

Getting Started

Prerequisites

  • Node.js 18+ and npm
  • Python 3.10+
  • Supabase Project (Database & Auth)
  • Groq API Key (for AI features)

Backend Setup (Node.js)

cd backend
npm install
cp .env.example .env

Add your Supabase credentials to .env:

PORT=5000NODE_ENV=developmentCORS_ORIGIN=http://localhost:3000SUPABASE_URL=your_supabase_urlSUPABASE_KEY=your_supabase_service_role_key
npm run dev

Backend runs on http://localhost:5000

AI Service Setup (Python)

cd backend/ai_service
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txt
playwright install

The AI service runs on http://localhost:8000 (started via uvicorn main:app --reload).

Frontend Setup

cd frontend
npm install
cp .env.example .env

Add your environment variables to frontend/.env:

VITE_API_URL=http://localhost:5000VITE_SUPABASE_URL=your_supabase_urlVITE_SUPABASE_ANON_KEY=your_supabase_anon_key
npm run dev

Frontend runs on http://localhost:3000

API Endpoints

Core (Node.js)

  • GET /api/health — Health check
  • POST /api/csv/upload — Upload and parse CSV file
  • POST /api/applications/save — Save application data
  • POST /api/network/save — Save network contacts
  • POST /api/settings — Save user configurations (e.g., Groq API key)
  • POST /api/tailor/tailor-cv — Trigger AI CV tailoring pipeline

AI Service (Python)

  • POST /api/tailor — Execute the LangGraph tailoring agent
  • POST /api/search — Execute automated job search routines

Development

All services support hot-reload in development mode. You can run the frontend, Node.js backend, and Python AI service in separate terminals.

Build

Backend

No build needed—runs Node.js directly.

Frontend

cd frontend
npm run build

Output is generated in frontend/dist/.

JSON Resume CV Generation

JobPilot uses the JSON Resume open-source ecosystem to generate professional single-page CVs in six distinct themes. The system converts your stored profile data into the official JSON Resume schema, renders it through a community theme, and exports a PDF via Puppeteer.

Themes

Theme IDStyleRendering
claudeClean & minimalPure HTML/CSS (ESM)
stackoverflowDev community styleSvelte SSR (CJS bundle)
developer-monoMonospace & sharpReact SSR (ESM dist)
data-drivenBold & analyticalReact SSR + styled-components
architects-portfolioStructured & elegantReact SSR (ESM dist)
sales-hunterBold & persuasiveReact SSR (ESM dist)

API Endpoints

MethodEndpointDescription
POST/api/cv/preview-jsonresumeReturns rendered HTML for the selected theme
POST/api/cv/download-jsonresumeReturns a single-page A4 PDF (Puppeteer)

Both endpoints accept { themeId } in the request body and read the user's profile from the database via the authenticated session.

Pipeline Architecture

Profile Data (personalInfo + cvData)
↓
jsonresume-mapper.js ← parses Quill HTML → JSON Resume schema
↓
cv.jsonresume.service.js ← loads theme, calls theme.render(resume)
↓
jsonresume-section-order.js ← reorders sections to canonical order
↓
HTML string → Puppeteer (PDF) or iframe (preview)

Canonical section order:Contact Info → Summary → Technical Skills → Education → Projects → Experience → Additional Information


Profile Formatting Guide

The CV parser reads your profile fields from the Profile Page editor (React Quill). To ensure clean, structured PDF output, follow these formatting rules per section.

✅ Technical Skills

Format each skill category on its own line (press Enter after each category in Quill).
Each line must follow the pattern: Category Name: item, item, item

Programming Languages: Java, Python, JavaScript, TypeScript, C#, C++, SQL
Backend & Systems: Java Spring Boot, FastAPI, RESTful APIs, Microservices, LangChain, LangGraph
AI-Assisted Development: Claude Code, GitHub Copilot, Agentic AI workflows, Prompt Engineering
Databases & Analytics: PostgreSQL, SQLite, Supabase, data modeling
Frontend: React, HTML, CSS
Cloud & DevOps: Docker, Git/GitHub, Linux, AWS
Testing: JUnit, Mockito, Playwright, Selenium, automated testing

⚠️ Important: If all categories are on a single line with no line breaks, the parser will attempt to split them but may misidentify boundaries when the last keyword of one category happens to be uppercase (e.g. SQL before Backend & Systems:). Use Enter between categories for guaranteed correct parsing.


✅ Education

Use bold for the degree title line, followed by the date range in parentheses. Add plain text lines for GPA and coursework.

B.Sc. Computer Science, University of Technology (October 2021 – September 2025)
GPA: 3.8
Relevant Coursework: Data Structures & Algorithms, Operating Systems, Machine Learning.
Academic Highlights: Operating Systems (A), Object-Oriented Programming (A-).

Quill formatting:

  • First line: select degree title → click Bold (⌘B); type (date range) after the bold text
  • Remaining lines: plain text

Supported degree prefixes:B.Sc., M.Sc., Ph.D., B.A., M.A., Bachelor of, Master of

Date range formats accepted:

  • Month YYYY – Month YYYY → e.g. October 2021 – September 2025
  • MM/YYYY – MM/YYYY → e.g. 07/2017 – 03/2020
  • YYYY – YYYY → e.g. 2021 – 2025

✅ Projects

Each project starts with a bold title line followed by the tech stack in parentheses, an optional GitHub link paragraph, and bullet points.

JobPilot – AI-Powered Full-Stack Platform (React, Node.js, FastAPI, LangChain)
GitHub: https://github.com/username/JobPilot
• Developed a full-stack platform for tracking job applications and managing workflows.
• Built AI-powered resume tailoring using FastAPI and LangGraph pipelines.
AwesomeProject – Research Labeling Platform (React Native, Java Spring Boot, PostgreSQL, Docker)
GitHub: https://github.com/username/AwesomeProject
• Developed a collaborative image labeling system for 30+ users.

Quill formatting:

  • Title: select project name → Bold; type (tech stack) after bold text (not bolded)
  • GitHub line: paste URL as plain text or use the link tool
  • Bullet points: use the Bullet List toolbar button

Separator between projects: One empty line (press Enter twice after the last bullet point).


✅ Work Experience

Same pattern as Projects — bold title line with date range, followed by bullet points.

Project Manager – Tech Solutions Inc. (07/2017 – 03/2020)
• Led a 10-person cross-functional team in fast-paced environments.
• Recognized for leadership and effective management under tight deadlines.
• Awarded "Employee of the Year" certificate for outstanding performance.
Software Engineer – Acme Corp (01/2022 – 06/2024)
• Built microservices architecture using Java Spring Boot and PostgreSQL.

Quill formatting:

  • Title: select job title/company → Bold; type (date range) after bold text
  • The dash separator between role and company must be an em-dash () or plain hyphen (-)
  • Bullet points: use the Bullet List toolbar button

Date range formats: Same as Education above.


✅ Summary

Free-form paragraph text — no special formatting required. Write in plain text or use Quill's standard paragraph formatting. The parser strips all HTML and uses the plain text content.


✅ Additional Information

Format as one or more Category: value, value lines.

Languages: English (Native), Spanish (Conversational)
Interests: Open-source development, competitive programming

Each category on its own line (press Enter between categories).


License

ISC

Contributors

Languages