Skip to content
Agentmart
Submit a tool

job-search

Source remote job postings from public boards (Greenhouse boards, HN Who-is-hiring, RemoteOK, LinkedIn via the browser harness, direct URLs), filter them for…

Skill by cheshirecode

IndexedUnlicense
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/cheshirecode-job-search

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Source remote job postings from public boards (Greenhouse boards, HN Who-is-hiring, RemoteOK, LinkedIn via the browser harness, direct URLs), filter them for a target market, and persist the pool into a `_worklog` program. Mechanical sourcing only; tailoring and application packages belong to `job-application`.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/job-search

What's inside

Skill name
job-search
Description
Source remote job postings from public boards (Greenhouse boards, HN Who-is-hiring, RemoteOK, LinkedIn via the browser harness, direct URLs), filter them for a target market, and persist the pool into a `_worklog` program. Mechanical sourcing only; tailoring and application packages belong to `job-application`.
License
Unlicense
Instructions
84 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts

Files (11)

  • SKILL.md
  • greenhouse-board.py · bin/
  • hn-wih.py · bin/
  • hn-wih.sh · bin/
  • jd-pull.py · bin/
  • linkedin-jobs.py · bin/
  • pool-append.py · bin/
  • remoteok.py · bin/
  • remotive.py · bin/
  • workingnomads.py · bin/
  • test_parsers.py · tests/

SKILL.md (first lines)

# job-search

Scripted sourcing of remote job postings into a filtered, persistent pool.
This skill owns the mechanical parts: fetch, filter, render, append. Judgment
parts (fit assessment, tailoring, applying) are out of scope — hand a target
to the `job-application` skill once shortlisted.

## When to use

- User asks to find remote jobs in a market (e.g. Canada) from named boards or companies.
- A `_worklog` job-search program exists (or should be created) as the pool hub.

## Source ladder — cheapest first

1. **Public boards via HTTP** (no browser): `greenhouse-board.py` (with
   `--jd <id>` for full JD text), `hn-wih.py` (with `--max-age-days`),
   `remoteok.py`, `remotive.py`, `workingnomads.py`. Run these before any browser work. Himalayas.app has a paginated JSON API (`/jobs/api`, thin per page). Working Nomads yield skews agency-mediated (Lemon.io, Proxify) — flag those as staffing roles.
   **ATS board discovery**: probe `jobs.ashbyhq.com/<slug>` /
   `boards-api.greenhouse.io/v1/boards/<token>/jobs` / `api.lever.co/v0/postings/<slug>`
   across name variants — most companies live on one of the three (observed
   2026-09: groundnews, hopper, thumbtack, ascend, xero, kake, oscilar,
   clickup, gcai→gc-ai all on Ashby; discover slugs from careers-page embeds).
   **Board notes**: arbeitnow is EU-only; jobicy returns malformed responses;
   WeWorkRemotely hard-blocks HTTP (browser only); Job Bank Canada needs
   interactive search and skews below staff-level tech; Work at a Startup
   blocks plain HTTP.
2. **Direct posting URLs**: `jd-pull.py <url>` (shared with `job-application`).
   Exit 3 means JS-only shell — escalate that URL to the browser harness.
3. **LinkedIn via the browser harness** (background tabs only): run
   `linkedin-jobs.py` under `browser-use`. Two modes:
   `LJ_MODE=keyword` (keyword + location search) and `LJ_MODE=company`
   (a company slug's `/jobs/` page). LinkedIn's AI search may rewrite filter
   URLs and drop `f_WT=2` — capture the remote flag per posting from its
   location text, never from the URL. Per-card posting URLs are frequently
   absent from the results DOM in the AI-search variant (observed 2026-09:
   one `/jobs/view/` anchor page-wide); when `url` comes back empty, take
   company + title to the direct ATS ladder (greenhouse board tokens,
   ashby board JSON) instead of fighting the page.

## Invocation

```bash
# HTTP sources (stdlib only)
skills/job-search/bin/greenhouse-board.py instacart --country canada --remote-only
skills/job-search/bin/hn-wih.sh                     # latest Who-is-hiring month
skills/job-search/bin/remoteok.py --country canada

# LinkedIn (needs the browser-use daemon; BU_CDP_URL or local Chrome)
BU_CDP_URL=http://<host>:9223 browser-use < skills/job-search/bin/linkedin-jobs.py

# JD text for a direct URL (also: skills/job-application/bin/jd-pull.py)
skills/job-search/bin/jd-pull.py https://boards.greenhouse.io/example/jobs/123

# Persist rendered rows into the program's ## Pool section
skills/job-search/bin/pool-append.py --file people/oss/active/<program>.md \
  --source "Greenhouse instacart 2026-09-25" --rows-file rows.md
```

`linkedin-jobs.py` configuration (env): `LJ_MODE=keyword|company`,
`LJ_QUERY`, `LJ_LOCATION` (default Canada), `LJ_COMPANY` (slug),
`LJ_LIMIT` (default 8). It prints markdown rows; add `LJ_FORMAT=json` for rows
as JSON. It never activates a tab except for the one retry the harness skill
prescribes when a background scroll times out, and never types, clicks, or
applies.

## Discipline

- Read-only: fetch and extract only. No auto-apply, no form submission, no
  third-party posting. Login walls stop and ask the user.
- Posting facts rot: every persisted row carries its gather date; re-verify a
  link the day an application goes out (invariant echoed in the pool program).
- One tab per site/task; reuse a matching tab before opening a new one.

## Persistence

The pool lives in a `_worklog` program task (kind `program`, parent of any
per-target application tasks). `pool-append.py` inserts a dated `###` block
under `## Pool`; per-target tasks are created with
`"$WORKLOG_BIN/project.sh" add-child <program-slug> <child-slug> --kind=plan
--title=...` so the stub and the parent's `tasks:` entry land in one commit.
Commit subjects follow `_worklog/AGENTS.md`: `<slug>: <what changed>` with
`Worklog-Kind:` on creates.

From cheshirecode/dotfiles, Unlicense.

More from cheshirecode/dotfiles

Compare and alternatives

    Featured in

    Signals

    Stars
    0
    Forks
    0
    Open issues
    0
    Last commit (this folder)
    Sep 25, 2026 (1 month ago)

    From GitHub (fetched Oct 24, 2026).

    Details

    License
    Unlicense
    First seen
    Oct 24, 2026
    Last checked
    Oct 24, 2026

    More from cheshirecode

    Cite this page

    job-search skill. Agent Mart. https://agentmart.dev/skills/cheshirecode-job-search (last updated 2026-10-24)