Job Search Terminal
A free, source-available, local-first job-search dashboard for people who need structure, privacy, and better tools in a brutal job market.
Scan jobs. Score fit with AI. Generate tailored resumes. Track applications. Prepare for interviews. Keep your data on your machine.
No account. No subscription. No hosted database. Bring your own AI API key.
The job search is hard enough without another bill.
Too many people are looking for work right now. And too many tools ask those same people to pay monthly fees just to organize the chaos.
That never sat right with me.
This app is my attempt to make the job search a little less punishing. It is not magic. It will not apply for you. It will not guarantee interviews. But it can help you see what is worth your time, keep track of what you have done, and stop rebuilding the same resume and application answers from scratch every night.
See Job Search Terminal in action
What the app helps you do
Job Search Terminal is built around the work people actually do while job hunting: finding roles, evaluating fit, tailoring material, applying, following up, and preparing for conversations.
Scan job sources
Discover new roles from company career pages and configured job sources.
Evaluate fit
Use AI to compare roles against your profile, resume, skills, preferences, and deal breakers.
Tailor resumes
Generate role-specific resume drafts from your own base resumes, then edit before export.
Draft application answers
Prepare answers for application questions. The app never submits anything for you.
Track applications
Use table, list, and Kanban views to move applications through your funnel.
Prepare for interviews
Build a STAR story bank and practice answers using voice transcription.
What you can do in the first hour
The first goal is not perfection. The first goal is control.
Once the app is running, you can:
- Add your AI API key.
- Upload or add your resume.
- Complete your career profile.
- Scan for jobs.
- Evaluate which roles are worth your time.
- Start tracking applications.
If you are not technical, use the AI setup prompt in the Documentation tab. Paste it into Claude Code or Codex and let it walk through the installation with you.
See how it works
Click any image to open a larger view.
Setup, features, and documentation
The documentation below is powered by Markdown so it can stay current as the app changes. Replace the files
in src/content/job-search-terminal/ and redeploy to update.
Overview
What this is
Job Search Terminal is a local job-search dashboard that runs on your computer. It helps you discover jobs, evaluate fit, tailor resumes, draft application answers, track applications, and prepare for interviews.
It is free to use, inspect, and adapt for non-commercial purposes under CC BY-NC 4.0. Commercial use requires written permission.
What this is not
This is not a job placement service. It does not guarantee interviews. It does not apply to jobs automatically. It does not replace judgment, networking, or human effort.
It is a tool to help you keep the work organized.
What you need
You need a computer, Node.js, Git, Google Chrome, and at least one AI API key if you want to use AI features.
The app can use OpenAI, Anthropic, or Google Gemini depending on what you configure.
What it costs
The app is free.
There is no subscription, no paid account, and no access fee. The only cost may be your own AI API key, paid directly to the AI provider you choose. I do not charge for that and I do not sit between you and the provider.
Your data stays with you
Your job search data is stored locally on your machine. The app does not use a cloud account or hosted database.
AI requests are only sent when you choose to use an AI feature, such as job evaluation, resume tailoring, profile extraction, or answer drafting.
Who this is for
This is for people who want more control over their job search and are willing to run a local tool on their own computer.
It is especially useful if you are applying to many roles, tailoring resumes often, tracking multiple applications, or trying to make better decisions about where to spend your time.
Getting started
Follow this guide to install and run Job Search Terminal on your computer. You do not need to know how to code, but you do need to be comfortable opening a terminal or using an AI coding assistant to help with setup.
If you are not technical, open the “Prompt for AI on this page” section and use that prompt to have an AI assistant help you install the app step by step.
Go to AI setup promptGetting Started
This guide explains what the app is, what you need to run it, and how to get it running on your computer — even if you have no development background.
What is this app?
Job Search Terminal is a local job-search dashboard that runs entirely on your computer. It helps you:
- Discover new job postings automatically from company career pages.
- Score each job against your career profile using AI.
- Generate tailored resumes for specific roles.
- Draft application answers for copy-paste (it never submits anything on your behalf).
- Track every application through the full funnel.
- Prepare for interviews with a STAR story bank and voice practice.
Your data never leaves your machine. There are no accounts, no subscriptions, and no cloud storage. The only time the app contacts the internet is when you ask it to use an AI provider (OpenAI, Anthropic, or Google Gemini) to evaluate a job or generate content.
What you need
| Requirement | Details |
|---|---|
| Computer | Mac, Windows (WSL), or Linux |
| Node.js | Version 18 or later — download from nodejs.org |
| Git | Download from git-scm.com |
| An AI API key | At least one of: OpenAI, Anthropic, or Google Gemini (free tier available) |
| Google Chrome | Required for PDF generation — most computers already have it |
You do not need to know how to code. You just need to be comfortable opening a terminal (the black or white window where you type commands).
How to open a terminal
Mac: Press Command + Space, type Terminal, press Enter.
Windows: Press Windows key, type PowerShell, press Enter. (Or install
Windows Terminal for a better experience.)
Linux: Press Ctrl + Alt + T.
Step-by-step setup
1. Install Node.js
Go to nodejs.org, download the LTS version, and run the installer. Accept all defaults.
Verify it worked by opening a terminal and typing:
node --version
You should see something like v20.11.0.
2. Install Git
Go to git-scm.com, download the installer for your operating system, and run it. Accept all defaults.
Verify it worked:
git --version
3. Download the app
In your terminal, navigate to where you want to store the app (your Desktop or Documents folder works fine):
cd ~/Desktop
Then download the app:
git clone https://github.com/uxdesignlab/job-search-terminal.git
Once cloned, move into the project folder:
cd job-search-terminal
4. Install dependencies
This downloads everything the app needs to run:
npm install
It may take a minute or two. You will see a lot of text scrolling by — that is normal.
5. Add your AI API key
The app needs at least one AI provider key to evaluate jobs and generate content. You can use whichever service you have access to:
- Google Gemini (free tier): aistudio.google.com/apikey
- OpenAI: platform.openai.com/api-keys
- Anthropic: console.anthropic.com/settings/keys
Once you have a key, you configure it inside the app itself (Settings → AI Providers). You do not need to create any configuration files manually.
6. Start the app
npm run dev
The terminal will print something like:
▲ Next.js 15.x
- Local: http://localhost:3000
Open http://localhost:3000 in your browser. The app will be running.
7. First-time setup in the app
When you first open the app at http://localhost:3000, the dashboard shows a 3-step setup guide:
Step 1: Add an AI API key Click the provider you want to use to expand the instructions. Pick one — you only need one:
- Google Gemini (free tier): go to aistudio.google.com/apikey, sign in with Google, click Create API key. Copy the key.
- OpenAI: go to platform.openai.com/api-keys, sign in, click Create new secret key. Copy the key.
- Anthropic (Claude): go to console.anthropic.com/settings/keys, sign in, click Create Key. Copy the key.
Then click “Go to Settings → AI Providers”, select your provider, paste the key, and save. Return to the Dashboard — Step 1 shows ✓.
Step 2: Upload your resume Click “Go to Profile → Resumes”. On the Resumes tab, each lane represents a different resume version. For any lane, click the blue “Upload PDF” button and select your resume file. The app extracts the text automatically.
After uploading, go to Profile → Overview and click “Extract with AI”. The AI reads your resume and populates your skills, target roles, preferences, and experience. Review each tab (Skills & Roles, Preferences, Constraints) and make any corrections.
Step 3: Scan for jobs Return to the Dashboard. The setup wizard is gone — you’re ready. Click “Scan for new jobs” to start discovering opportunities.
Everyday use
| What you want to do | Where to go |
|---|---|
| Find new jobs | Dashboard → Scan for new jobs |
| Add a job from anywhere | Jobs → Add Job button |
| See all your jobs | Jobs |
| Evaluate a job | Jobs → click a job → Evaluation tab |
| Generate a tailored resume | Jobs → click a job → Resume tab |
| Prepare application answers | Jobs → click a job → Apply tab |
| Research a company | Jobs → click a job → Research |
| Draft a recruiter message | Jobs → click a job → Outreach |
| Track your applications | Applications |
| Practice for interviews | Interview Prep |
| Update your profile | Account → Profile |
| Upload or replace a resume | Account → Profile → Resumes tab |
| Add an AI key | Account → Settings → AI Providers |
| See role fit strategy | Account → Strategy |
| Change AI provider or add sources | Account → Settings |
Adding jobs from anywhere
You are not limited to the jobs the scanner finds. Any job you see on LinkedIn, a company careers page, a job board, or hear about through a referral can be added and evaluated with AI.
How to add a job manually:
- Go to Jobs in the top navigation.
- Click the Add Job button.
- Fill in the details:
- Company — the employer name.
- Job Title — the exact title from the posting.
- Job URL — the link to the posting, so you can return to it later.
- Job Description — paste the full text of the job description. The more detail you include, the better the AI fit score.
- Click Submit Job. The app creates the job and opens it immediately.
Manual jobs go through the same pipeline as scanned jobs — fit scoring, resume tailoring, application tracking, company research, and outreach drafting all work exactly the same way. The fit score tells you whether it is worth applying before you invest time in a cover letter or tailored resume.
Good sources to add jobs from manually:
- LinkedIn job postings
- Wellfound and Work at a Startup postings if you are not using the browser-board scanner
- Company careers pages
- Referrals and warm introductions (add what you know about the role)
- Jobs emailed to you by recruiters
- Any board the scanner doesn’t cover (Dice, Handshake, etc.)
Stopping and restarting
To stop the app: go to your terminal and press Ctrl + C.
To restart:
npm run dev
Updating the app
When a new version is available:
git pull
npm install
npm run dev
Backing up your data
All your data is in data/job-search-terminal.sqlite. Back it up at any time:
npm run data:backup
Backups are saved to output/backups/. Export a readable JSON snapshot:
npm run data:export
Troubleshooting
The app won’t start
- Make sure you ran
npm installfirst. - Make sure no other app is using port 3000.
- Try stopping with
Ctrl + Cand runningnpm run devagain.
Pages show stale or missing data
- Restart the dev server.
- Run
npm run db:checkto verify the database.
PDF generation fails
- Make sure Google Chrome is installed.
- On Mac, Chrome is usually at
/Applications/Google Chrome.app. On Windows, it is inC:\Program Files\Google\Chrome\Application\chrome.exe. - If Chrome is in an unusual location, set the environment variable:
CHROME_EXECUTABLE_PATH=/path/to/chrome
No AI results
- Go to Settings → AI Providers and check that your key is entered and the correct provider is set as active. Use the “Test connection” button to verify.
Reset everything and start fresh
This deletes all local data and resets to an empty local profile:
npm run db:reset
Use with caution — this cannot be undone unless you have a backup.
Prompt for Claude Code or Codex (self-service setup)
If you want an AI coding assistant to set up and run this app with minimal manual work, paste the following prompt into Claude Code or Codex:
Set up and run Job Search Terminal for me as a self-service local app.
Repository:
https://github.com/uxdesignlab/job-search-terminal.git
Goal:
Do the setup yourself end to end. Do not give me a list of terminal commands to
run. Use the terminal and browser tools available to you, verify each step, and
only ask me for information you cannot safely obtain or create yourself, such as
an AI API key or the local path to my resume PDF.
What to do:
1. Inspect the computer for required tools:
- Node.js 18 or newer
- npm
- Git
- Google Chrome or another Chromium browser for PDF generation
2. If a required tool is missing, try to install it using the normal package
manager for this computer, such as Homebrew on macOS, winget on Windows, or
apt/dnf/pacman on Linux. If installation requires administrator permission or
an approval prompt, ask me for that approval once, then continue after it is
granted. Do not stop at "please install this" unless there is no safe
automated installation path.
3. Create or reuse a local project folder:
- If the repository is already cloned, use the existing checkout.
- If it is not cloned, clone it from the repository URL above.
- Avoid overwriting or deleting existing user data.
4. Install project dependencies with npm.
5. Run the project's verification checks:
- npm run lint
- npm run typecheck
- npm run build
6. Start the development server. If port 3000 is busy, use the next available
local port and tell me which URL is running.
7. Open the app in a browser yourself and verify the dashboard loads. Do not
simply tell me to open the URL.
8. Complete as much first-time setup as the app allows:
- If no AI provider is configured, ask me for one API key, then enter it in
Settings -> AI Providers and use the app's connection test if available.
- If a resume is needed, ask me for the local PDF path or use the browser file
picker if your tools support it. Upload it through Profile -> Resumes.
- Preserve multiple resume lanes. Do not merge everything into one universal
resume.
- Run profile extraction from Profile -> Overview after a resume is uploaded.
- Return to the dashboard and scan for jobs when setup is complete.
9. Safety rules:
- Never submit job applications, send emails, or message recruiters for me.
- Never delete resumes, generated documents, reports, backups, or tracked
application data unless I explicitly ask.
- Keep all data local.
10. If anything fails, read the actual error, fix what you can, retry once, and
then explain the blocker in plain language with the exact next approval or
input needed from me.
Finish by giving me the running local URL, what you verified, and anything still
needed from me.
Is this the same as Career-Ops?
No. Job Search Terminal was inspired by Career-Ops, but it is a separate project with a different product direction.
Career-Ops is a powerful CLI-first, agentic job-search system. Job Search Terminal is a browser-based, local-first dashboard designed to make the workflow more approachable for people who do not want to manage everything through AI coding tools and config files.
License note
Job Search Terminal is free for non-commercial use under CC BY-NC 4.0.
Commercial use requires written permission from the copyright holder.
Features
Summaries below; full documentation lives in Markdown and updates when you replace features.md.
Dashboard
A command center for scan results, action queue, source status, recent activity, XP, and job-search progress.
Jobs
A full job pipeline with fit scores, filters, saved presets, bulk actions, archive tools, and manual job entry.
Job Detail
A tabbed workspace for evaluating a role, reviewing fit, generating a tailored resume, preparing answers, researching the company, and drafting outreach.
Applications
A funnel tracker with table, list, and Kanban views, including overdue follow-up alerts and status movement.
Resumes
A resume studio for multiple base resume lanes, generated documents, editing, keyword coverage, preview, and PDF export.
Interview Prep
A STAR story bank and voice-practice workflow for turning spoken answers into structured interview stories.
Profile
A career profile system that captures goals, skills, role direction, preferences, constraints, resumes, and writing voice.
Strategy
A role-fit map that helps users understand direct-fit, adjacent, selective, and avoid-role categories.
Analytics
Search-performance metrics that show application funnel conversion, score-to-outcome patterns, archetype performance, and gap coverage.
Settings
Controls for AI providers, job sources, title filters, custom job boards, preferences, and fallback models.
Data and privacy
Data is stored locally in a SQLite database on the user's machine, with backup and export commands available.
View full feature documentation
Features
This document describes every feature in the current application. Use it as a reference for what the app does and how each section works.
Navigation
The Shell header provides two navigation groups:
Primary nav (always visible): Dashboard · Jobs · Applications · Interview Prep · Analytics · Resumes
Account dropdown (hover on “Account”): Profile · Strategy · Settings
Help link appears immediately after Account and opens the in-app help site at
/help.
The Account menu shows a live AI provider health dot:
- Green: active provider has a key configured
- Yellow: a key exists but the active provider’s key is missing
- Red: no AI keys configured at all
The app redirects / to /dashboard on load.
Help Site /help
The in-app help site is a self-service documentation surface for open-source users. It is designed as a mini website inside the product, with a landing page, search, workflow cards, a persistent documentation sidebar, screenshots, related guides, and per-topic pages.
Help home:
- Hero with product screenshot and calls to start the guide or open the resume and ATS guide.
- Search across all help pages.
- Workflow groups for setup, profile, jobs, applying, tracking, interview prep, privacy, and troubleshooting.
Guide pages:
/help/getting-started— setup, onboarding, and daily workflow./help/ai-providers— how to create and add OpenAI, Anthropic, or Google Gemini API keys, test the provider, and protect keys./help/resume-lanes— resume lanes, resume upload, ATS-friendly formatting, PDF guidance, and bullet quality./help/job-search— dashboard scans, job sources, manual job entry, filters, and saved presets./help/linkedin-scanner— Claude/Codex browser-board scanning for LinkedIn, Wellfound, and Work at a Startup; imports, duplicates, limits, and safety notes./help/evaluate-tailor— evaluation, tailored resume generation, PDF export, application answers, research, and outreach drafting./help/applications— statuses, table and kanban tracking, follow-ups, and archive vs. delete behavior./help/interview-prep— STAR stories and voice practice./help/privacy-data— local data, AI-provider data flow, backups, and safety boundaries./help/troubleshooting— common setup, AI, resume/PDF, scan, and LinkedIn fixes.
The help content is sourced from src/lib/help/content.ts and rendered through
the shared help components under src/components/help/.
Dashboard /dashboard
The command center. Has two states depending on setup progress.
First-run onboarding (shown until setup is complete and dismissed): Opens as an isolated dashboard modal so the user can finish setup without leaving the flow. Closing before completion shows a warning that the app will fail to generate useful matches, resumes, and answer drafts until setup is finished.
The modal has 4 gated steps:
- AI provider — saves one OpenAI, Anthropic, or Google Gemini API key inline.
- Resume lanes — uses the normal multi-lane resume upload cards. Uploading a PDF seeds desired positions and positive title filters from extracted resume titles, and AI extraction can enrich the full profile.
- Job preferences — requires the user to review and explicitly save desired positions, include/exclude title filters, and location work modes. Resume upload or extraction may prefill these values, but the step does not become complete until the user confirms them.
- Ready — explains the next operational steps: review scan sources in Settings, run Scan for new jobs on the Dashboard, then review and evaluate imported matches.
The normal dashboard and scan button are gated until an AI key exists, at least one resume lane has extracted text, and job preferences have been confirmed.
Normal dashboard (after full setup):
- Stat cards — priority matches, applications sent, new jobs this week (from scans vs. manually added).
- Action queue — two lists: “Apply next” (high-score jobs not yet applied to) and “In flight” (active applications: interviewing, follow-up needed). Each card shows company, title, fit score, and recommended next action.
- Latest scan card — companies scanned, new jobs found, duplicates skipped, status badge. Per-source error list with inline “Disable source” button.
- Recent activity log — timestamped list of user actions.
- Scan for new jobs button in page header (hidden for new users).
Jobs /jobs
The full job pipeline. Lists every discovered job with filtering, preference status, posting maintenance, and bulk tools.
Features:
- Fit score badge, status badge, freshness label, and role archetype per row.
- Sort by fit score, date, company, preference, or workflow status.
- Filter by workflow status, preference status, score range, location, company, recommendation, posted date availability, and added date availability.
- The last sort and filter settings are restored automatically on the next visit; named presets are still available for recurring review modes.
- Preference column — shows
Matchwhen a job still fits the current profile preferences and constraints, orOut of scopewhen saved preferences have changed and the job no longer fits. This is a derived display/filter value, not a separate stored job status. - Text search across company and title.
- Bulk operations: change status on multiple jobs, archive, or delete in bulk.
- Marking a job Skipped (individually or in bulk) removes it from this list immediately — it is auto-archived and moves to the Archived page.
- Bulk delete asks for confirmation. If selected jobs have user activity, the confirmation warns before deleting.
- Maintenance tool to verify posting liveness, confirm deletion for expired untouched jobs, and identify active jobs whose titles no longer match saved title filters. Out-of-scope cleanup only bulk-deletes untouched jobs; jobs with user activity must be removed through explicit selected-job actions.
- Add job manually via modal (paste URL or fill in details). Jobs added this
way are stored with
source = 'manual'and display a Manual badge in the Source column. - Column filters — click any column header to open a sort + multi-value checkbox filter dropdown. Active filters show a count summary (“X of Y jobs”) with a “Clear all filters” link.
- Saved filter presets — name and save up to 5 filter+sort combinations as reusable chips above the table. Presets are persisted to the database and survive page reloads. Click a chip to re-apply; click × to delete.
Job Detail /jobs/[id]
Tabbed view for a single job. Four tabs:
Overview tab
- Company, title, location, remote type, ATS source, freshness.
- Fit score, recommendation badge, role archetype.
- Match rationale, main concern, salary notes.
- Requirement match table showing which JD requirements the profile covers.
- Gap list: requirements not yet addressed.
- Red flags list.
- Job description — collapsed panel showing the saved description text.
- Edit job details — collapsed form to overwrite position, company, job posting URL, and job description without creating a duplicate record. Useful when LinkedIn or other scanner sources capture only partial metadata. All four fields are pre-filled with the current values. A reminder to re-run evaluation is shown after saving, since any description change makes the existing AI analysis stale.
Analysis tab
- Run evaluation: triggers AI streaming evaluation with real-time output.
- Evaluation sections: strengths, gaps, red flags, resume recommendation, keyword list, legitimacy signal.
- User correction: override the AI recommendation and score with a note.
- Provider and model metadata for the last evaluation run.
AI evaluation data sources (all fed into the analysis):
- Full job description (up to 6,000 characters — captures required qualifications that appear deep in the posting).
- Candidate profile: goal, urgency, direction, compensation needs, work preferences, target roles, deal breakers, constraints.
- Skill inventory (up to 30 skills with strength level and evidence source).
- Role strategy (role-fit scores and rationale from the profile).
- Active resume excerpts (up to 2 resumes × 1,800 chars each) — ensures Block B CV-match assessment and proof-point citations are grounded in actual resume text, not inferred from skill abstractions alone.
ATS keyword extraction (Block E):
- Extracts 10–15 keywords from the job posting.
- Each keyword carries a priority (
requiredorpreferred) based on which section of the JD it appears in, and a category (technical,soft,domain,tool,methodology). - Keywords are stored in priority order (required first) and used during resume tailoring to rank emphasis decisions.
Resume tab
- Generate tailored resume for this job: picks best base resume, produces HTML and PDF output with tailoring summary and keyword coverage %.
- Resume draft editor: edit the tailored resume before export.
- Keyword coverage progress bar.
- Download PDF button.
Tailored resume AI context:
- Source resume full text (up to 5,000 chars) — the AI must verify every keyword and strength against this text before using it.
- Evaluation keywords in priority order (required first, then preferred).
- Evaluation strengths (top 4) as suggested emphasis signals.
- Gap responses — user-supplied notes addressing identified experience gaps.
- Profile supplements — any extra context the user has added.
- Gap answer quality checks — vague gap responses and supplements are saved as drafts with a follow-up question, and only confirmed answers are used during resume tailoring.
- Job description excerpt (up to 3,000 chars) — allows the AI to verify keyword context and understand requirement weight, not just the extracted keyword list.
- Skills preference flags — skills the user wants to emphasize or de-emphasize
(derived from
use_more/use_lesspreference on each skill record).
Keyword coverage metric:
- Counts how many evaluation keywords appear in the resume text values (not JSON keys), giving an accurate ATS signal. Displayed as a percentage on the Resume tab.
Apply tab
- Prepare application answers: paste common or custom application questions, generate AI answers for copy-paste. App never auto-submits anything.
- Application status selector: move the job through the 11-status funnel.
- Follow-up date picker.
- Contact field.
Sub-pages from Job Detail:
Research /jobs/[id]/research
AI-generated company intelligence:
- AI strategy and product direction
- Recent company movements (hiring, layoffs, expansions)
- Engineering / design culture
- Technical and organizational challenges
- Candidate positioning angle
Outreach /jobs/[id]/outreach
Generate a recruiter or hiring manager outreach message tailored to the job and user profile. Shows character count. User copies the message manually.
Applications /applications
Application funnel tracker with two view modes:
- Table view — sortable list of all active applications with status, company, role, score, follow-up date, and overdue indicator.
- Kanban view — drag-and-drop board organized by status column.
Features:
- Follow-up overdue alerts (highlighted when past the follow-up date).
- Status transition buttons inline in each row.
- Filter by status, overdue, or company.
- Column filters and saved filter presets (same system as the Jobs table).
- Summary funnel metrics at the top: applied, in progress, responded, interviewing.
Archived /archived
Jobs that have been manually archived or skipped.
- Table of archived jobs with original score and archival date.
- Column filters and saved filter presets on the archived jobs table.
- Restore action: move a job back to active.
- Delete action: permanently remove the job and all associated records.
Auto-archive on skip: marking a job as Skipped automatically moves it to the archive. The job leaves the active pipeline immediately — it will no longer appear on the Jobs page or the Dashboard action queue. It remains visible on the Archived page and can be restored at any time.
Resumes /resumes
Resume studio showing all resume lanes and generated documents.
Two sections:
Base resumes — the source PDF lanes uploaded by the user, or resumes built from scratch inside the app. Each lane represents a different career angle (e.g., “Leadership”, “IC / Individual Contributor”, “Domain Specialist”). The app ships with five default lane names that can be renamed; new lanes can be added at any time.
Each lane shows extraction status, word count, and resume-builder approval state. Existing uploaded resumes are backfilled from stored extracted text, so current users do not need to upload them again.
The /resumes page uses the same dashboard table pattern as the Jobs page on
desktop, with compact cards on smaller screens. The table shows lane name,
builder status badge, source word count, extraction date, and an action button.
Each lane has a direct Review and approve or Edit approved version action
that opens the builder.
Create new resume button appears in the page header on /resumes and in the
Resumes tab of /profile. Clicking it creates a new blank lane with starter
sections (Contact, Summary, Experience, Skills, Education) pre-populated and
immediately opens the Resume Builder.
Resume Builder /profile/resumes/[id]/builder
Structured source editor for each resume lane — works for both PDF-extracted and from-scratch resumes:
- Parses the uploaded resume into editable sections, or starts from blank starter sections when the lane was created from scratch.
- Preserves custom sections such as Recognition when detected.
- Supports editing, adding, removing, renaming, and reordering sections.
- Add section menu — dropdown picker with section types: Summary, Key Achievements, Experience, Skills, Awards & Recognition, Education, Custom.
- Add role / Add entry buttons inside Experience and Education sections to append additional entries without leaving the section.
- ✨ Improve with AI — available on Summary, Key Achievements, Skills, Awards & Recognition, Experience bullets, and Custom sections. Sends the section content to the active AI provider, which returns an improved version. The suggestion is shown inline with Accept and Discard buttons; the original is preserved until the user accepts.
- Helpful placeholder text in every input guides users building from scratch.
- Uses the same split editor/preview layout as the generated resume editor, so source edits can be checked against the rendered resume while reviewing.
- Saves a draft or approves the lane version used by job-specific generation.
- Remove button in the builder header — deletes the resume lane from the system after inline confirmation (“Delete this resume? / Yes, delete / Cancel”). Available for all resumes, not just new ones.
- Back button — navigates to
/resumes. For newly created (unsaved) resumes, clicking Back shows a leave confirmation dialog with four choices:- Save draft and leave — saves the current state as a draft, then navigates away.
- Delete and leave — permanently deletes the resume lane.
- Leave without saving — navigates away without saving (lane is kept but blank).
- Keep editing — dismisses the dialog and stays on the page.
The browser’s native
beforeunloadprompt also fires if the user tries to close the tab or navigate directly while a new resume has not yet been saved.
The HTML resume template renders experience entries with the organization and location left-aligned and the date range right-aligned on the same line, matching standard resume layout conventions.
Generated documents — tailored resumes produced for specific jobs:
- Table showing job, lane used, keyword coverage %, generation date, and status.
- Column filters and saved filter presets on the generated documents table.
- Links to preview HTML and download PDF.
- Delete document action.
Resume Editor /generated-documents/[id]/edit
Full draft editor for a tailored resume before exporting to PDF:
- Edit generated sections: summary, experience bullets, skills, recognition, and custom sections carried from the approved lane.
- Keyword coverage tracker updates as you edit.
- Save draft and regenerate PDF buttons.
Resume Preview /generated-documents/[id]/preview
Read-only HTML preview of the tailored resume.
Interview Prep /interview-prep
Tools to prepare for interviews using stored experience.
STAR story bank:
- Add stories manually or transcribe from voice recording.
- Each story has: title, situation, task, action, result, reflection.
- Tag stories with skills and themes.
- Stories can be linked to a specific job for context.
Voice practice:
- Record a spoken answer using the browser microphone.
- AI transcribes the answer using Whisper (OpenAI) or Gemini.
- AI parses the transcription into STAR structure.
- Save the parsed story to the story bank.
Profile /profile
Career profile editor. The profile is the foundation for all evaluations and
resume tailoring. The page is split into six tabs, navigated via URL
(?tab=<id>), each with its own save action.
The AI extraction card is always visible on the Overview tab as a 2-step flow. Step 1 shows active (blue) when no PDF has been uploaded, and green ✓ once a PDF is ready. Step 2 (Extract button) is disabled until Step 1 is complete. The Resumes tab shows an upload banner when no extracted resumes exist.
Tab: Overview (?tab=overview)
- Summary card: name, current search goal, location, portfolio, urgency, direction.
- AI profile extraction card — 2-step flow: Step 1 (upload) shows active/✓ state; Step 2 (Extract with AI button) is disabled until at least one resume PDF is uploaded. Runs AI extraction on all uploaded resumes and populates skills, role directions, and experience automatically.
- Edit form: current search goal, search direction, urgency (select), career intent, career change interest, confidence level.
Tab: Resumes (?tab=resumes)
- Upload banner (shown when no extracted resumes exist): instructs the user to upload a PDF, then go to Overview to run extraction.
- Resume lanes card — each lane is a different resume version. Per-lane actions:
- Upload PDF (blue solid button): shown when the lane has no PDF; opens file picker, uploads and auto-extracts text.
- Replace PDF (outlined button): shown when the lane already has content; replaces the file and re-extracts.
- Edit resume / Edit approved version (text link): always shown for every lane; opens the Resume Builder for that lane.
- Remove (text link): always shown for every lane; deletes the entire resume lane after inline confirm (“Remove this resume? / Yes, remove / Cancel”). This replaces the old PDF-only removal behavior — the lane itself is deleted.
- Rename (✎ pencil icon): inline rename with keyboard support (Enter saves, Escape cancels).
- Add resume (PDF) button at the bottom of the lanes list: creates a new empty lane named “New Resume”. User then renames it and uploads a PDF.
- Create new resume button: creates a blank lane with starter sections (Contact, Summary, Experience, Skills, Education) and opens the Resume Builder immediately — no PDF required. User types or pastes their content directly.
- Skill inventory card (shown only after at least one AI extraction): lists extracted skills with category and evidence source.
Tab: Skills & Roles (?tab=skills)
- Read-only badge displays for: strongest skills (from AI extraction), skills to use more, skills to use less, target roles.
- Edit form: target roles (one per line), skills to use more (one per line), skills to use less (one per line).
Tab: Preferences (?tab=preferences)
- Summary cards: location mode, compensation, desired industries, preferred locations.
- Edit form: location mode checkboxes (
Remote,Hybrid,On-site), preferred locations, desired industries, compensation needs, and free-form work preferences. - Preferred locations use a city lookup field backed by OpenStreetMap
Nominatim. The selected saved value should include city, state/region when
available, and country, for example
Nashville, Tennessee, United StatesorMinsk, Belarus. Each saved place displays as one label; legacy split values such asNashville,Tennessee,United Statesare normalized back into one preferred-location label. - Work preferences are reserved for non-location preferences such as
small team,async-first, ormission-driven; location modes are stored separately.
Tab: Constraints (?tab=constraints)
- Read-only list of current constraints and deal breakers.
- Edit form: constraints (soft limits, one per line), deal breakers (hard-no conditions flagged as red flags in evaluations, one per line), career change interest.
Tab: Writing Voice (?tab=voice)
- Displays the current tone profile if already extracted (tone, formality, sentence style, style guide).
- Form to paste 2–5 writing samples (emails, cover letters, LinkedIn posts)
separated by
---. Submitting runs AI style extraction and saves the tone profile. Used to match AI-generated content to the user’s authentic voice.
Strategy /strategy
Role-fit map derived from the profile and skill inventory.
- Direct fit roles: score ≥ 80, strong evidence across the profile.
- Adjacent roles: score 60–79, achievable with some positioning.
- Selective roles: score 40–59, situational fit depending on the company.
- Avoid roles: score < 40, significant gaps or misalignment.
Each archetype shows a score, rationale, and gap list. The user can edit the classification or rationale to correct AI judgments.
The page has two tabs:
- Strategy (default) — role-fit map, search focus, how-to-use guide, and evaluation corrections.
- AI Prompts — prompt overrides for resume tailoring, application answers, and outreach. Prompt overrides are stored locally and can be reset to the app defaults; locked resume-safety rules remain enforced in code.
Analytics /analytics
Search performance metrics drawn from actual evaluation and application data.
Charts and metrics:
- Score-to-outcome correlation: do high-score jobs convert to interviews?
- Archetype performance: which role types get the most responses.
- Remote policy conversion: how remote / hybrid / onsite jobs track through the funnel.
- Gap coverage: what percentage of evaluated gaps have been addressed.
- Application funnel conversion rates.
Settings /settings
Three configuration tabs:
AI Providers
- Set active AI provider: Anthropic (Claude), OpenAI (GPT), or Google (Gemini).
- Enter API keys for each provider.
- Select model per provider.
- Set optional fallback provider.
- Test connection to verify the key and model work.
Job Sources
- All configured sources appear in a unified table — companies from
portals.example.ymland any manually added sources are treated equally. - Enable or disable individual sources (disabled sources are skipped on the next scan).
- Column filters and saved filter presets on the sources table.
- Sources from
portals.example.ymlcannot be removed (they reload from the config file); manually added sources have a Remove button. - Add any company by pasting its careers page URL — Greenhouse, Ashby, and Lever are auto-detected.
- “Scan for new sources” discovers additional Greenhouse boards automatically.
Preferences
- Edit title include / exclude filters.
- Add profile supplements for gap filling. Supplements are checked for concrete role, project, action, and outcome detail before they are treated as confirmed resume-tailoring context.
- Adjust other search preferences.
AI Capabilities
The app supports three AI providers interchangeably:
| Provider | Default model | Used for |
|---|---|---|
| OpenAI | gpt-5.4-mini | Evaluation, answers, outreach, research, transcription |
| Anthropic | claude-sonnet-4-6 | Evaluation, answers, outreach, research |
| Google Gemini | gemini-2.5-flash | Evaluation, answers, outreach, research, transcription |
The active provider is set in Settings. If the active provider fails, a fallback
provider can be configured. All AI calls use the src/lib/ai/ provider
abstraction with retry logic.
AI-powered features:
- Job fit evaluation (streaming, real-time output)
- Resume tailoring
- Application answer generation
- Company research
- Outreach message drafting
- Profile extraction from PDF
- STAR story transcription and parsing
- Gap response polishing
- Writing style extraction
Job Scanning
The scanner discovers new jobs from ATS APIs (Greenhouse, Ashby, Lever) and custom URLs configured in Settings.
How a scan works:
- User clicks “Scan for new jobs” on the Dashboard.
- The scanner queries each enabled source for open roles.
- Title filters remove irrelevant roles.
- Profile location and remote preferences remove listings outside the user’s constraints.
- Duplicate URLs are skipped.
- New jobs are written to the
jobstable withstatus = found. - A
scan_runsrecord is created with metrics. - The Dashboard updates with the scan summary.
The Jobs page can also verify whether saved postings still exist. The liveness
check updates liveness_status but does not automatically archive or delete
anything. Expired jobs with no user activity are shown for confirmation before
deletion. Jobs with activity, such as reviewed, skipped, resume-generated, or
applied jobs, are kept unless the user explicitly selects and deletes them.
The Jobs table also re-checks current profile preferences at render time and is
refreshed after Preferences or Constraints are saved. Jobs that still fit show
Match in the Preference column; jobs that no longer fit show Out of scope.
Location matching uses the selected Location mode checkboxes:
Remoteincludes all remote opportunities, even if the posting mentions a region outside the preferred locations.Hybridincludes hybrid opportunities only when the posting location matches one of the preferred locations.On-siteincludes on-site opportunities only when the posting location matches one of the preferred locations.
Configuration:
- Built-in sources: enable/disable per company in Settings → Job Sources.
- Custom sources: add any careers page URL.
- Title filters: positive list (must match) and negative list (exclude if matched).
- Profile filters: selected location modes and preferred locations constrain scan inserts.
Browser Job Board Scanner (Claude and Codex Integration)
An optional feature for users with Claude Desktop or Codex Chrome. An agent browses visible job-board results on your behalf and writes discovered jobs directly into Job Search Terminal — no copy-paste required. Supported browser-board sources are LinkedIn, Wellfound, and Work at a Startup.
How it works:
- Ask Claude or Codex to scan LinkedIn, Wellfound, or Work at a Startup
- The agent reads your target roles and location preferences from the JST database
- The agent opens the requested board in Chrome and extracts matching visible postings
- A JSON file is written to
data/job-board-imports/(data/linkedin-imports/remains supported for legacy LinkedIn files) - Job Search Terminal detects the file, imports jobs with duplicate detection, and shows a notification
UI indicators on the Jobs table:
- LinkedIn, Wellfound, or Work at a Startup badge (neutral gray) — source column — identifies jobs discovered via browser-board scans
- Manual badge (neutral gray) — source column — identifies jobs added manually via the Add Job modal
- Duplicate badge (amber, clickable) — flagged jobs whose URL or company+title already existed in the database. Clicking the badge instantly filters the table to show only duplicate-flagged jobs. Clicking again clears the filter.
- Source column — filterable and sortable; options are “LinkedIn”, “Wellfound”, “Work at a Startup”, “Manual”, and “Scanner”
URL behavior: Browser-board imports prefer a visible job-specific employer/ATS apply URL. If one is not available, the platform job URL is used and preserved as provenance.
Duplicate detection: Jobs are marked as possible duplicates (not dropped) when their original posting key, URL, or company+title+location matches an existing record. The user can review and act on flagged jobs normally.
Import notification: A fixed-bottom green alert appears on the Jobs page within 30 seconds of a completed import, showing the count of new jobs and duplicates. Auto-dismissed after 5 minutes.
Requirements: Claude Desktop with Claude in Chrome, or Codex with the Codex Chrome Extension. The user must already be logged into boards that require a session.
Full documentation:
- User guide:
docs/linkedin-scanner-guide.md - Technical reference:
docs/browser-board-scanner-technical.md - Agent instructions:
CLAUDE.mdandAGENTS.md
Data and Privacy
- All data is stored locally in
data/job-search-terminal.sqliteon the user’s machine. - No data is sent to any server except AI provider API calls (evaluation, generation, etc.).
- The database file is excluded from git.
- Backup:
npm run data:backupwrites a SQLite snapshot tooutput/backups/. - Export:
npm run data:exportwrites a JSON snapshot tooutput/exports/. - To reset all data:
npm run db:reset(drops local data and initializes an empty profile).
Inspired by Career-Ops
Job Search Terminal was inspired by Career-Ops by Santiago Fernández.
Career-Ops is a powerful MIT-licensed AI job-search system built around agentic CLI workflows, Claude Code, Gemini CLI, job scanning, scoring, tailored PDF generation, and pipeline tracking.
Job Search Terminal follows a different product direction: a local-first visual dashboard with guided setup, structured application tracking, resume lanes, interview prep, and support for OpenAI, Anthropic, and Google Gemini.
Both projects share the same basic belief: job seekers need better tools, and those tools should not add more friction to an already exhausting process.
Career-Ops GitHub repository · Career-Ops system article
| Career-Ops | Job Search Terminal |
|---|---|
| CLI / agentic workflow | Browser-based visual dashboard |
| Optimized for Claude Code and power users | Designed for broader job seekers |
| Markdown, YAML, TSV, and generated reports | SQLite-backed local app |
| Strong batch automation | Strong application tracking and UX flow |
| Terminal dashboard | Web dashboard with guided setup |
| Claude Code first | OpenAI, Anthropic, and Gemini provider support |
| MIT licensed | CC BY-NC 4.0, non-commercial use only |
Want to help improve it?
This started as a practical tool for people trying to survive the job search. It can become better if more people touch it.
Developers can help simplify installation, improve scanning, package the app, and fix bugs.
Designers can help improve onboarding, accessibility, empty states, and workflow clarity.
Career coaches and job seekers can help test the real-world process and tell us where the app breaks down.
If you want to contribute, start with the GitHub repository or reach out to me directly.
Job Search Terminal is a free, source-available tool licensed for non-commercial use under CC BY-NC 4.0. It does not guarantee interviews, job offers, recruiter responses, or application outcomes. You are responsible for reviewing all generated content before using it. You are also responsible for following the terms of service of any job boards, AI providers, or third-party services you choose to use.
License
Job Search Terminal is licensed under Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
You may use, share, and adapt it for non-commercial purposes with attribution.
Commercial use is not permitted without written permission from the copyright holder.
View license: https://creativecommons.org/licenses/by-nc/4.0/