Repository navigation
Job Sources
| Source | How | Filter | Change it in |
|---|---|---|---|
| Company career boards | Public Greenhouse, Ashby and Lever job APIs, read directly | Engineering titles, remote and open to India (or worldwide / APAC / plain "Remote"), posted in the last 30 days |
BOARDS in app/boards.py
|
| Instahyre | The site's public search API, then the JSON-LD on each job page | "Work From Home", postings from the last 30 days |
QUERIES, YEARS in app/instahyre.py
|
The bundled linkedin-search CLI |
Location India, remote, posted in the last 14 days, 20 per query |
LINKEDIN_QUERIES in app/pipeline.py
|
|
| freehire | The bundled freehire-search CLI |
Remote, India and global, last 14 days |
FREEHIRE_QUERIES in app/pipeline.py
|
These are the employers' own listings: no aggregator, no reposter, no stale copies. Each entry in BOARDS is (ats, token, company name):
("greenhouse", "gitlab", "GitLab"),
("ashby", "notion", "Notion"),
("lever", "<token>", "<Company>"),The token is the name in the company's job-board URL:
| ATS | Job board URL | Token |
|---|---|---|
| Greenhouse | job-boards.greenhouse.io/gitlab |
gitlab |
| Ashby | jobs.ashbyhq.com/notion |
notion |
| Lever | jobs.lever.co/acme |
acme |
To check a token works: curl -s https://boards-api.greenhouse.io/v1/boards/<token>/jobs | head -c 300 (Ashby: https://api.ashbyhq.com/posting-api/job-board/<token>, Lever: https://api.lever.co/v0/postings/<token>?mode=json).
Title rules (engineering()): keeps engineer, developer, architect, SRE, scientist, ML/AI, DevOps roles; drops sales, account, manager, director, recruiting, intern, marketing, design, QA/test and support roles.
Location rules (remote_for_india()): drops anything marked hybrid, on-site or in-office; needs a remote signal; then accepts India and Indian cities, worldwide / global / APAC / Asia, or plain "Remote". "Indiana, USA" does not count as India.
AGGREGATORS in app/pipeline.py lists about 40 names (Jobgether, Weekday, Turing, Crossover, Toptal, Mercor, Braintrust, Uplers, Talent500, Hirist, Lensa, Jooble, Dice, staffing firms ...). A job is dropped when one appears as a whole word in its company name or its link, which also catches jobs reposted under the client's name. The triage prompt drops "hiring for our client" listings too.
The defaults target remote roles open to India. To change that:
-
scrape()inapp/pipeline.py: change"--location", "India"for LinkedIn and the freehire--country IN. -
app/boards.py: change theINDIApattern to your country and cities, and the docstring. -
app/instahyre.pyis India-only; remove it fromscrape()if it does not apply. - Your deal-breakers in
CLAUDE.md(location, hours, salary floor) drive triage, scoring and drafting.
Write a small module like app/instahyre.py that returns jobs as {id, title, company, url, location, portal} (plus description if you have the full text), add it to scrape(), and add a branch in details() if the text needs a second request. Respect the site's robots.txt and terms.
Apply Desk · MIT · Built on AI Job Search · Screenshots use fictional demo data
Get started
Using it
- Dashboard Tour
- Daily Search Pipeline
- Job Sources
- Gmail Tracking
- Drafts and Interview Prep
- Schedules and Notifications
Reference
Help