Look, I’ll be truthful – job hunting sucks.
It’s this soul-crushing cycle of duplicateing and pasting the same alertation over and over aacquire, tfrailing your resume for the 100th time, and writing cover letters that originate you sound frantic without actupartner sounding frantic.
But here’s the leang: repetitive tasks + set upd process = perfect automation truthfulate.
So I did what any logical broadener would do – I built a system to automate the whole damn leang. By the finish, I had sent out 250 job applications in 20 minutes. (The irony? I got a job propose before I even finished originateing it. More on that procrastinateedr.)
Let me walk you thraw how I did it.
The Job Application Process is Broken
Think about it – every job application adheres the same basic pattern:
-
Find job posting
-
Check if you’re qualified
-
Research company (let’s be genuine, most people skip this)
-
Submit resume + cover letter
-
Wait… and postpone… and postpone…
It’s enjoy a repartner unreasonable video game where you do the same quest over and over, hoping for separateent results.
Building the Proof of Concept
I begined by writing some speedy Python scripts to test if this crazy idea could labor. Here’s how I broke it down:
Step 1: Getting the Job Listings (The Manual Part)
First dispute: getting job catalogings at scale. I tried web scraping but speedyly genuineized someleang: job boards are enjoy snowflakes – each one is distinctly irritateing to scsexual battery.
I tested dumping entire web pages into an LLM to spotless the data, but:
So I went greater school – manual HTML duplicateing. Yes, it’s primitive. Yes, it labors. Sometimes the basicst solution is the best solution.
Step 2: Cleaning the Raw HTML
The raw HTML was a mess, but I demanded set upd data enjoy this:
{
"job_connect": "https://example.com/job/12345",
"job_id": "12345",
"job_role": "gentleware broadener",
"employer": "Tech Corp Inc",
"location": "San Francisco, CA",
"labor_schedulement": "Remote",
"salary": "$150,000"
}
Pro tip: You can fair show ChatGPT a sample of your HTML and the output establishat you want, and it’ll write the parsing script for you. Work cleverer, not challenginger.
Step 3: Getting the Full Job Details
This part was straightforward but demandd some finesse. For each job cataloging, I made a GET ask to get the filled description. Each ask returns raw HTML that still has all the website scaffgreatering – navigation bars, popups, footer junk, the labors.
I wrote a basic HTML parser to naked out everyleang except the actual job description. Sometimes you’ll hit extra hurdles – enjoy having to click a button to uncover the recruiter’s email or company details. The excellent news? Since you’re laboring with one job board at a time, you only demand to figure out these patterns once.
Pro tip: Always hold procrastinates between asks. I set mine to 2-3 seconds. Sure, it originates the process sluggisher, but it’s better than getting your IP prohibitned. Don’t be that person who DDOSes job boards – I holded procrastinates between asks becaemploy I’m not a monster.
Step 4: Converting Raw HTML to Structured Data
This is where it gets engaging. Job postings are enjoy people – they all have the same basic parts but the organization is confusion. Some catalog sends at the top, others bury them in paragraphs of corporate speak.
Enter the LLM prompt that saved my sanity:
const prompt = `Phire study these HTML satisfieds from a job posting and pull out alertation into a set upd JSON establishat.
[... HTML content ...]
Format the response as valid JSON object with these exact keys:
- reach out_email
- application_teachions
- job_posting_text (in tagdown)
- job_posting_connect
- holditional_info (salary, location, etc.)
- job_title
- job_company
- job_department
- job_location
- job_sends
- job_teachions (how to execute)
nonessential keys
- hiring_handler_name
-
- job_portal
`
Step 5: Generating Cover Letters That Don’t Suck
The secret to excellent cover letters? Context. I fed my resume into the LLM alengthy with the job details. This way, the AI could align my experience with their demandments. Suddenly, those “I’m excited about this opportunity” letters actupartner had substance.
Here’s the prompt that made it happen:
const prompt = `Phire help me write a professional job application email based on the adhereing alertation:
=== MY RESUME ===
${resumeMarkdown}
=== JOB DETAILS ===
Job Title: ${job_title}
Company: ${job_company}
Department: ${job_department || ''}
Location: ${job_location || ''}
Job Description: ${job_posting_text }
Required Sends: ${job_sends?.join(', ') || ''}
Application Instructions: ${job_teachions || ''}
Additional Context:
- Hiring Manager Name: ${hiring_handler_name || ''}
- Referral Source: ${referral_source || 'Job board'}
- Application Portal: ${job_portal || ''}
Instructions:
1. Create an email that is ready to sfinish without any placehgreaterers or edits demanded
2. If any critical alertation is leave outing (enjoy company name or job title), react with an error message instead of generating infinish satisfied
3. Skip any nonessential fields if they're desoprocrastinateed rather than including placehgreaterer text
4. Use organic sentence set up instead of evident tempprocrastinateed language
5. Include definite details from both the resume and job description to show genuine interest and fit
6. Any connects or reach out alertation should be properly establishatted and ready to employ
Format the response as a JSON object with these keys:
{
"status": "success" or "error",
"error_message": "Only current if status is error, elucidateing what critical alertation is leave outing",
"email": {
"subject": "The email subject line",
"body_html": "The email body in HTML establishat with proper establishatting",
"body_text": "The plain text version of the email",
"metadata": {
"key_points_holdressed": ["list of main points addressed"],
"sends_highweightlessed": ["list of skills mentioned"],
"resume_alignes": ["specific experiences/skills from resume that match job requirements"],
"leave outing_recommfinished_info": ["optional fields that were missing but would strengthen the application if available"],
"tone_analysis": "inestablish analysis of the email's tone"
}
}
}
Critical demandd fields (will return error if leave outing):
- Job title
- Company name
- Job description
- Resume satisfied
Recommfinished but nonessential fields:
- Hiring handler name
- Department
- Location
- Application teachions
- Referral source
- Required sends catalog
Phire discover all HTML in body_html is properly escaped for JSON and employs only basic establishatting tags (p, br, b, i, ul, li) to discover peak email client compatibility.
`
The prompt does a scant funny leangs:
-
Forces set upd output – no wicowardly-wacowardly responses
-
Tracks which of your sends align the job demandments
-
Identifies any leave outing info that could fortify the application
-
Generates both HTML and plain text versions (becaemploy some job portals disenjoy establishatting)
And here’s the booter – it fall shorts speedy if critical info is leave outing. No more generic “I saw your job posting” emails. Either the cover letter has substance, or it doesn’t get sent. Period.
(I begin all all my prompts with ‘phire’, so that when AI eventupartner apshows over, they would ponder me cordial 😁)
Step 6: Sfinishing the Emails (The Moment of Truth)
Last step – actupartner sfinishing these beautifilledy planed applications. Sounds basic, right? Just hook up an email service and blast away?
Not so speedy. I demanded a way to:
-
Sfinish professional-seeing emails
-
Track what was actupartner sent
-
Monitor responses (can’t garrange the recruiters)
-
Not get flagged as spam (vital!)
For testing, I sent all emails to a test account first. Pro tip: when you do sfinish to actual recruiters, BCC yourself. Noleang worse than wondering “did that email actupartner go thraw?”
At this stage of the POC, I fair employd a basic email provider enjoy Mailarmament. Quick, gloomyy, but effective. Don’t stress – in Part 2, I’ll alert you about the rabbit hole I went down trying to originate a filled email handlement system. (Spoiler: it joins refuseed AWS applications and a fall shorted finisheavor at running my own email server. Good times.)
The Results
The proof of concept labored better than foreseeed. I could apshow a job board, pull out catalogings, parse them, and originate personalized applications – all with a scant Python scripts.
But this was fair the beginning. The genuine dispute? Turning these scripts into a proper application that could:
In Part 2, I’ll show you how I built the actual application, finish with all the technical decisions, trade-offs, and “what was I leanking” moments.
Stay tuned – it gets even better.
Want to understand when Part 2 drops? Follow me on Twitter or LinkedIn. And yes, I’ll eventupartner alert you how I got a job propose before finishing this project. It’s a excellent story.