DEV Community

Oğuz Kaan Mavice
Oğuz Kaan Mavice

Posted on

Resumes are write-only. I made mine interrogable — and it secretly coaches my interviews.

A resume is a write-only document. You spend hours polishing claims, and the person reading it can't ask a single follow-up. They either believe "led a cross-functional data team" or they don't — there's no way to probe it until you're both in a room weeks later.

So I turned mine into something you can interrogate. It's live here:
Signal Sifter demo, and the whole thing is an MIT-licensed template you can fork:
repo.

This post is the "how I built it" — the architecture, the one design decision I'd defend hardest, and a hidden mode that turned out to be more useful than the main feature.

The idea in one screen

You land on what looks like a normal chat app. You can browse the resume
deterministically (fully static, no model involved), or flip to AI mode and just ask: "What was the hardest part of the Fabric migration?" "Is this person good with stakeholders or just says so?" The model answers as the candidate, grounded strictly in two things:

  1. a structured resume (JSON), and
  2. a "story file" — motivation, STAR stories, and a handful of literature-based self-assessments (e.g. Thomas–Kilmann conflict style), self-scored via an open questionnaire.

Every answer streams back with a machine-readable citation header, which the UI renders as source badges. Tap a badge and you see exactly which part of the declared data the claim came from.

The design decision I'd defend hardest: make the AI admit what it can't prove

The easy version of this project is a hype machine — a model that makes the candidate sound amazing. That's also worthless, because everyone knows it's doing that.

So the system prompt does the opposite. If you ask "are these assessments
certified?", it answers honestly: no — they're self-scored from an open
questionnaire, here's the framework.
It refuses to invent numbers that aren't in the data. The trust doesn't come from the AI being impressive; it comes from the AI being auditable and willing to say "I don't have that."

All of AI's statements are based on your real story and assessments.

That's the whole thesis: transparency beats persuasion. A recruiter doesn't need a smoother pitch. They need to be able to check.

The stack is deliberately $0

Nothing here costs money to run at demo scale:

  • Frontend: vanilla JS + Vite, hosted on GitHub Pages. No framework — the interactive resume is a small state machine, and keeping it dependency-light means a fork deploys in minutes.
  • Backend: a single ~250-line Cloudflare Worker. It's a thin, hardened proxy to an LLM — it does CORS/origin locking, a per-IP rate limit, injects the system prompt + declared data, and streams the response back. The browser never sees an API key.
  • Model: any OpenAI-compatible endpoint. The template ships pointing at a free Llama tier; the live demo runs on a cheap hosted model. Swapping providers is two environment variables.

The citation mechanism is simple on purpose: the model is instructed to prefix each answer with a compact header naming its sources (something like §SRC:story.conflict_style§), the Worker streams it through untouched, and the client parses the header into badges before rendering the prose. No embeddings, no vector DB — the "retrieval" is just the candidate's own declared JSON, small enough to pass in full. Easy to debug: a wrong citation is a wrong string, not a mystery cosine score.

The hidden mode I didn't expect to love: ?practice=1

Add ?practice=1 to the URL and the roles flip. Now the AI is the interviewer. It reads your story file, hunts for the weak spots — unmeasured results, "we did X" vagueness where ownership is unclear, a conflict story with no actual conflict — and asks you behavioral questions targeting exactly those gaps. After each answer, it drops a short coaching note: STAR structure, ownership language, tone.

How to present yourself professionally in a real interview; word choice is important, eloquence is important.

Here's the part that surprised me. Writing the story file honestly is itself interview prep. To feed the grounded-AI mode, you're forced to write down your real STAR stories and score yourself against actual frameworks. By the time the data is good enough for the demo, you've already done the reflection most people cram the night before an interview. The practice mode just closes the loop.

Fork it

The template is MIT. To make it yours:

  1. Fork the repo.
  2. Fill in your data: content/en/resume.json and content/en/story.json (the template ships English and Turkish under content/en/ and content/tr/), and point content/config.json at your deployed Worker.
  3. Deploy the static site to GitHub Pages (there's an Actions workflow) and the Worker to Cloudflare (both free tiers).

That's it — you get an interrogable resume with source badges and a private interview coach, running at $0.

I'd genuinely love feedback, especially from anyone on the hiring side: does an AI that cites its sources and admits its limits actually build more trust than a polished PDF — or less? That question is the whole reason I built it, and I'm not certain of the answer yet.

— Repo: https://github.com/EnigmaDevelop/resume-signal-sifter ·
Demo: https://enigmadevelop.github.io/resume-signal-sifter/ ·
Practice mode: https://enigmadevelop.github.io/resume-signal-sifter/?practice=1

Top comments (0)