← Selected work

Case study

AI Apply - easy.jobs

A job application that talks back

Period
2021 - 2026
Role
Backend and feature owner, easy.jobs (WPDeveloper)
Stack
Laravel · PHP · Vanilla JavaScript · Blade · MySQL · Redis · REST APIs
Live
app.easy.jobs

The problem

easy.jobs is a GDPR-compliant recruitment SaaS. Candidates were abandoning a long application form partway through, and every abandoned form is a hire the employer never sees. The brief was to make applying feel like a conversation rather than paperwork.

What I built

The chat engine. A multi-step conversational flow that walks a candidate through personal details, education, employment history, cover letter, documents, a video answer, screening questions and a quiz, one message at a time. It is plain server-rendered Laravel and vanilla JavaScript; no framework was needed and none was added.

Resume parsing. Upload a CV and the parser pre-fills what it can, so the conversation is confirming rather than typing. An AI scoring step then ranks candidates in the employer's pipeline.

Persistence and safety. Every answer is saved as it is given, so a candidate who reloads, closes the tab or navigates back resumes where they stopped. Input is validated at entry to block XSS and code injection before anything reaches storage.

The tail of the pipeline. Submitting triggers in-app notifications, confirmation emails, pipeline assignment, AI scoring, Slack alerts and Zapier webhooks.

The bug

For a period in production, that tail stopped. Applications saved correctly, candidates saw a success message, and employers were never told. There was nothing in any log, which is what made it dangerous: the system was not failing, it was succeeding at the wrong thing. I traced it, fixed it, and then changed how the pipeline reports on itself so that "nothing happened" is now a recorded event rather than silence. I wrote more about this in the note on silent failures.

What I learned

The most expensive bugs are the ones that look like success. Side effects need their own assertions.