v0.1.0 Self-hosted · Cloudflare or Docker

Hiring, without replacing your careers form.

ATS is an applicant tracker that sits behind the form you already have. Your site keeps its form, each application is sent to ATS signed, and HR works them in a fast split inbox.

Version 0.1.0 · released October 14, 2026 · one kit for Docker, Node.js and Cloudflare

The ATS inbox: a list of applicants with stage tabs and filters on the left, and the selected candidate's drawer on the right showing contact details, stage, rating, suggested other jobs and the application answers. The same inbox and candidate drawer in the dark theme.

Features

Everything HR needs to move fast. Nothing your website has to give up.

The form stays on your site. ATS gives the people reviewing applications one calm place to read, move, rate and reply.

A split inbox with the candidate right beside it

Stage tabs with live counts, filters and full-text search on the left; the whole application on the right. On wide screens the drawer docks beside the list, on phones it becomes a full-screen sheet.

  • Filters for site, job, rating and dates, plus bulk stage moves and CSV export
  • The application in the order the applicant saw the form, with an inline resume preview
  • Rating, notes, an activity timeline, other applications from the same person
  • Email the applicant from templates without leaving the drawer
Inbox with the candidate drawer open beside the applicant list.

Jobs, and a talent pool that explains itself

Openings are grouped per site with pipeline bars. Each job has a Suggested from your talent pool panel: past applicants who opted in, scored against the opening with plain-language reasons like “Applied for Forklift Operator” or “Reached Interview”.

  • Only people who said yes to future openings are suggested (by default)
  • The same matches show up as Also fits on a candidate
  • The matcher is swappable if you want your own scoring
A job page for Production Associate showing its pipeline bar, its applications and a Suggested from your talent pool panel with match scores and reasons.

The whole talent pool, ranked

Browse everyone who agreed to hear about future openings, search it, filter it by site, and see why each person fits before you reach out.

Talent pool list with score rings, each candidate's last position and site, and reason chips such as Same site and Rated 5 stars.

Built for trust

Careful with applicant data by default.

Roles scoped per site

Viewer, recruiter or admin, each limited to the sites they work on. Records outside someone's sites simply don't exist for them.

Sensitive answers stay masked

Criminal history, work authorization and any fields you choose stay hidden until a recruiter reveals them, and every reveal is logged.

An audit log that outlives the data

Views, reveals, downloads, exports and changes are recorded with who and when. It stores ids and emails, never applicant answers.

Retention and erasure

Inactive candidates are purged automatically after a set number of months (longer for the talent pool, hired people kept). Admins can erase a person on request.

Modules you switch on in Settings

Audit, retention, talent pool, candidate email and HR notifications are each optional. Stages, sites, templates, sensitive fields, users and theme change without a redeploy.

Keyboard-first

Press ? for the full list: j/k to move through applications, g i for the inbox, e to email, n for a note, / to search.

Comfortable everywhere

Light or dark. Comfortable or compact. Desk or phone.

Everyone picks light or dark and their own row density. On a phone the inbox and drawer become a focused, thumb-friendly flow, so a quick review between interviews actually works. Strings are i18n-ready.

Inbox in the light theme.
Inbox in the dark theme.
The inbox on a phone, with stage tabs, a Filters button and a bottom tab bar.
A candidate opened as a full-screen sheet on a phone, with stage, star rating, Also fits suggestions and the application.

Runs where you want

One codebase, two runtimes.

The same core runs as a Cloudflare Worker or as a single Node.js process. Your data stays in your account or on your server.

What each runtime uses
ConcernCloudflare WorkersSelf-hosted (Node.js / Docker)
DatabaseD1SQLite file (node:sqlite)
FilesR2Local disk
Sign-inCloudflare Access (e.g. Microsoft 365 SSO)Any auth proxy that passes a verified email header
EmailMicrosoft GraphSMTP or Microsoft Graph
SchedulerCron TriggerIn-process interval

How it connects

Your form posts. ATS verifies. HR takes it from there.

After your site validates a submission, its server sends a signed copy to ATS. The ingest endpoint needs no user login; the signature is the credential.

How ATS connects Your careers site validates the form and POSTs a signed multipart request to /ats/ingest. ATS, running as a Cloudflare Worker or a Node.js process, verifies the signature and stores the application. HR signs in through Cloudflare Access or your auth proxy and works the split inbox. Optional email goes out over SMTP or Microsoft Graph. Your careers site keeps its own form validates the submission signs it server-side POST /ats/ingest multipart + HMAC ATS Worker or Node.js process ✓ verifies signature + files D1 or SQLite R2 or local disk hourly retention + audit jobs SSO gate Access / proxy HR team split inbox in the browser desk or phone Optional email · SMTP or Microsoft Graph
How ATS connects Careers site, then a signed POST to /ats/ingest, then ATS, which HR reaches through an SSO gate. Optional email goes out over SMTP or Microsoft Graph. Your careers site keeps its form · validates signs it server-side POST /ats/ingest multipart + HMAC ATS Worker or Node.js process ✓ verifies signature + files D1 or SQLite · R2 or disk hourly retention + audit jobs SSO gate Cloudflare Access / proxy HR team split inbox, desk or phone
  1. Keep your formYour site validates the submission exactly as it does today.
  2. Send a signed copyA few lines of server code post it to /ats/ingest with an HMAC signature. Retries are safe.
  3. Review in the inboxHR signs in through your SSO and works applications in the split inbox.

Read the ingest protocol →

FAQ

Questions, answered.

Do I have to replace my careers form?

No. Your website stays the source of the form. After it validates a submission, its server posts a signed copy to ATS. See Connect a form.

Where does applicant data live?

In your infrastructure: a SQLite database and a files folder on your server (Node.js or Docker), or D1 and R2 in your own Cloudflare account. This website only hosts downloads and documentation; it never runs ATS or sees your data.

How do people sign in?

ATS never sees passwords. On Cloudflare, Cloudflare Access signs people in (for example with Microsoft 365) and ATS verifies the Access token on every API call. Self-hosted, an authenticating reverse proxy (Authelia, oauth2-proxy, Authentik, Caddy forward_auth, …) passes the user's email plus a shared secret header. Who may do what is managed inside ATS under Users & access.

Can it email applicants?

Yes, with the optional candidate email module: templates sent manually from the drawer or automatically when an application arrives or enters a stage. A separate HR notify module emails your team about new applications, per site. Mail goes out over SMTP or Microsoft Graph when self-hosted, and over Microsoft Graph on Cloudflare.

Is there a hosted version?

A hosted, multi-workspace tier is planned. Today you run ATS yourself, on Cloudflare or on any machine that runs Docker or Node.js.

What does it cost? What's the license?

Licensing terms TBD. Check the downloads page for the current terms.

Ready when your next applicant is.

Download the kit, pick Docker, Node.js or Cloudflare, and connect your form. The install guides walk you through it step by step.