Job hunting while employed is exhausting. You have maybe 30 minutes a day to check boards, read listings, and draft applications. I automated most of it with an Electron app, a SQLite database, and the Claude API.
The problem
I was applying for developer roles while still working full time. The manual workflow was: check Indeed, check LinkedIn, check Drupal.org jobs, check Upwork, copy-paste interesting ones into a spreadsheet, write a cover letter, send it, forget about it. I wanted something that would do the checking and drafting automatically.
The architecture
A Node.js Electron app with three main components: a scraper that runs on a schedule, a SQLite database for storing and deduplicating listings, and a Claude API integration for scoring listings and drafting cover letters.
// Scorer — sends job description + CV to Claude API
async function scoreJobListing(listing, cvText) {
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 500,
messages: [{
role: 'user',
content: `Score this job listing 1-10 for fit with this CV.
Return JSON: { score, reasons, redFlags }
CV: ${cvText}
Job: ${listing.description}`
}]
});
return JSON.parse(response.content[0].text);
}The cover letter prompt matters a lot. Generic prompts give generic letters. I spent a day refining a prompt that instructs Claude to reference specific technologies from the job description, match the tone of the company's own writing, and lead with the most relevant experience. The quality difference is significant.
AppleScript Mac Mail integration
Once a letter is drafted and reviewed, a single button click triggers an AppleScript that opens Mac Mail, creates a new email to the recruiter's address, pastes the subject and body, and focuses the compose window. I still review and send manually — I just don't have to type anymore.
Results
Over three months of active job hunting, the app saved me roughly 2–3 hours per week on sourcing and drafting. More importantly it meant I applied to more jobs consistently — not just the ones I happened to check on a given day.