Charlie KrugThe Build Log

← All posts

'It was a dark and stormy night' should score low. It does.

Hook Doctor scores your opening line with three transparent rules over plain text, then sets the closest famous opener beside it, scored by the exact same rules. No model, nothing leaves your browser.

"It was a dark and stormy night" is the most famous bad opening line in English, the one Snoopy types and every craft book holds up as what not to do. Paste it into Hook Doctor and it scores low, which is the whole point. If a tool claims to read opening lines, the parody everyone agrees is weak had better land near the bottom, and the openers everyone agrees are great had better land near the top. Otherwise the numbers mean nothing.

Feedback on a first line is almost always mush. "I liked it." "Hook me faster." None of that tells you what to change. Hook Doctor is a diagnostic for the one sentence that has to do the most work: the opener an agent, editor, or reader judges in seconds. It doesn't grade your manuscript. It reads your first line, or your whole first paragraph, and turns three pieces of real craft advice into three numbers you can argue with.

Three rules you can read off the page

Each rule is a plain heuristic over plain text. No model, no training data, nothing you can't inspect.

In medias res: does the line open on motion, conflict, or dialogue, or does it warm up with scene-setting first? "It was", "There was", and their relatives are stalls, describing conditions instead of starting the action, and the rule looks for exactly that. Concrete imagery: how much of the sentence rides on specific, sensory nouns versus abstract filler like "situation" or "feeling"? A line built from things you can see scores higher than one built from concepts. Sentence rhythm: across your first few sentences, do the lengths vary, or does everything run 8 to 11 words and read flat? Famous openers rarely hold one uniform length, and uniform rhythm reads mechanical even when the words are fine.

Each returns a 0 to 100 score with a one-line reason, and the three roll up into a weighted Hook Score. Because every rule is transparent, you can read exactly why you scored what you scored and disagree when the disagreement is the interesting part.

The comparison is the trick

A number on its own is a grade, and a grade is barely more useful than "hook me faster." The move that makes Hook Doctor a diagnosis is what it does next. It matches your text against the closest opener in a corpus of 34 real famous first lines, Melville to Morrison to Gibson, and it scores every one of those openers with the exact same rules it just ran on you. So the match is apples to apples. "Your imagery is low" stops being an abstract complaint and becomes "here is a published opener with high imagery, sitting right next to yours, doing the thing you didn't."

That shared-rules detail is what keeps the corpus honest. The famous lines aren't a rubric somebody hand-waved into place; they're ground truth run through the same engine, which is also how the calibration works. The strong openers land high and the parody lands low precisely because one set of heuristics sees them all.

The rule that dings Dickens

Here's the honest edge. "It was the best of times, it was the worst of times" is one of the most celebrated openings ever written, and it starts with "It was". The in medias res rule dings it, exactly as it dings the stormy night. That isn't a bug I hid; it's the limitation the design forces. A structural heuristic measures structure, not genius, and Dickens is doing something with balance and repetition that no plain-text rule of mine is going to catch. The score is a starting point for your own judgment, not a verdict that overrules it. When a rule and your ear disagree, your ear wins, and the detail line is there so you can see precisely what the rule was reacting to.

The whole thing runs client-side. The rules engine and the entire benchmark corpus live in the browser, so nothing you paste ever leaves your machine, and there's no server, no account, no cost. It's vanilla TypeScript, built with Vite, zero runtime dependencies.

Try it

Open the demo, paste your opening line or your first paragraph, and read the three rows before you look at the composite. Watch which rule is dragging you down, then look at the famous opener it lined up beside you and what it does differently. Change one thing, a stall verb, an abstract noun, a too-even rhythm, and rescore. It re-scores as you type, so revising a hook feels like leaning on an instrument instead of submitting a form. The source is on GitHub.

Hook Doctor is live. Free, in your browser, no signup.

This post is part of the build log: every app my automated factory ships gets written up here, honestly. Browse everything at apps.charliekrug.com. Comments are open below.

Comments

Loading comments…