Commit Graph

80 Commits

Author SHA1 Message Date
kennethreitz a7cb3ef4ad Smart paste: normalize typographic punctuation, strip lyrics-site cruft
Curly apostrophes broke phonetic tokenization (don't -> don + t);
pasted and dropped-in text now normalizes quotes/nbsp and drops
Genius-style cruft lines (Contributors, "... Lyrics" headers,
Translations, You might also like, Source:, Embed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:39:13 -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 2d77760633 Rename buttons: Save PNG and Save TXT
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:08:10 -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 b2788e3620 Beats upgrade + looser cadence matching
Beats: every pattern gets an 808 bass line (pitch-glide sine, per-
style note movement), trap/halftime get layered claps, lo-fi/jazz get
open hats, hats humanize velocity. Two new styles (Halftime, Dembow),
a tap-tempo button, and a four-dot beat indicator synced to the bar.

Cadence: flexible monosyllables (x) read as stressed, so contours
differing only in flex positions join one flow family.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:59:27 -04:00
kennethreitz 45bb65d9d1 Normal caret height when rhythm is off
Line-height returns to 1.9 by default; the roomy 2.35 line box (and
its tall caret) only applies while the rhythm dots need the space.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:53:36 -04:00
kennethreitz 49b536c434 Toggle order rhyme/alliteration/rhythm; dots persist while typing
The rhythm layer now keeps dots over the unchanged prefix of an
edited line (same logic as the rhyme fills) instead of blanking the
whole line until re-analysis.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:52:25 -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 57710fd001 Files in, files out: Save .txt and drag-drop import
Drafts escape localStorage — a Save .txt button downloads the current
draft (named after its first line), and dropping text files anywhere
on the page turns each into a new draft tab.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:36:45 -04:00
kennethreitz 16b5601cdd Rhyme toggle: switch the color highlighting on/off
First in the toggle row, on by default; the export honors it. Rhythm
dots and alliteration underlines are independent layers, so any
combination works (e.g. rhythm-only for a clean flow view).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:34:26 -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 a5e835bcd7 Drop a stray measurement line in the export dot loop
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:12:14 -04:00
kennethreitz 8262f65ae7 Export carries the rhythm dots when the toggle is on
WYSIWYG: PNG line spacing widens to fit, dots centered under each
word in ink, same notation as the editor.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:12:03 -04:00
kennethreitz 1027302ab8 Rename the stress toggle to "rhythm"
Sheet music for rapping — the label should say what it feels like,
not what linguists call it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:10: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 8897b63fa0 Stress dots in ink (white) instead of gold
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:46:39 -04:00
kennethreitz 4afb8f960b Stress dots slightly lower (2.04em, line-height 2.2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:45:58 -04:00
kennethreitz 566645e22d Nudge stress dots lower (1.9em) with a little more line-height
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:45:40 -04:00
kennethreitz 88aad2de45 Lower the stress dots further (1.72em)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:45:10 -04:00
kennethreitz c858c9fd19 Stress dots sit lower; toggle moves right of Export image
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:44:41 -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 2c07a5ec37 Remove the meter-check toggle
The wavy break-warning and its checkbox are gone; the toolbar keeps
the neutral per-line readout (syllables + meter label) on the caret
line. Backend still computes it; the warning UI just retired.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:40:14 -04:00
kennethreitz d8d9784300 Describes is the default lookup lens
First in the seg row, the initial mode, and where double-click lands.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:36:14 -04:00
kennethreitz dc09641756 RhymeZone-inspired: Describes mode and the ? shortcut
- "Describes" lookup mode: adjectives that commonly modify the word
  (night -> dark, starry, silent) via Datamuse rel_jjb, client-side
- Typing a trailing "?" on a lookup jumps straight to synonyms

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:32:33 -04:00
kennethreitz 16f1db393a Remove Insert at cursor from the word card
The card is now read-only — phonetic readout and dismiss only. Dropped
the orphaned insertAtCursor helper and dead button CSS with it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:29:38 -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 79dee968fa Dim internal fills (14%, phrases 10%)
Ends stay 34% — internals read as texture, not competition.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:10:26 -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 f46f319069 Export image button; remove Load sample
Client-side canvas render of the draft with its rhyme colors — 2x
PNG, draft-titled filename, rhymepad.org watermark. The sample still
seeds first visits; the button is gone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:04:16 -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 bf1fbbfce6 Polish pass: volume, keyboard, focus, titles, tooltips
- Beats get a master volume slider (perceptual curve)
- Cmd/Ctrl+S flashes "saved" instead of the browser dialog;
  Cmd/Ctrl+K jumps to the dictionary input
- Editor autofocuses on desktop; lookup input selects-all on focus;
  panel scrolls to top on new lookups
- Browser tab title follows the active draft
- Tooltips on sample button and meter check

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:53:13 -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 e49e5f2844 UX feel pass
- Edited lines keep highlights over their unchanged prefix (no more
  blank-flicker while typing at line ends); 180ms debounce
- Sequence guard against out-of-order analysis responses
- iOS: 16px editor font (no zoom-jump); touch word-selection opens the
  dictionary (double-click equivalent)
- First-ever visit seeds the sample draft so colors show immediately
- Draft tabs restore caret and scroll position

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:44:16 -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 e6a721264b Meter check never persists — always starts off
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:27:38 -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 359ed2c00d Widen the end-vs-internal fill contrast
End rhymes 34%, internals 13% (phrases 22/10) — scheme structure
reads at a glance without the old underlines.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:13:20 -04:00
kennethreitz ba0c8a715f Highlights are fills only — no more underlines
End rhymes keep the stronger tint; phrase rhymes paint the stretches
their words don't claim, so multi-word matches still read as units.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:09:35 -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