Skip to content

pranayesse/job-alert-tracker

Repository files navigation

Job Alert Tracker

Tired of losing track of jobs you saw in an email three days ago? This pulls every LinkedIn and Indeed job alert from your Gmail, parses out the role, company, and location, and drops it into an Airtable dashboard where you can mark each one as Open, Applied, or Not Relevant — without touching a spreadsheet or copy-pasting a single link.

Runs automatically every 5 hours in the background. No browser tab to keep open, no SaaS subscription, no monthly fee.


What it looks like

Your Airtable base ends up as a clean grid of every job that hit your inbox:

Title Company Location Source Status Job URL
Senior Security Engineer Ericsson Bengaluru LinkedIn Open [link]
AI GRC Director EC-Council Remote Indeed Applied [link]
Security Analyst III Avaya Bengaluru LinkedIn Not Relevant [link]

From there you can filter by status, sort by date, or switch to a Kanban view grouped by status if that's more your thing.


How it works

Gmail (job-alerts label)
        │
        ▼
  gmail_reader.py          ← OAuth2, fetches emails from last N days
        │
        ├── parsers/linkedin.py   ← extracts jobs from LinkedIn alert emails
        └── parsers/indeed.py     ← extracts jobs from Indeed alert emails
                │
                ▼
        airtable_client.py       ← deduplicates, batch-pushes to Airtable
                │
                ▼
         Airtable dashboard       ← you mark: Open / Applied / Not Relevant

Three layers of deduplication so the same job never shows up twice — within an email, across emails in the same sync, and across all historical syncs.


Setup

1. Clone and install

git clone https://github.com/pranayesse/job-alert-tracker.git
cd job-alert-tracker
pip3 install -r requirements.txt

2. Gmail — label your job alerts

In Gmail, create a filter that applies a label called job-alerts to emails from:

  • jobalerts-noreply@linkedin.com
  • donotreply@jobalert.indeed.com

Then set up OAuth credentials to read your Gmail:

  1. Go to console.cloud.google.com → create a project
  2. Enable the Gmail API
  3. Create an OAuth client ID (Desktop app) → download as credentials.json into this folder
  4. Add your Gmail address as a test user under OAuth consent screen
  5. First run opens a browser tab to authorize — after that it's token-based

3. Airtable — create your dashboard

  1. New base → name it Job Tracker
  2. Rename the default table to Jobs
  3. Add these fields:
Field Type
Title Single line text
Company Single line text
Location Single line text
Remote Checkbox
Source Single select → LinkedIn, Indeed
Job URL URL
Email Date Date
Status Single select → Open, Applied, Not Relevant
  1. Get your API token at airtable.com/create/tokens — scopes: data.records:read, data.records:write
  2. Your base ID is in the URL: airtable.com/appXXXXXXXXXXXXXX/...

4. Configure

cp .env.example .env
# fill in your Airtable token and base ID

5. Seed it with past alerts

python3 main.py 30    # pull the last 30 days of alerts

6. Schedule it (macOS)

# Runs every 5 hours. Fires on wake if your Mac was sleeping.
launchctl load ~/Library/LaunchAgents/com.pranay.job-tracker.plist

To create the plist, copy this into ~/Library/LaunchAgents/com.pranay.job-tracker.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.pranay.job-tracker</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/python3</string>
        <string>/path/to/job-alert-tracker/main.py</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/path/to/job-alert-tracker</string>
    <key>StartInterval</key>
    <integer>18000</integer>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/path/to/job-alert-tracker/job_tracker.log</string>
    <key>StandardErrorPath</key>
    <string>/path/to/job-alert-tracker/job_tracker.log</string>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

Check the log anytime:

tail -f job_tracker.log

Adding more job sources

The parser directory is intentionally modular. To add Naukri, Glassdoor, or any other source:

  1. Add their sender to your Gmail job-alerts filter
  2. Create parsers/naukri.py with a parse(text_body, email_date) function that returns a list of job dicts
  3. Add the source detection in main.py

No changes needed to the Gmail fetcher, deduplication logic, or Airtable client.


Stack

  • Python 3.10+
  • Gmail API (read-only OAuth scope)
  • Airtable API via pyairtable
  • macOS launchd for scheduling (no cron, no server)

Why not just use a job board aggregator?

Most of them show you everything. This only shows you jobs that landed in your alerts — roles that already match your saved search criteria. The Airtable layer is just a persistent, sortable memory on top of what Gmail already delivers.


License

MIT

About

Automatically pulls LinkedIn & Indeed job alerts from Gmail and syncs them to an Airtable dashboard with Open/Applied/Not Relevant tracking. Zero manual copy-paste.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors