Commit Graph

60 Commits

Author SHA1 Message Date
kennethreitz 4c99908d79 Phrases don't dangle on an open-vowel stopword tail
"smell like a" was matching "myself why" (EH-AY) because mosaic triples
were never weak-flagged — a trailing article "a" (bare open vowel)
dangles and isn't part of the rhyme. Triples now skip an open-syllable
stopword tail, while closed ones ("mean to it" -> theme music) stay.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 18:06:35 -04:00
kennethreitz 23cc6434f7 Consonance only on the ending, not a buried stress
meticulous (me-TIC-ulous, IH-K under -ulous) was consonance-rhyming
quick. Consonance now fires only when the stressed vowel is within one
syllable of the word end — people/sleep still rhymes, meticulous/quick
doesn't. Gated the projection side too, so a long-rime group stops
advertising a misleading stressed-syllable consonance.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 17:42:13 -04:00
kennethreitz a973f35e20 Per-word brightness: anchors glow, slant attachments whisper
Strength is now per token, not per family — a word that only slant-
matches its family (placement riding creation/elation's -ation core)
caps at 0.6 while the perfect anchors stay at 1.0. The gradient now
lives within a single color, showing each word's own grip on the rhyme.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:26:43 -04:00
kennethreitz 1ea434e9a7 Brightness as a continuous rhyme-strength gradient
The fill (and tail underline) now scale through a per-group strength
from the founding key: perfect 1.0, multisyllabic .82, consonant-
backed .7, vowel slant .6, consonance .55, weak ending .5. So the
page reads rhyme quality as a smooth brightness ramp, not just
perfect-vs-slant — the feature, deepened.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:23:48 -04:00
kennethreitz e134f33ec7 Near-miss radar (#3): dead endings one phoneme from a rhyme
A line ending that rhymes with nothing but sits one phoneme from
another ending in the stanza (hand/bond — one vowel apart) gets a
dotted gold underline: a tiny edit would lock it. Restricted to
genuinely-open endings, so it never duplicates the slant/consonance
detection (which already catches same-vowel near-rhymes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:16:08 -04:00
kennethreitz 42d48b2c42 Sub-word rhyme highlighting: dim word fill + bright tail underline
Whole rhyming word fills dimly; a bright underline marks just the
rhyming part (tonight -> under 'ight'), so the precise interlock shows
without the fill looking ragged when the phoneme->letter guess is a
letter off. Removed 'scheme' from the toolbar readout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:12:20 -04:00
kennethreitz b4df695f57 Family inspector + strength-as-saturation
#4: caret in a colored word names its family in the readout —
"rhymes ay t — night, light, flight". The colors stop being a mystery.
#5: slant rhymes render at 62% of a perfect rhyme's fill, so the page
shows match strength, not just match presence.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:07:40 -04:00
kennethreitz 0bd3dab542 Scope rhyme matching to within a stanza
Each blank-line-separated stanza is its own rhyme scheme. The perfect-
rhyme pass is now keyed per stanza, and the multi/coda fusion steps
won't union families across stanza boundaries (slant/multi/consonance
buckets were already stanza-keyed). light/night in verse 1 no longer
links to bright/sight in verse 2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:00:53 -04:00
kennethreitz 676a596a66 Weak endings need a full vowel; trailing sibilant is transparent
middle / unavoidable shared only a schwa+L tail — the weak-ending rule
firing on a reduced vowel. Weak endings now require a full final vowel
(infancy/see on IY stays). Surfaced that swimmers' plural -s blocked
its coda from nesting with finisher; a trailing sibilant is inflection,
so it's stripped from the coda tag — Wayne's chain stays whole, garbage
(JH) still stays out.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 02:58:03 -04:00
kennethreitz c77d24fb83 Weak V-x attach needs coda nesting too
garbage/javascript were joining dollar/scholar's AA-x group via the
attach path, which lacked the coda-class guard the bucket path has.
Now a bare V-x key attaches only when the token's coda nests with the
group's — same rule both paths. syrup/burden was the same looseness
(ER-schwa, mismatched coda) and now correctly splits; the real
stir-up/were-up perfect phrase matches stay.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:35:31 -04:00
kennethreitz e6b86a8a88 16-color palette with least-used assignment
The Python diss put pink on five different families: 18 families, 12
colors, and the assignment kept grabbing low indices so one hue piled
up. Now 16 colors (added cyan, amber, lavender, emerald) and each
family takes the globally least-used non-adjacent color, so hues
spread evenly — no color repeats more than twice on a dense page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:31:52 -04:00
kennethreitz 411681d0a0 Vowel families must be local
Slant/multi attachment, multi buckets, and unequal-length containment
fusion now require members within ~6-8 lines. "All Me" was chaining
Baby/Mercedes/loan/being/Daddy into one teal family across 110 lines;
vowel assonance is local evidence, not global. Perfect rhymes and
equal-key fusion stay global (a real rhyme carries any distance).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:56:56 -04:00
kennethreitz 77316330ea Weak V-x families stop gluing: coda-nested buckets, gated fusion
The spotlight exposed forever/question/extra/sequential as one EH-x
family. Three fixes:
- phrases obey refrain muting (the «Forever ever» carpet)
- bare V-x buckets subdivide by nesting final-coda classes, so
  placement (NT) keeps creation (N) but forever (.) releases
  sequential (L); phrases ride the main cluster
- single-vowel suffix fusion requires member coda sets to nest

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:40:34 -04:00
kennethreitz 329c114b3e Spend the palette better: dedupe hues, adjacency-aware assignment
r9/r10/r11 were a pale pink, a second teal, and a second orange — now
rose, indigo, and chartreuse. Color assignment stops being gid % 12:
each family picks the first hue not worn by families on its own or
neighboring lines, so similar colors never sit next to each other.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:15:58 -04:00
kennethreitz b204c8d9b9 Multis lookup and per-line syllable counts
- Multis: dictionary search by vowel skeleton — single words and
  two-word combos matching the target's run from its stressed anchor
  (charisma -> little/women/business; vacation plans -> information
  back). Perfect rhymes excluded; phrases supported as targets; new
  "multis" row in the rhymes section. Indexes warm at boot.
- Counts toggle: syllables per line in dim digits at the editor's
  right edge, wrap-safe and live; carried into the PNG export.
- Suffix fusion: multi families whose vowel keys are end-aligned
  containments merge (back pocket / rap profit / off it / still in
  office = one Em chain), with trailing schwas stripped before
  comparison; the longest end token now owns the scheme slot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:23:29 -04:00
kennethreitz e9ebd318cd End-dominated vowel fusion; annotation lines render dimmer
- Same-vowel perfect families fuse when both live at line ends:
  blood/mud + thugs/drugs (+does/love/enough) read as Kanye's one AH
  chain; mid-line families keep their codas distinct
- Annotation lines (#, [, ( starts) render in a dim ink — the
  highlight layer now owns the glyph color (textarea text is
  transparent over it), in the editor and the PNG export

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:02:16 -04:00
kennethreitz 5e7845f0bb Parentheticals rhyme internally but never claim the line ending
(justify greed) now lights up with need/breed as internal rhyme; the
ending slot stays with the last word outside parens, so (yeah) tails
still can't set the scheme. The old all-or-nothing exclusion is gone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:57:49 -04:00
kennethreitz e865fc17e9 Sidebar rebuilt as a word page; phrase lookups
One lookup renders the whole entry — phonetic readout as a plain
header (card chrome and dismiss gone), describes, rhymes by syllable
(+near), synonyms always fully expanded — with collapsed sections
behind "more…", a clickable history trail, and lookups firing as you
type (Go button and mode seg removed).

Multi-word lookups work: phrases read straight through for the
phonetic readout, rhyme on their final word (labeled), and hit
WordNet compounds for synonyms (new york -> Empire State).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:36:39 -04:00
kennethreitz d7fed935f0 Compound reading wins: mirror word groups dissolve into phrase families
four/door and inch/hinge were pure mirrors of «four-inch»/«door
hinge» yet their word fills painted over the orange-family phrase
color. A word group living entirely inside one family's phrases now
dissolves, so the phrase color paints the whole compound.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:21:16 -04:00
kennethreitz faa3522956 Repetition is refrain, not rhyme
Identical words/phrases no longer form a color group on their own — a
group colors only once a differing word rhymes into it. Repeated
endings still share a scheme letter (refrains scan), and a repeated
unrhymed ending no longer flags as "unanswered".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:15:27 -04:00
kennethreitz 478870b4a2 Rime keys strip leading onsets from unstressed pronunciations
CMU's unstressed "this" (DH IH0 S) has no stressed vowel, so its
rhyming part included the onset and founded a consonant-led key the
coda-nest fuse couldn't parse — repeated "this" fell out of the
wrist/assist/shit chain in full songs. Rimes now always start at a
vowel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:10:26 -04:00
kennethreitz f56d03eabf Coda-nesting fusion, s/z neutralization, wrapping draft tabs
- Single-vowel perfect families whose coda classes nest fuse into one
  chain: wrist (IH S T) hubs this (IH S) and shit (IH T), which ride
  as slant satellites — Logic's hook reads as one color
- Final s/z voicing neutralizes in coda classes and weak-ending keys:
  vamonos rhymes dominoes
- The drafts bar wraps instead of scrolling, so many drafts stay
  visible

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:05:45 -04:00
kennethreitz fcf18f627c Cadence families and unanswered endings
Two starred ideas, zero new chrome:
- Rhythm dots take a shared color when 2+ lines have the identical
  stress contour (5+ syllables) — flow rhymes, visible
- Line-endings with no rhyme partner get a faint gray fill in the
  rhyme layer: the open loops that show where to strike next

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:39:24 -04:00
kennethreitz c7af71ac75 Three lookup/layer upgrades: ticks, senses, alliteration
- Rhyme/synonym chips already in your draft get a gold tick
- Word card shows WordNet sense count (3+) — double-entendre fuel
- "alliteration" toggle underlines words sharing an initial sound
  (locally clustered, 3+ words), in the editor and the PNG export:
  fills = tail sound, underlines = head sound

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:27:09 -04:00
kennethreitz 56ec754c5f Rapper-native: ad-lib awareness and a bar counter
Inline (parentheticals) are delivery, not text — they no longer rhyme
or steal the line-ending slot ("...bunch (yeah)" rhymes on bunch).
The readout leads with "bar 3/16" for the caret's place in its verse.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:16:39 -04:00
kennethreitz 1d3e78bb99 Stress dots on monosyllables too; nudged lower again
Single-syllable words now get one dot; dots at 2.2em, line-height 2.35.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:47:40 -04:00
kennethreitz c8a498d4e5 Stress-dots layer: syllable emphasis under each word
Optional "stress" toggle renders ●/○ dots beneath every 2+ syllable
word (filled = stressed) in a transparent overlay behind the textarea,
so the dots never disturb text metrics. Backend emits per-word stress.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:42:57 -04:00
kennethreitz 4ab6545bda Remove dictionary definitions; keep the engine-native word card
Drops the dictionaryapi.dev meanings/examples entirely. The lookup
panel ("Rhymes & words") now shows a phonetic readout for the word —
/phones/, syllables, stress, rhyming tail, sounds-like (homophones),
and what it rhymes with in your draft — over Rhymes / Synonyms lists.
RhymeZone-inspired touches kept: rarity-styled chips (common bold,
rare dimmed) and homophones.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:28:51 -04:00
kennethreitz e1b47e3af7 Remove the Mosaics tool; def card stops rebuilding on submode clicks
The two-word generator goes (the /api/word phonetics card stays);
the definition card now belongs to the word — switching Rhymes/
Synonyms only swaps the list, and a dismissed card stays dismissed
until a new word is looked up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:24:11 -04:00
kennethreitz e45fbf6eb3 Mosaics: first-vowel anchoring and honest empties
Anchoring at the first vowel instead of the stressed rime lets
tonight rebuild as "a night"; single-letter left words return with a
rank penalty; indexes warm at boot; the no-results message stops
blaming syllable count.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:21:45 -04:00
kennethreitz 20f722e5c9 Words inside grouped phrases keep word-level rhyme rights
The pass-4 suppression predates fills-only rendering; mind/time now
pair even while «all this time» rides its mosaic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:19:03 -04:00
kennethreitz 43bbd527a4 Sidebar exploration tools: mosaics, phonetics, draft cross-reference
- Mosaics submode: two-word phrases that rhyme with a word perfectly,
  built by splitting its rime and searching both halves with reduced-
  vowel squeezing (placement -> place meant, creation -> way shun)
- Definition cards show phonetic anatomy (/phones/ · syllables ·
  stress dots · the rhyming tail) and what the word already rhymes
  with in your draft
- Secondary pronunciations only claim partners within 4 lines, so the
  verb pred-i-KATE can't hand predicate to a distant hook's "eight"

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:17:45 -04:00
kennethreitz daa4b7e8c9 Cut display noise: refrain muting and local consonance
Words a draft uses 4+ times (niggas, bitch, Money) stop lighting up
mid-line — their line-end uses still rhyme. Consonance clusters break
on gaps over two lines: speech can't light keep from eight lines away.
Locks the swimmers/finisher/twist-her chain with a test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:07:05 -04:00
kennethreitz f15712a3da Schwa-heavy phrases pair only with parallel phrases
A phrase run with <2 full vowels can't barge into a word family
("Two bitches" -> the Tuna chain) but may pair with a structurally
parallel phrase (clock's ticking / stop tripping).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:03:41 -04:00
kennethreitz c8b126d539 Weak endings demoted to a last-resort pass
The -er weak key was claiming commissioner/finisher before the
multisyllabic pass could unite them with militia — Wayne's chain
split into two colors. Weak endings (infancy/see) now run dead last.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:59:24 -04:00
kennethreitz 35b68cf7b8 Cot-caught merger + end-position assonance for phrases
AO merges into AA except before R (thought/lot, off/forgotten; car/
core stay apart). Line-ending phrases may rhyme on their pure vowel
run like end words always could — "forgotten" / "off of" lands.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:51:19 -04:00
kennethreitz 8b7ac40f51 Weak endings carry their coda
The weak-end key is now the full final-syllable rime in its own
keyspace, and groups advertise their founding rime's final syllable:
infancy still joins see/be/me (open IY), but screams (IY M Z) no
longer rides the divinity/entirety family.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:40:39 -04:00
kennethreitz da3e3433d0 Pronunciation overrides for CMU howlers
stasis (STAH-seez?!) and kinda (KIH-nda) get corrected primaries;
the dict entry stays as a secondary candidate. Oasis of stasis now
glows as the perfect rhyme it is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:37:51 -04:00
kennethreitz a8c076163d Weak endings rhyme at line ends
Feminine rhymes anchor on the unstressed final syllable: infancy
joins see/be/me (Lateralus). End-slant pass tries the bare final
vowel as a fallback key, with claiming.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:26:09 -04:00
kennethreitz c94cb9f42e Nasal coda class, go-live polish, mobile layout, hardening
- M/N/NG merge in consonance keys (damn/hand/plans, time/line); vc
  consensus lets vowel-founded groups advertise an agreed coda
- Meta description, OG tags, orange favicon, theme-color
- Mobile: single-column layout, panel stacks under the editor
- /healthz, 100k-char draft cap, lookup length/limit caps
- Internal fills brightened (19%, ends stay 34%)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:19:40 -04:00
kennethreitz aeb3fcdbfc Neutralize NEAR/CURE vowels before R; un-stopword "here"
CMU's fear (IH R) now rhymes with hear/here (IY R) as it does in
every English dialect; same merge for UH/UW before R. "here" earns
back internal-rhyme rights — poets rhyme it constantly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:07:31 -04:00
kennethreitz 2b9395f0ee Exact rime lets stopword-anchored phrases pair with words
Prufrock's "is it" / "visit" are phone-for-phone identical; identity
evidence overrides the anchor rule. Stopword-anchored phrases still
can't form groups among themselves.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:03:48 -04:00
kennethreitz 58ee98d175 Mosaic phrases reach members' advertised anchors
Groups advertise members' high-specificity mosaic keys (2+ full
vowels) for attachment, and a both-halves-taken phrase may join any
family except its anchor's own — Gambino's "pass the time" now ties
to mastermind/rind across the Mass/pass claim.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:02:32 -04:00
kennethreitz cab28ed23e Mosaic triple rhymes + UI truncation
Three-word vowel mosaics (mean to it / seen do it / theme music) now
group, gated hard: the mosaic must draw a full vowel beyond its anchor
word, and all-phrase buckets mirroring the same two word groups stay
suppressed. Scheme readout truncates at 16 letters; draft tabs cap at
170px with ellipsis.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:57:31 -04:00
kennethreitz d2d38d0d5a Both-halves phrases may still tie into a third family
four-inch and door hinge join the orange/storage/porridge clan even
though four/door and inch/hinge each rhyme on their own — a phrase
whose target group differs from both halves' groups carries new
information. The full orange verse is now a test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:45:39 -04:00
kennethreitz 56f2332ed2 Coda consensus: phrases can join vowel-founded groups
When a slant group's founding key is vowel-only but 2+ members agree
on a coda (orange/pourage both AO-R-schwa), the consensus key is part
of the group's sound — door hinge joins from its own line now.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:41:15 -04:00
kennethreitz 4d024c7194 Phrases yield only when both halves already rhyme
beast mode / sleep though / seats though: the though half rhyming
shouldn't suppress the phrase that carries the beast/sleep/seats half.
Pure-redundancy phrases (oh my over oh+my) still yield.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:35:54 -04:00
kennethreitz 924cc54fd5 Consonant-supported phrase matching + richer synonyms
- V+schwa phrases now need their coda consonant to agree with the
  family they join: door hinge keeps orange's R, sloth hugs no longer
  rides over/shoulder. 3-vowel and full-vowel phrase runs unchanged.
- Synonyms lemmatize the query (keys -> key) and return sections:
  synonyms, opposites, broader, related (antonyms, hypernyms,
  satellites, derivational forms) — frequency-ranked, deduped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:27:28 -04:00
kennethreitz 74983245ad Merge near rhymes into the Rhymes view
mode=rhyme now returns perfect rhymes plus a "near" list; the panel
shows them as one view with dashed chips for the slant side.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:21:26 -04:00
kennethreitz da82cd6ee2 Multi-anchor rhyme keys + Dictionary mode in the sidebar
KET-a-mine can now rhyme from its first primary stress, not just its
dictionary-final one, so it joins meth-am-PHET-a-mine's family; multi
buckets claim biggest-first since tokens carry several anchor keys.
The lookup panel grew a fourth mode: Dictionary.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:14:24 -04:00