Overview
The client serves teams that run high-volume job searches on behalf of candidates. Before the platform, every application meant hunting for a role across dozens of job boards and then retyping the same details into a form that looked different on every company's careers site. Most of each working day went into copying and pasting.
Voxen built a multi-tenant platform that brings the listings to the team and fills the forms for them: a web app for finding and organising jobs, and a browser extension that completes applications on the employer's own site.
The challenge
- Too many sources. Listings are spread across dozens of boards, each with its own format, duplicates of the same role, and postings that go stale quickly.
- Noise. A team that hires for backend engineers does not want to scroll past thousands of irrelevant roles to find the right ones.
- Every form is different. Applicant-tracking systems all ask for the same information in different layouts, field names and steps.
- Open questions. "Why do you want to work here?" cannot be answered with a template without reading as generic.
- Teams, not individuals. Several people work for several candidates at once, and each organisation needs its own data, users and limits.
What Voxen built
A scheduled ingestion engine.
Background workers pull listings from more than 40 sources on a schedule, normalise them into one format, remove duplicates and retire postings that have closed. Each source has its own health monitoring, so a broken feed is noticed and fixed rather than silently going quiet.
Pre-filtering by each organisation's stack.
During onboarding, an organisation lists its technologies and keywords. Every listing is filtered against that profile before the team sees it, so the feed starts relevant instead of exhaustive. A "best matches only" mode keeps only roles built around those technologies, not ones that merely mention them.
Search built for volume.
On top of the pre-filtered feed, teams filter by source, posting date, job type, work model, company size and application status, save roles for later, and export results. An organisation-level blacklist hides companies the team never wants to see again.
Reusable application profiles.
Each candidate's details live in one or more profiles: contact information, experience, education and skills. A team can keep several profiles per candidate for different kinds of roles and set a default.
A browser extension that fills the form.
The extension syncs the organisation's profiles. On an employer's application page, the user clicks once, picks a profile, and standard fields fill instantly. Purpose-built adapters cover more than 19 applicant-tracking platforms, with a general fallback for everything else.
AI answers for open-ended questions.
For questions that need a written answer, the extension drafts a response with GPT-4o using the selected profile and the job description, and writes it into the field as the user watches. The user reviews and edits before submitting.
Teams, usage and billing.
All organisations share one database, with every record scoped to its organisation. Admins manage team members, see a dashboard and analytics for their own organisation, and work within organisation-level usage and billing limits.
Engineering approach
Ingestion runs as queued jobs on BullMQ, so slow or failing sources never block the rest and every run can be retried. Tenant isolation is enforced at the data layer, not left to individual queries. Each application run is logged, and those logs feed back into the form adapters, so accuracy improves with use.
Outcome
The platform runs in production with paying customers. It ingests around 25,000 listings and completes more than 2,000 applications every day.
What it makes possible
New applicant-tracking platforms are added as new adapters without touching the rest of the system, and new job sources plug into the same ingestion pipeline.
