Skip to content
atsfill Departures

Make your career take off

Your agent applies. atsfill checks every answer before it sends.

One CLI reads the application form on 38 hiring systems, fills it with your answers, reads each one back, and sends only when all of them match.

Gate 1 uvx atsfill install-browser
Gate 2 uvx atsfill read <posting-url>
Example run: sample postings, the kind of results atsfill prints
TimeCarrierPostingCommandRemarks
09:12 Greenhouse Acme – Backend Engineer fill READY
09:14 Ashby Northwind – Data Analyst send SUBMITTED
09:15 Lever Contoso – Product Designer send REFUSED
09:21 Workday Fabrikam – Support Lead read READY
09:34 Own careers site Litware – QA Engineer read UNSUPPORTED

From your agent to the employer

Your agent writes the answers; atsfill carries them to the hiring system and checks what it holds before anything is sent.

  1. You give your agent a posting. It already knows your profile and resume.
  2. The agent runs atsfill read on the posting.
  3. atsfill opens the form in its own browser, through that system's adapter.
  4. Every field comes back as JSON: its id, type, options and whether it is required.
  5. The agent writes answers.json from what it knows about you, one answer per field id.
  6. fill types each answer, then reads it back from the page. It never submits.
  7. Every answer read back as given: ready. A mismatch comes back refused, naming the field.
  8. Your agent asks you before it sends, and atsfill submits only on systems your config allows.
  9. send fills again, checks every answer again, and only then submits.
  10. The application reaches the employer: submitted, with the evidence of the send.

One posting, three gates

The same commands for every system. Each prints one JSON line and an exit code your agent can branch on.

  1. read lists the form

    Every field with its id, type, options and whether it is required, so the agent knows what to answer.

    $ uvx atsfill read "$POSTING"
    {"status":"ready",
     "system":"greenhouse",
     "fields":[{"id":"level",
       "label":"English level",
       "type":"choice",
       "required":true,
       "options":["Basic","Fluent"]},
       …]}
  2. fill reads every answer back

    A dry run: it fills the form, reads each field back from the page, and never submits. ready means every answer read back as given; a mismatch names the field.

    $ uvx atsfill fill "$POSTING" \
        --answers answers.json
    {"status":"ready",
     "system":"greenhouse"}
  3. send submits when all match

    Only on a system you allowed, only once per posting, and only when every answer reads back as given.

    $ uvx atsfill send "$POSTING" \
        --answers answers.json
    {"status":"submitted",
     "system":"greenhouse",
     "evidence":"https://job-boards.greenhouse.io/acme/jobs/1234/confirmation"}

Example output, shortened and wrapped: atsfill prints each result on one line.

A wrong answer never boards

AnswerFluent
Read backBasic
REFUSED

A custom dropdown kept its old value. atsfill compares each answer with what the page holds and refuses the send before the click: nothing reaches the employer, and the result names the field.

{"status":"refused",
 "system":"lever",
 "reason":"mismatch: level",
 "checks":[{"field_id":"level","read_back":"Basic"}]}

38 carriers serve this terminal

A hiring system is supported once a dry run passed on five employers. Any other one answers unsupported, so your agent can fall back to driving a browser itself.

Every hiring system mapped, and each one's form as observed

Terminal rules

Submitting is off
until you list a system under submit-allowed, in a config file the agent does not write.
One send per posting
A posting already sent is refused unless you pass --resend.
Side effects declared
Some systems save answers as they are typed. atsfill status lists what each one does before anything is sent.
Accounts handled
Where a system needs one, atsfill signs in from your password manager and types emailed codes from your mailbox command.
Telemetry you can turn off
One anonymous event per command, never your answers. What is sent.

NOW BOARDING

Gate 1 uvx atsfill install-browser
Gate 2 uvx atsfill read <posting-url>