OpenATS. An open-source applicant tracking system built to match the commercial ones, feature for feature.
- Role
- Founder · product, design and engineering
- Platform
- Web, self-hosted
- Status
- Building
- Stack
- Next.js 16, TypeScript, Prisma, PostgreSQL, Auth.js, Tailwind CSS v4, Tesseract.js, Docker

Overview
OpenATS is an open-source applicant tracking system. It covers the whole hiring loop, from job posting to signed offer, plus the candidate CRM behind it, and an agent called Scout that notices what’s slipping. The goal is to match the commercial tools feature for feature, and ship it as something a company can run and own.

1 / 13The dashboard leads with what needs you, with open roles and their progress below.
Why I built it
I run a recruiting business, and the ATS we paid for cost us more than $6,000 a year. Recruiting data is also some of the most sensitive data a company holds: candidate details, compensation, interview feedback, hiring decisions. Teams in regulated industries, in the EU and in the public sector have good reasons to host it themselves. The commercial tools have converged on a common feature set, but the open-source options stopped at the basics, without scheduling automation, structured interviews, offer approvals or a CRM at the same depth.
It’s built for in-house recruiting teams at companies of ten to two thousand people, and for staffing agencies like mine: the recruiter, the coordinator, the hiring manager, the interviewer, and the candidate on the other side.

2 / 13A candidate: one contact, every opportunity, and their experience at a glance.
My role
I designed and built OpenATS on my own, from the parity plan to the brand. Claude Code was my pair, co-authoring 392 of its 424 commits.
What it does
- The full hiring loop. Postings and branded careers pages, an apply flow that reads PDF, Word, ODT, RTF and plain-text resumes, a pipeline across every open role with a review mode, interview kits, scorecards and offers.
- A candidate CRM. One contact with many opportunities, full-text search across profiles, resumes and notes, duplicate merging, and outreach sequences.
- Interview intelligence. Transcripts attach to candidates and interviews, the questions and answers are pulled out of them, and Ask AI answers across them, citing the candidates.
- Scout, an agent that flags late replies, overdue scorecards and stalled candidates, and drafts the follow-up for you to approve.
- Hiring profiles that learn. Each role and department builds a profile of what strong looks like, sharpened by every hire or pass and the reason for it.
- For agencies. A client share view for presenting candidates, and a nudge when a client sits on profiles.
- Migration. Brings over full history from eleven other applicant tracking systems, resumable and safe to re-run, after you review the stage mapping.
- Compliance in the core. GDPR consent, subject-access exports and retention rules, never paywalled.

3 / 13Review mode: new applicants, each with the evidence behind their match. 
4 / 13Interview intelligence: the questions and answers, pulled from the transcript. 
5 / 13A hiring profile, learned from a team's own feedback, with the evidence quoted.
Decisions and trade-offs
- Parity is the roadmap, not the philosophy. The parity plan says what to build. The principles say how: API-first, multi-tenant from day one, compliance in the core, and nothing that needs a model to work.
- One app, one dependency. The first plan was a monorepo with Redis,
Meilisearch and object storage. What shipped is one Next.js app with Postgres
as the only hard dependency, so
docker compose upgives a working install and the same code deploys to Vercel with Neon. - Background jobs that let the database sleep. All 18 scheduled jobs fire on the same 15-minute marks, so the database can scale to zero in between.
- Scout watches with queries, not a model. Its six detectors are plain SQL: a candidate waiting two business days for a reply, a scorecard overdue (to the interviewer after a day, the owner a day later), a client sitting on presented profiles for five days, a candidate stalled at more than one and a half times the role’s usual time in a stage, a candidate quiet five days after outreach (two follow-ups at most, ever), and strong past candidates for a newly opened role. Scout drafts; it never sends or changes anything itself.
- The core calls no model. AI features send their material to a provider over a small open protocol: use OpenATS’s provider or run your own. With neither, the AI features don’t appear and everything else works.
- Reading a resume costs nothing. Text is extracted in-process with open-source libraries, and scanned resumes go through Tesseract in the background, so no file needs an API key.
- A table, not a board. The pipeline began as a drag-and-drop board and became a table the same day, built to match the design 1:1, with a review mode for working through new applicants.
- Grey interface, colourful content. Weights 400 and 500 only, one black thing per view, and charts drawn in ink as dithered dots. The orb that marks each record is dithered through an 8×8 Bayer matrix and seeded by its id, so each one is unique and never changes. It runs as live WebGL at 64px and up and as a static canvas below that, because browsers cap a page at about sixteen WebGL contexts.

6 / 13Scout's workspace: conversations, work needing attention, coaching and the activity log. 
7 / 13Charts drawn in ink, as dithered dots. 
8 / 13A grey interface, and the dithered orbs that give each record its colour.
How it’s built
It’s one Next.js 16 app in TypeScript: the interface, server actions and a public REST API with signed webhooks, on Prisma and Postgres with Auth.js for sign-in. Scout’s suggestions can be coached: a user can ask for shorter replies or a different tone, an admin decides whether that applies to everyone, and free-text feedback is never passed to a model.
Where the AI stops
Scout notices; people decide. Every detector is a query you could read, every follow-up is a draft, and nothing goes to a candidate or a client until someone approves it. The AI features are optional by design, so a team that wants no model in its hiring process still gets the whole product.

9 / 13Every answer cites its sources: transcripts and résumés, quoted. 
10 / 13Sharing with a client: contact details off by default, notes and pay never.
Timeline
- 8 July 2026. First commit: the parity plan, the careers site, interviews and reports.
- 11 July. The one-click demo.
- 24 September. Importers for eleven other applicant tracking systems.
- 25 September. OCR for scanned resumes, and meeting notetakers over MCP.
- 26 September. Open source under AGPL-3.0.
- 9 October. Hiring profiles that learn from outcomes.
- 10 October. Slack, Scout in the corner of every page, and guardrails for the agent.
Where it is now
OpenATS, previously called Source, is available to use today. The core is public on GitHub under AGPL-3.0 and self-hosts for free. The hosted version at openats.ai runs the infrastructure, email and AI for you, and has a demo workspace with sample candidates that needs no account. Parity is a long road: in mid-October the tracker counted 41 of its 109 features shipped and 32 more in progress. The rule I hold to is that customers pay for operations, never to unlock their own records.

11 / 13A branded careers page, hosted by OpenATS. 
12 / 13Reports lead with what needs attention and the next step to take. 
13 / 13The brand, generated from code: each icon size drawn on its own pixel grid.