SharpenResume Bullet Rewriter
What it does for you
Rewrites weak resume bullets three ways, scores each out of 100, shows the diff, and never invents a number; works offline with optional Claude mode.

Screenshots

In more detail
Paste a weak resume bullet and Sharpen gives you three stronger versions. Each one is scored out of 100 and shown as a word-by-word diff, so you can see exactly what changed and why. When your bullet has no number in it, the rewrite leaves a clear placeholder instead of making one up.
Honest limits
To be honest, I didn't hand-review every line of the core. The test suite is what I'm trusting. Claude mode was only tested against synthetic responses, never the live API. And the score is a heuristic I can explain, not an applicant tracking system simulation or a hiring prediction.
How I built it
This came out of the bulk one-shot night. I set the brief for a whole batch, and Claude Code built this one largely unattended in about half an hour of work. The first agent got interrupted near the end, after the app and screenshots existed but before the README, case study, and log entry. A second Claude Code pass finished it the next morning.
My rules were simple: three rewrite styles (Impact-first, Metric-led, Concise), a local mode that works with no API key, never invent numbers, and the shipped code is the tested code. Claude Code wrote bullets.js (about 1,000 lines), the UI, the server, and 178 tests. It designed the rule engine itself: a verb library for 12 roles, weak-opener and passive-voice detection, metric cleanup, and the prompt builder and parser for Claude mode.
The finishing pass re-ran the tests, reviewed the screenshots, and caught a small CSS bug: the "after" label in collapsed rows ran into the text as "afterMigrated." It fixed that, retook both screenshots, and wrote the capture files.
What I learned
- An AI rewriter is only trustworthy if it refuses to invent facts. Making the
[quantify: ...]placeholder a real output, one the scorer strips before scoring, meant neither the rule engine nor Claude gets credit for a number that isn't there. - Running Claude's rewrites through the same scorer as the local engine turns "AI mode" from a black box into a variant you can compare. It also let 178 tests cover the prompt builder and response parser (fenced, malformed, and partial JSON) without a single API call.
- English verb conjugation is mostly three rules plus an exception table. Deriving past tense and gerunds from base forms keeps the verb library about a third the size.
.orig .wasdoes not match one element carrying both classes. The screenshot caught it. The tests couldn't.
What carried forward
It shares the Claude setup #12 and #15 used that same night: local first, Claude as an optional layer, raw fetch, defensive JSON parsing, and every model answer checked by code we trust. It's also one of four builds in this range (#16, #18, #19, #20) that were interrupted and finished by a fresh session working from the files alone. That only works because each project folder holds everything: code, tests, screenshots, and the brief's structure. The folder setup mattered as much as the prompts.
On the last day, #86 Candor imported bullets.js straight from this folder for its bullet scorer, weak-opener detection, and filler stripping. A T0 warmup ended up inside a T3 capstone, untouched.
If I took it further
I'd add a job description input so verbs and keywords match a specific posting, and test Claude mode against a recorded set of real responses. I'd also spend the saved time reading the core line by line.
#016 Built with Claude Code September 20, 2026 178 automated checks