Skip to content
All work

Agents and tools

Jobrunner

A local-first job application agent where the model proposes and a policy gate decides.

PrototypeNo public link

Jobrunner finds internship and early-career postings, removes duplicates, filters them, and fills applications on employer sites with a browser agent.

The model never touches the browser directly. It proposes one validated action at a time, a policy layer checks it, and exactly one code path can press submit. CAPTCHAs, assessments and sensitive questions always go to a person.

Status
Complete against its fake ATS. The real-site adapters are tested against fixtures, not live employer sites.
Stack
TypeScript, Node.js, Fastify, React, BullMQ, Prisma, Postgres, Playwright, Zod

Why it exists

Every mistake an application agent makes goes out under the applicant's real name, so the model can't be the thing in charge.

CAPTCHAs and assessments need a person. One pause can't be allowed to hold up every other application in the queue.

Try it

One fictional application, step by step, including what the policy gate refuses. This is a faithful demo built for this site with fictional data, not the product itself.

Application replay · Faithful demo · fictional data

One run through it

  1. Check the posting

    A posting is deduplicated, filtered, re-checked as still open and queued.

  2. Clear the limits

    The worker checks the daily cap and the site's circuit breaker, then takes a lock.

  3. Fill the form

    Answers come from the profile, the answer bank and learned answers, then generated text for required questions that aren't sensitive.

  4. Hand off when stuck

    An unknown question or a CAPTCHA pauses that one application. Discord carries the request and a single-use takeover link.

  5. Audit, then submit

    An audit, a screenshot, an optional review, then the click.

  6. Confirm it

    A confirmation only counts if it follows the agent's own click.

What it does

  • Discovery to queue

    Sources, normalize, deduplicate, filter, validate the posting, queue.

  • Adapters

    Greenhouse, Lever, Ashby and Workday, plus a generic agent for everything else.

  • Layered browser agent

    Perception, deterministic classification, planning, policy check, execution, verification.

  • Provenance

    Every filled value has to trace to the profile, an approved answer, or a reply from the person.

  • Human checkpoints

    No CAPTCHA solving, no assessments, no demographic answers. Those pause for a human.

  • A fake applicant tracking system

    Thirteen scenarios for end-to-end tests that never touch a real employer.

Why it's built this way

  • No model in the answer matcher

    Learned answers are matched without a model and the profile always wins, so the agent can't invent facts about you.

  • Status and audit commit together

    They share one transaction, so two racing workers can't both win.

  • Reject one, distrust all

    A rejection at final review distrusts every learned answer that was used, instead of guessing which one was wrong.

How it fits together

  1. 01TypeScript monorepo: worker, API, dashboard, CLI and the fake ATS.
  2. 02BullMQ queues on Redis; Prisma on Postgres with an audited state machine.
  3. 03Planner order: deterministic rules first, then saved recipes, then the model.

In plain terms

ATS
Applicant tracking system, the software employers use to collect applications.
Policy gate
A check outside the model that approves or refuses each action it proposes.
Provenance
A record of where each filled-in value came from.
Circuit breaker
Stops trying a site after repeated failures.
State machine
A fixed list of allowed status moves.