PROJECT CASE STUDY

Tired of the Search.
So I Built the Tool.

A fintech PM with 12 years of experience. Spending 4 to 5 hours a day on top of a full-time job doing something a machine could do better. So I built the machine.

207
commits
250+
companies watched
57
daily validators
0
auto-submitted applications
ONE · THE PROBLEM

Job searching while employed is a second full-time job. A bad one.

I am a senior fintech PM at a large credit union. I spend my days thinking about product strategy, customer behavior, and how to turn complex financial systems into things people actually use. Then I come home and spend 4 to 5 hours doing something I would never accept in my professional work: repetitive, unscaled, manual effort.

The traditional job search is an assembly line where the human is the only moving part. Monitor dozens of career pages. Read hundreds of job descriptions. Write customized materials for each one. Track status in a spreadsheet that goes stale the moment you close it.

"I didn't build this because I couldn't find a job. I built it because the process was costing me 4 to 5 hours a day and producing worse results than a system could."

The tools that exist either automate the wrong things, or automate nothing. There was no tool that treated job searching the way a PM would design any other workflow: discover, score, tailor, review, and let a human make the final call.

4-5h/day
spent job searching on top of a full-time job
2,249
jobs discovered in a single full pipeline run
4.2s
to complete discovery, scoring, and reporting
3
live job-board APIs: Ashby, Greenhouse, Lever
TWO · THE SYSTEM
CAREER SCOUT PIPELINE
Discovery
Ashby · Greenhouse · Lever APIs
Scoring Engine
JD Fetch
Materials Generation
Grounding Validation
57 Validators
Human Review Gate
Mission Control
Human Submits

I built the platform before I built the application.

Career Scout runs on Helios, a local-first AI platform I built on a Raspberry Pi 5 before a single line of Career Scout existed. Local LLM inference via Ollama, cloud escalation via OpenRouter, capability-based model routing, a provider abstraction layer, an evaluation framework, and a RAG pipeline.

This was not accidental sequencing. I wanted to build a real AI application, not call an API and pretend. The platform work meant I had to confront the real problems first: when does a local model produce worse output than a cloud model? How do you measure that reliably?

"Never trust an LLM output you haven't measured." That principle runs through every part of Career Scout.

Discovery from three live job-board APIs, deterministic scoring (never "the model decided"), JD-aware materials generation, and a validation pipeline that runs 57 automated checks before anything surfaces to a human.

BUILD TIMELINE: 207 COMMITS ACROSS 6 ERAS
MVPDaily automationSafety archMulti-sourceHardeningGraph audit
TRY IT

Step two of the pipeline. Try it yourself.

The scoring engine is the one piece of this system that does not need a live job board, an LLM call, or my Raspberry Pi to demonstrate. It is deterministic: same input, same score, every time. So I pulled it out and rebuilt it as a browser-only prototype.

"Paste a real job description. It runs the same seven-factor weighted rubric the production system runs, in your browser, with nothing sent anywhere."

This is a real piece of the system, not a mockup, but it is a simplified one. The keyword matching behind each factor is illustrative, not the literal production Python. Live discovery, JD-aware materials generation, grounding validation, the 57 automated checks, and the human approval gate are the rest of the pipeline. They are not part of this demo. That full system is what ships with the open-source release.

Paste a job description
apply
Your target level
Preferred location
79/ 100
Domain match30 / 30
Role type25 / 25
Seniority3 / 15
Remote10 / 10
Company stage6 / 11
AI signal0 / 4
Location5 / 5
Runs entirely in this page. Nothing you type is sent anywhere or stored. Thresholds: 75+ apply, 60 to 74 review, below 60 skip, identical to production; the keyword matching itself is simplified for this demo.
THE RUBRIC, IN THE OPEN
Domain match30
Role type25
Seniority15
Remote10
Company stage11
AI signal4
Location5
WORKING PROTOTYPE
One piece of a nine-step system, running standalone. The full pipeline and the open-source release are still coming.
THREE · WHY A RASPBERRY PI

I wanted Helios to behave like infrastructure, not like a program I happened to run on my laptop.

A dedicated Raspberry Pi 5 gave me an always-on, private, resource-constrained environment where I had to solve real problems: deployment, persistence, reliability, remote access, model routing, storage, observability, recovery, and security. Career Scout was a good first product because it has recurring background work, sensitive personal data, human approval boundaries, and a clear measure of usefulness. Building it on the Pi forced me to design it as a durable system instead of a collection of scripts that only worked when my computer was open.

"Because then I would have built an application. I wanted to learn how to build and operate a system."

The hardware constraint also made the architecture better. With 8 GB on a Pi 5, you cannot casually throw infinite compute at a problem. That forces real questions: does this actually need an LLM? Can deterministic Python solve this instead? What model size is appropriate? Those constraints pushed the system toward a much stronger architecture: deterministic policy plus bounded AI reasoning plus durable state plus human authority, rather than LLM all the way down.

Privacy is especially relevant here. Career Scout holds your employment history, compensation context, career goals, application history, interview status, and generated materials. A dedicated machine you control gives you a meaningful privacy architecture by default. And because BlueDemonPi is reachable through Tailscale, Helios lives in one place while you access it from any device, which starts to resemble how an actual hosted product works.

WITHOUT THE PI
-Close the lid and the run stops
-Reboot and lose session state
-Take it somewhere and the portal dies
-Everything depends on one laptop
WITH THE PI
+Services start automatically on boot
+Scheduled jobs run while you sleep
+Portal stays available from any device
+Failures can be observed and recovered
+Your workstation becomes a client
ARCHITECTURE EVOLUTION
Before constraints:
LLM
-- LLM
-- LLM
-- LLM
After constraints:
deterministic policy
+ bounded AI reasoning
+ durable state
+ human authority
FOUR · TRUST

I had the tools to automate the last step. I chose not to.

The most common question people ask is: does it apply for you? The answer is no, and that was a deliberate product decision, not a technical limitation.

Every part of the system up to the moment of submission is automated. Discovery, scoring, materials generation, quality review, validation. The system does all of that. Then it stops, sends a notification to my phone, and waits.

Applying for a job is a commitment. The company on the other side allocates time, energy, and judgment to your application. Automating the submission treats that commitment as a volume play. That is bad product design for the application process, independent of whether the AI output is any good.

The safety architecture enforces this in code, not just in intent. Materials generation, human approval, and marking an application as submitted are three separate, explicit states. Approval is bound to the exact content-hash of the materials a human reviewed. Regenerate the resume after approving it, and the approval is automatically invalidated.

"The system has never had a code path that submits an application. That is not a missing feature. It is the product principle."

THREE-STATE AUTHORITY MODEL
01
Materials Generated
Resume, cover letter, targeting notes validated through 57 artifact checks
57 validators pass before surfacing
02
Human Reviews and Approves
Approval bound to exact content-hash. Regenerate anything = approval invalidated.
Human decision -- cannot be bypassed
03
Human Submits Application
Only after approval. No code path submits automatically. Ever.
DESIGN PRINCIPLE
The LLM prepares. The human commits.
Every consequential AI decision needs a clear boundary. This one encodes it in the state machine.
FIVE · GROUNDING VALIDATION
VALIDATION LOGIC
LLM produces rewrite
Tailors bullet or summary for the JD
?
New numbers?
Any figure not in verified_metrics -- REJECT
?
New names?
Company or product not in career history -- REJECT
?
Unearned qualifiers?
Claims not in source text -- REJECT
PASS: accept rewrite
FAIL: fall back to verified original text
SOURCE OF TRUTH
danny-career-profile.yaml
Single source of truth for every fact in every generated document. Verified metrics, career history, education, tools, and explicit guardrails.

The hardest problem: making an LLM that doesn't invent your qualifications.

JD-aware resume generation sounds simple. Read the job description, tailor the resume, output a PDF. The hard part is that a language model, given the instruction "make this resume stronger for this job," will make it stronger by inventing things.

It will add a percentage you never claimed. It will describe a project with qualifiers you never used. It will introduce a product name from the JD into a sentence about experience at a company that predates that product. It won't lie boldly enough to be obvious. It will lie plausibly enough to matter.

The solution is mechanical grounding validation. Every LLM rewrite is checked against a canonical profile YAML before it is accepted. The check is structural: a new number not in the verified metrics registry is rejected. A company or product name not in the career history is rejected. A qualitative claim not in the source text is rejected.

"On a failed check, the system falls back to the original, human-verified text. No hallucination. Just verified facts, or the original phrasing unchanged."

I tested this against two models before shipping. A cheap model was too conservative to produce useful rephrasing. A stronger model actually worked. That comparison is an evaluation, not a vibe.

SIX · THE AUDIT

I audited my own production system and found three bugs I didn't know existed.

After 207 commits and months of daily runs, I had a working system. Then I stopped adding features and read the code like an auditor. Not a code review, not a test run. A systematic read of every file with one question: what is this code actually doing, as opposed to what I believe it is doing?

The disconnected cover letter
The materials pipeline generated a JD-aware, tailored cover letter and wrote it to cover-note.md. Then a second, independent generator built the real cover letter from a hardcoded four-bucket keyword template, completely ignoring the first one. The tailored cover letter was silently discarded every run.
The dead polish step
A resume polish pipeline step had been dead code since role-based tailoring shipped. It matched nothing, changed nothing, and wrote files to paths no one ever looked at. It ran every day for months.
The racing lineage writers
Two independently written, schema-incompatible modules were both writing to the same provenance file with no coordination. The second writer would overwrite the first's schema format every time a file changed.

"The audit's conclusion: don't add a framework, extend what already works. Adding a third orchestration mechanism on top of two that were never unified would have made everything worse."

57+ VALIDATORS -- SAMPLE
Source provenance intact
Artifact freshness verified
Grounding validation passed
Approval hash matched
PDF generation confirmed
Cover letter present
Tracker sync complete
Daily run registered
Portal serving live
Push notification sent
Lineage records written
No placeholder bullets
AUDIT FINDINGS
Files audited139 Python files
P1 bugs found3 (all in production)
Existing systems2 orchestrators, never unified
ConclusionExtend, don't replace
SEVEN · LESSONS FROM 207 COMMITS

What building this system taught me about building.

Building a system you depend on every day is different from building something you demo. When the system is wrong, you feel it immediately.

lesson one
Safety architecture is designed first, not retrofitted
The three-state authority model was an early decision. It is now structurally impossible to bypass in the code, not just in intent. That is the difference between a principle and a guardrail.
lesson two
Evaluation is a habit, not a milestone
Every LLM route was measured before it touched a user-facing output. Cheap model vs. stronger model, same prompts, measured difference. That discipline has to be established early or it never gets established.
lesson three
Audit before you build forward
Three production bugs had been shipping for months, invisible because the system appeared to work. Read the code before adding to it. You will almost always find something that changes what you were about to build.
EIGHT · THE NAME AND THE RELEASE

"Career Scout" is a placeholder.
The real name is coming.

The system I built has been running internally under the working name Career Scout. That name was never meant to ship. It is a description, not a brand. I am currently testing a new name with a small group of people before I commit to it. When it is right, you will know it when you hear it.

"I am not going to ship a tool to the public under a name I don't believe in. That is a product decision. The name has to feel inevitable once you know what it does."

The open-source version will be the full core pipeline: discover, score, generate, validate, surface. The architecture that makes it trustworthy rather than just functional. Free, on GitHub, with clear documentation and a setup path that does not require you to own a Raspberry Pi.

If the community finds it useful and wants more, there will be a paid version with features that should not be free. The shape of that premium tier will come from what people actually ask for, not what I decided they would want before anyone tried it.

RELEASE PLAN
NOW
Name testing
Soft-testing the real name with a small group. Not disclosing yet.
NEXT
Architecture hardened
P1 bugs fixed, generator v2 implemented, durable runtime migrated.
THEN
Open source release
Public GitHub release under the real name. Core pipeline, clean docs.
IF
Paid tier
Premium features shaped by what the community asks for. Not decided yet.
OPEN SOURCE CORE INCLUDES
+Multi-source discovery (3 APIs)
+Deterministic fit scoring
+JD-aware materials generation
+Grounding validation pipeline
+57+ artifact validators
+Human-approval gate architecture
+Application tracker
+Daily automation via systemd
NINE · HOW THIS LAUNCHES

The launch plan.

I am a product marketer. I know how launches work. This one will be done right.

phase one
Name locked, community seeded
-Real name announced publicly
-GitHub repo with full docs published
-README that reads like a product, not a spec
-This case study live on dannydeltoro.xyz
-LinkedIn post with the honest builder story
phase two
Community grows, feedback collected
-Discord opened when inbound warrants it
-Weekly builds documented publicly
-Open issues triaged personally
-Power users identified and engaged directly
-Feature requests tracked visibly
phase three
Premium tier shaped by demand
-Paid features defined by what the community asks for
-Free version stays complete -- no paywalled core
-Premium adds infrastructure or support capabilities
-Pricing set at a level that respects people's time
-Announced to waitlist and community first
WHY THIS IS DIFFERENT FROM EVERY OTHER AI JOB TOOL
Other tools blast applications everywhere
This tool surfaces the right ones and waits for you
Other tools automate the submission
This tool is designed so it cannot submit
Other tools output generic resumes
This tool validates every LLM rewrite before accepting it
Other tools are demos
This tool has been running in production for months
Other tools have no evaluation methodology
Built by someone who measured every model route before shipping
Other tools scale the wrong thing
This tool scales the preparation, not the volume
DANNY DEL TORO

Want to talk about it?

Fintech PM looking for my next role. Also happy to talk AI system design, grounding validation, and why most AI job tools are solving the wrong problem.