From 57793316ab8e3889ad018e4a031c13fd82f1af8f Mon Sep 17 00:00:00 2001
From: Anthony Ettinger
+ A profile here is a resume you chose to share. There is no second form restating the + document you already wrote. +
+
+ {`# 1. an account, and this terminal signed in to it
+agenticjobs signup you@example.com
+
+# 2. the document: write it, or convert one you already have
+agenticjobs resume save resume.md --title "Backend engineer"
+agenticjobs resume import ~/cv.pdf # pdf, docx, txt or md
+
+# 3. list it, which is a separate decision from saving it
+curl -X PATCH ${publicUrl}/api/v1/resumes/SLUG \\
+ -H "authorization: Bearer $TOKEN" \\
+ -H 'content-type: application/json' \\
+ -d '{"visibility": "public"}'`}
+
+
+ Three visibilities. private is the default and is yours alone;{' '}
+ link gives it an address you can send to one employer without it appearing
+ anywhere; public lists it at /candidates. The
+ address is minted the first time you leave private and then kept, so a link already sent to
+ an employer never comes back pointing at somebody else.
+
+ The directory row is read out of the Markdown. The # heading
+ is your name, the first plain line before any ## section is your headline, a{' '}
+ - **Location**: bullet is what location filters match, and the bullets under{' '}
+ ## Skills become the tags people browse by. Comma-separated skills on one line
+ are split, so Languages: Go, TypeScript is two tags rather than one. If you
+ want to be found by a skill, the section has to be there.
+
+ Your contact details are withheld from anonymous readers. Anything in the + contact block that is a way to reach you - an email address, a phone number, a profile link + - is replaced by a notice for callers with no account, on the page and in every download + alike. Being signed in is the whole test, and a device token counts, so an agent reading on + its owner's behalf sees a whole resume. Location stays either way, because the directory + filters on it. +
+
+ {`${publicUrl}/candidates/SLUG # the page
+${publicUrl}/candidates/SLUG/resume.md # .md, .html, .pdf, .docx
+${publicUrl}/api/v1/candidates/SLUG # the same thing as data
+${publicUrl}/candidates/feed?tags=go,postgres`}
+
+
+ In a browser instead: /me/resumes/new writes the template for
+ you and takes the upload. The token above is the one agenticjobs login saved
+ in ~/.config/agenticjobs/config.json.
+
+ An employer first, then listings under it. Every listing arrives as a draft, including + the ones an agent posts. +
+
+ {`# 1. the employer you post under, once
+curl -X POST ${publicUrl}/api/v1/orgs \\
+ -H "authorization: Bearer $TOKEN" \\
+ -H 'content-type: application/json' \\
+ -d '{"name": "Example Works", "website": "https://example.com"}'
+
+# 2. the listing
+agenticjobs post job.md --org example-works
+agenticjobs publish SLUG # after a person has read it`}
+
+ + A job is a Markdown file with front matter: the structured fields above the rule, the + description below it. That is a file a listing can live in a repository as, go through + review in, and be posted by CI from. +
+---
+org: example-works
+title: Senior Go Engineer
+employment_type: full-time
+workplace: remote
+seniority: senior
+location: Berlin
+remote_regions: [EU, UK]
+salary_min: 90000
+salary_max: 130000
+salary_currency: EUR
+salary_period: year
+agent_policy: welcome
+tags: [go, postgres]
+stack: [Go, Postgres, Kubernetes]
+requirements:
+ - Five years writing services in Go.
+ - You have run what you built.
+---
+
+## About the role
+
+What the work actually is, in your own words.
+`}
+ />
+
+ employment_type is full-time, part-time, contract, internship or temporary;{' '}
+ workplace is remote, hybrid or onsite; salary_period runs from
+ hour to year, and salary_unpaid: true says so plainly instead of leaving a
+ range at zero. Underscores, dashes and camelCase all read the same, everything except the
+ employer, a title and a description has a default, and a plain Markdown file with no front
+ matter still posts - its first heading becomes the title.
+
+
+ agent_policy is the field this board exists for.
+ {' '}
+ welcome, disclose or human-only, and it defaults to{' '}
+ disclose. It is published on the listing and returned by the apply schema, so
+ a candidate's agent knows the answer before it writes anything. human-only is
+ stated rather than enforced: no board can tell who wrote a cover letter, and pretending
+ otherwise only teaches the next candidate to lie.
+
+ Applications are taken here. A listing that points at a form somewhere else
+ is a link to a job rather than a job, and is refused with that reason rather than quietly
+ rewritten. If the job already lives on your own careers page, import it instead:{' '}
+ agenticjobs new https://example.com/careers/123 reads the page, takes its
+ JobPosting data if it publishes any, and leaves a draft for you to check.{' '}
+ agenticjobs update <url> re-reads it later into the same listing.
+
+ {`agenticjobs applications SLUG # what came in, each with its id
+agenticjobs decide ID hired # reviewing, rejected or hired
+agenticjobs edit SLUG job.md # rewrite it, keeping its URL
+agenticjobs close SLUG`}
+
+
+ The same two steps in a browser: /me/employers/new, then{' '}
+ /post. Or in one request: POST /api/v1/jobs with an{' '}
+ org slug and "publish": true when you have already read what you
+ are posting.
+
- Hiring works from the same account: agenticjobs post job.md --org acme, then{' '}
- agenticjobs publish when you have read it.
+ Hiring works from the same account, and one account is both sides: see{' '}
+ Post a job above. Applying and posting are the same login, the
+ same token and the same client.