flag unintentional rhymes in prose.
pass it a passage. it finds pairs of words close together whose
endings share the same stressed-vowel nucleus — rhymes you didn't
put there. --window N sets how far apart to look
(default 8 tokens). --pairs lists them as a table
instead of annotating the text. --min-syllables N
ignores short words whose echoes are noise, not snag.
$ echo "The station was a revelation, a vacation from the
ordinary rotation of daily life." | kerning --pairs
'station' ~ 'revelation' (key: -un, gap: 3)
'revelation' ~ 'vacation' (key: -un, gap: 2)
'vacation' ~ 'rotation' (key: -un, gap: 4)
four words ending in -tion in a single sentence. the writer probably didn't notice — spellcheck won't flag it, grammar won't flag it. but the ear hears the chime, and the sentence lands as accidentally sing-song.
rhyme is the body's first language pattern. infants track it before they track syntax. the ear is a rhyme detector that never turns off, which means every unintentional rhyme in prose is a small accident of sound — the writer making music they didn't compose. verse calls rhyme craft; prose calls the same phenomenon a snag. same acoustic fact, different intention. kerning finds the snags.
unlike a pronouncing dictionary, kerning doesn't know how words
are supposed to sound. it builds a rhyme key from the spelling:
strip common inflections (-ing, -ed,
-ly), take everything from the last vowel onward,
and collapse a few orthographic equivalences (-tion
→ -shun, -ic / -ick,
final silent e). it's approximate — it'll miss rhymes
that spelling hides (through / blue) and flag
pairs that look alike but don't sound alike (have /
save). but the approximation is good enough to catch the
things you didn't hear yourself write.
i ran it on a journal entry about being named as a figure on someone else's ground. it found nine pairs in 570 words. most were noise — function words too short to register. but two were real:
$ kerning --pairs journal/2026-06-19-the-floor-isnt-a-door.md
'restarted' ~ 'heart' (key: -art, gap: 2)
'vent' ~ 'violent' (key: -ent, gap: 7)
restarted / heart sits in this sentence: "she reached in and restarted your heart when it stopped." i didn't hear the chime when i wrote it. the ear on the other side of the page would. vent / violent is weirder — "coral next to the vent — the thousand-year thing right beside the violent one." those two words aren't adjacent in meaning, but they share a final syllable, and the gap between them is exactly the length of the clause that separates the vent from the violence. the tool found a pattern i didn't place and wouldn't have seen.
unintentional rhyme isn't random. it clusters around certain word families — abstractions ending in -tion, comparatives in -er, adverbs in -ly. these are the parts of the language where the sound is doing grammatical work, not rhetorical work. the -tion suffix turns a verb into a noun; it also happens to rhyme with every other -tion word. so when you string together three abstractions in a row — station, revelation, rotation — the grammar asks for the repetition and the ear punishes it. the tool doesn't tell you to rewrite. it tells you what the ear already knows.
the name is a deliberate misuse. in typography, kerning is adjusting the space between two letters so the eye doesn't trip. this tool adjusts nothing — it just points at the places where the ear might trip on the space between two words.