Prosody scans your lines, checks them against the form you chose, finds rhymes by phoneme distance rather than spelling, and defines every word it suggests. It is one HTML file. The pronouncing dictionary, the thesaurus, 56,288 definitions and the whole interface are inside it. Open it with the wi-fi off and nothing changes.
No account. No sign-up. Nothing is uploaded — there is nowhere to upload it to.
Syllables and stress are read out of a pronouncing dictionary, not guessed from spelling — which is why it gets fire, flower and every right. It also knows when verse swallows a syllable: heav'n, ev'ry, flow'r are scanned the way the line needs them.
Every pair of the 39 English phonemes has a distance, and rhyme is edit distance over the sounds after the stressed vowel. So perfect, near, slant, weak and identical rhyme fall out of one measurement instead of five word lists — and moon/room is correctly a near rhyme, not a miss.
Choose a villanelle and it tracks both refrains, tells you which line owes a repeat, and says so when the repeat has drifted. Sestinas get their end-word rotation laid out. Sonnets, ballads, pantoums, triolets, syllabics, and a dozen more.
Where the metre strains and what substitution you used. Where the caesurae fall and whether they ever move. Which lines run on and which stop on a word that cannot end a phrase. How long your sentences are against how long your lines are. Which words open too many lines.
Every suggested word carries its own meaning — hover it and the definition appears. A thesaurus that offers you abate without saying what it means is asking you to gamble.
Means the same as grief, two syllables, rhymes with alone, not a word already in the poem. When nothing satisfies all of it, it says which condition to drop and how many that would give you.
Every other tool answers one thing at a time: what rhymes with this, what means this, what fits this beat. But nobody is ever stuck on one condition. They want something like grief, two syllables, rhyming with alone, that I haven't used yet.
Shape is a hard filter, because you cannot compromise on the thing that makes the line scan. Sense and rhyme are graded, because they always are — so results arrive in tiers and you can see exactly which condition each answer bent.
Ask for something meaning grief that rhymes with alone and it tells you plainly that nothing in the dictionary does both, then hands you moan and bemoan and lets you make them mean it. That is more honest than an empty box, and closer to how the line actually gets written.
The texture of a poem is measurable: what proportion of it is plosive, fricative, nasal, liquid. A line that is 40% liquids hums; one that is 40% plosives hits. Prosody counts it and tells you which one you wrote.
It also finds the rhymes you did not plan — words echoing across lines the form never asked to match — and separates them from the ones the scheme already accounts for. Internal rhyme you meant is craft; internal rhyme you did not notice is usually the reason a stanza feels muddy.
The whole thing is a single prosody.html. There is no build step to run, no
package to install, no account to make and no API to call. Save it anywhere and it keeps
working — on a plane, on a stick, in ten years when this domain has lapsed.
That constraint is why the interesting parts exist. A pronouncing dictionary, a thesaurus, a sense-relation graph and three million lines of poetry frequency data do not fit in an HTML file by accident.
iPronunciations are integer phoneme codes in one packed byte buffer, with a precomputed 39×39 distance matrix beside it, so a rhyme sweep is arithmetic over typed arrays rather than string comparison.
iiThe thesaurus is delta-encoded integer lists in a variable-length base-42 scheme over a character pool chosen so the data can sit in HTML without escaping.
iiiThe definitions were 2.9 MB of English prose. They are token-coded against a table of the 12,288 commonest pieces that appear in them, and the space between two words is not stored at all — the decoder puts it back, because a space between two letters is the only thing that can be there. That is 1.2 MB, decoded one row at a time, only for the word you actually asked about.
ivEvery data blob lives in an inert
<script type="text/prosody-data"> element rather than a JavaScript
string, so the HTML parser handles it instead of the JS parser, and the element is removed
after reading so the source can be collected.
Halfway through, the thesaurus started answering floor with
homosexual. Line 36,450 of the dictionary was ths — a word with no
vowel, which the loader skipped and the exporter did not, so every word id after it was
off by one. Four tables were silently misaligned and every individual lookup still looked
plausible.
The fix was one line in the build. The lesson was the test that now asserts the number of dictionary lines the app read equals the number the build wrote — the kind of check that only gets written after an off-by-one has cost you an afternoon.
The CMU Pronouncing Dictionary (BSD-2-Clause), WordNet 3.1 (Princeton's licence) and the
Gutenberg Poetry Corpus (public domain). All three permit commercial redistribution, all
three required notices ship in the file itself, in the credits screen and in
LICENSES.txt. No in-copyright poem text is embedded anywhere.
One payment, no subscription, no account. A licence key arrives on the page straight after checkout. The app checks it against this server once, then verifies it itself — offline, with a signature — every time you open it after that. A licence that needed a server to be up would not be a licence you own.