Get job listings fast before everyone else does.
First Responder is a lightweight job scraper that monitors company career pages and sends filtered, relevant job postings directly to your Discord server.
-
Scrapes jobs from:
- Workday
- Ashby
- Greenhouse
- Hacker News
- Custom career pages
-
Keyword-based filtering (allow / deny lists)
-
Deduplicates jobs using a database
-
Fully automated with GitHub Actions
-
Discord webhook integration
- Python
- Playwright (Web scraping)
- PostgreSQL (Neon)
- GitHub Actions (CI/CD)
If you get stuck at all, check out the docs for more information.
Fork this repo, then clone your fork.
mv .env.example .env
mv docs/COMPANIES_TEMPLATE.md docs/COMPANIES.md3. Setup Database (Neon)
Run the following SQL:
CREATE TABLE companies (
id BIGSERIAL PRIMARY KEY,
company TEXT NOT NULL,
link TEXT NOT NULL,
platform TEXT NOT NULL,
UNIQUE(id, company, link, platform)
);
CREATE TABLE seen (
id BIGSERIAL PRIMARY KEY,
company TEXT NOT NULL,
title TEXT NOT NULL,
link TEXT NOT NULL,
date TEXT NOT NULL,
UNIQUE(id, company, title, link, date)
);
CREATE TABLE elements (
id BIGSERIAL PRIMARY KEY,
platform TEXT NOT NULL,
jobs_element TEXT,
titles_element TEXT,
links_element TEXT,
UNIQUE(id, platform, jobs_element, titles_element, links_element)
);- Create a channel (e.g.
first-responder) - Create a webhook
Add the db connection string and webhook URL to the .env file:
DISCORD_WEBHOOK = ""
DATABASE_URL = ""Do the same for GitHub Action Secrets:
DISCORD_WEBHOOK
DATABASE_URLuv sync
uv run playwright install
uv run main.pyEdit:
filter/filters.py
allow: job keywords you wantdeny: job keywords you don’t want
Tip: include variations like
junior,jr,jr.
Use docs/companies.md to track company career pages.
Quick ways to find them:
- Workday →
site:wd1.myworkdayjobs.com - Ashby →
site:jobs.ashbyhq.com - Greenhouse →
site:job-boards.greenhouse.io
You can bulk insert using a generated SQL statement, or add them one by one in the Neon console.
Tip: I suggest using this file to make a big list first, bulk insert into the Neon database, then use it to keep a local track of companies and add new ones directly in the Neon console.
- Smarter filtering using an LLM (job description matching)
- Local-first mode (local LLM + database)
- Better configurability
