Skip to main content
AI & Career Systems

resu-clean — Self-Hosted Resume Toolkit

A self-hosted resume toolkit that cleans, ATS-scores and tailors resumes using a verified profile of facts, searches and dedupes jobs from sources, then generates application kits without inventing experience or sending anything automatically.

Engineering ProjectOngoing engineering projectTags: Resume Engineering, ATS, Job Search
Context

What was happening.

A local-first job-search and resume workflow built for the reality of job applications: clean the resume, verify what is true, tailor against a job description, search sources, and package the application without handing your process to a SaaS platform.

The problem

What needed to change.

  • Most resume tools are either generic SaaS products or AI wrappers that guess and invent facts instead of working from verified evidence.
  • Job applications involve a long chain of work: resume cleaning, ATS scoring, tailoring to a specific posting, searching relevant jobs, and assembling a consistent kit — and most of it lives across scattered tools.
  • A career system should remain local and portable, with no forced account, no telemetry, and no email automation that hides the decision-making behind the app.
The approach

How it was done.

Verified profile as the source of truth

The project treats a user-approved profile as the only trusted source of facts. New claims go to a pending queue and require approval before they become part of the resume record, which prevents the usual AI pattern of inventing employers, dates, metrics or titles.

A user-approved profile is the source of truth
No-fabrication guardrails

Every model-assisted workflow validates output against the original resume and approved profile before it is shown. Facts that are invented or mismatched get discarded and the deterministic path is used instead, which keeps the system truthful even when a model is noisy.

Model output is checked before it can change the resume
ATS scoring + resume cleaning

A deterministic cleaning pipeline normalises the resume and the ATS scorer checks alignment against a job description. Model support is optional and layered on top of the deterministic logic rather than replacing it, so the product still works without a provider configured.

Deterministic checks first; model assistance stays optional
Job search without the black box

The app supports source detection, search, deduplication and ranking. It runs against configured job sources and normalises them into one model, which makes the job-search layer explicit and inspectable instead of a mysterious feed somewhere in the cloud.

Multiple sources become one deduplicated, reviewable job list
Application kit generation

After the resume is tailored, the system assembles the application materials: cover text, tracked job status, generated email, and packaged output for sending or saving. The tool helps organise the process without taking over the decision.

Prepare the application; the user stays in control of sending
Measured results

The numbers that came out.

.NET 8
Runtime

Single-process ASP.NET backend serving API + built UI.

SQLite
Storage

Data, resumes, profile facts, job searches and keys live locally.

OpenAI-compatible + local
Model support

OpenAI, Anthropic, Groq, Gemini, Ollama, LM Studio and more.

Approval-first
Safety model

New facts are queued for verification before they become trusted.

Outcomes

Where it landed.

  • A local-first resume system with clear guardrails against fabricated experience and unsupported claims.
  • A realistic workflow from resume intake to ATS check to tailored application, with no need to surrender your process to a cloud service.
  • An explicit separation between deterministic work and model-assisted work, so the app still functions even when a provider is unavailable.
  • A portable project design: one .NET backend, one Svelte frontend, one SQLite data directory, and no database server to manage.
Stack & tools
C#.NET 8ASP.NET CoreSQLiteSvelteViteTypeScriptOpenAI-compatible APIsOllamaLM Studio
View source on GitHub
Start a conversation

Your situation probably looks different — but the method doesn't.

Understand the work, decide the approach, deliver and measure. A free conversation establishes whether it applies to your problem.

or email joseph.gitau.c@gmail.com