A companion for writing French verse in Obsidian: syllable counting with full scansion
breakdown, a rhyming dictionary, thematic vocabulary, synonyms/antonyms (including live
lookup from external sources), and a quick reference on French versification — all in one
side panel, no internet connection required for the core features.
Quick start
- Install the plugin (see Manual installation) and enable it in
Settings → Community plugins.
- Click the quill 🪶 icon in the left ribbon to open the notebook.
- Type or paste a verse in the Syllables tab, or a word in the Rhymes tab.
- On first launch, the plugin downloads its ~210,000-word phonetic dictionary (1.9 MB, once
per dictionary version — see Base dictionary and personal layer).
Contents
Features
The plugin opens as a side panel with eight tabs. Everything below works offline, except the
sources you choose to query online (see Online sources).
Syllables
Paste or type your verses: each line is broken down into syllables in real time
(mon/ta/gne).
- Silent e — counted following the classic rule: only when it is neither at the end of a
line nor followed by a word starting with a vowel.
- Metre and rhyme gender — the metre (octosyllable, alexandrine…) is detected
automatically, and a small F/M badge gives the rhyme's gender (feminine if the line ends
on a silent e, masculine otherwise). With Alternance M/F ticked (default), a red
alternance badge flags a line that doesn't rhyme with the previous one yet shares its gender,
against the classical alternation rule — across stanza breaks too. With Hémistiche ticked
(default), alexandrines (6//6) and decasyllables (4//6) show their caesura as
//, and a red
césure badge flags a caesura inside a word or on a pronounced mute e.
- Fixed forms — the Forme menu checks the poem against a chosen form and lists each rule
as ✓ or ✗ with the faulty lines (⚠ for hints the tool can't decide alone). Forms, grouped in the
menu: haïku, tanka, triolet (short forms); French and Shakespearean sonnets; rondel,
rondeau (with its rentrement), villanelle, ballade (refrain forms); pantoum, terza
rima, sextine (chained forms); and the Fahsee (five 5-line stanzas of 5 // 5 decasyllables
rhyming ABABA, with linking and return words). Depending on the form: stanza structure,
syllable counts or isometry, rhyme scheme, refrains and repeated lines, chained lines or
end-words, caesura (a form can impose its own, e.g. 5 // 5). Two rhyme hints apply to every
form: a word rhyming with itself or its derivative, and the classical written-consonant rule
(-s/-x/-z only rhyme together). Faulty line numbers link to the Rhymes tab. The Note
active button loads the open note into the draft: the selection if any, else the first
```poeme block, else the whole note (Markdown syntax stripped); a forme: frontmatter
property picks the form.
- Synérèse / diérèse — when a word contains an ambiguous hiatus (nation, poésie,
paupière), the main line shows the synérèse reading (hiatus as one syllable) and a
second line underneath shows the diérèse (hiatus split in two). You choose the reading
that fits your verse; the "Variante diérèse" checkbox hides that second line.
- Rhyme scheme detection — the poem is split into stanzas (blank-line separated); each
stanza's end-rhymes are labelled A/B/C…, and a quatrain matching AABB, ABAB or ABBA is named
accordingly. By default each stanza restarts at A; tick "Rimes continues entre strophes" to
keep the lettering going across the whole poem (a sonnet's tercets as CCD/EED after its
ABBA/ABBA quatrains).
- Rhyme colour-coding — "Couleurs de rimes" gives each line a coloured badge and border
matching its rhyme group, in the analysis view (not in the raw text box, which a plain
<textarea> cannot colour).
- Markdown export — "📋 Exporter en Markdown" copies a table (verse / syllables / rhyme
gender / rhyme letter / rhyme quality) to your clipboard. Rhyme quality is filled in from the
second line of each rhyme group, relative to the first. "📄 Copier le brouillon" copies the
raw draft as-is.
- Persistent draft — your text is saved automatically between sessions.
Rhymes
Type a word and get masculine/feminine rhyme suggestions with their syllable count.
- Sources — roughly sixty built-in sound families, overridden by exact matches from a
complete phonetic dictionary when you have one (see
Extending your dictionaries). The
base dictionary downloaded on first launch covers ~210,000 words.
- Filters — first letter, syllable count, rhyme quality (pauvre / suffisante /
riche+, with Très riche and Léonine as sub-filters of riche+), and, since 2.29,
grammatical category (Nom / Verbe / Adjectif / Adverbe / Autres — a word can match
several, e.g. abaissé is both verb and adjective). Quality is estimated from the trailing
sounds shared with your word, with a syllable-aware check (attack + vowel + coda) separating
riche / très riche / léonine. The grammatical category comes from Lexique383 and, for words
Lexique doesn't cover, Morphalou; a word the base dictionary can't categorize (a Méral rare
word, or a RimesSolides/Wiktionnaire result absent from the local dictionary) is never hidden
by this filter.
- Visual read — each group shows a colour-coded quality summary, and every word chip
carries a matching coloured border and badge, with a tooltip explaining the criterion.
- Online complements — tick RimesSolides (rimessolides.com)
and/or Wiktionnaire (the words it files under the same rhyme category — partial coverage,
handy as a fallback and for rare words). All filters apply to their results too, including
the grammatical category one, so you can narrow a 4,000-word RimesSolides list the way the
site itself can't. Local and online results appear in separate collapsible blocks.
- No self-rhymes — the searched word's own inflections (armée → armées, armé,
armer…) are left out, since a word doesn't rhyme with itself.
- Mode assonance (off by default) — also shows words sharing the same vowel but differing
after it (ombre/montre), in a separate dashed-border section, never mixed with true
rhymes. It also loosens rhyme-scheme detection and colour-coding in the Syllables tab, which
share the same check.
Inspiration
Type a common word (forest, sea, night, love, medieval…) and get rarer, more
literary or archaic vocabulary on the same theme (forest → canopée, sylve, futaie,
orée), each with a short gloss.
- Built-in themes — about thirty, including one dedicated to old/archaic French.
- Online sources — optionally tick CNRTL, Wiktionnaire and/or JeuxDeMots for lexical-field
material fetched live (collocations, related vocabulary, derived words, sayings,
characteristics, parts…). Sub-sections are coloured by nature, not by source (see the
collapsible legend).
- Build your own fields — click any word to select it; the selection persists across
searches, so you can combine several queries (sea + colour). An action bar then adds the
whole selection to a lexical field (existing, autocompleted, or created on the fly with its
own trigger keywords) or as rare words into
dictionnaire-perso.json. Known definitions
are carried over; words from online sources can be defined later in the Notes tab.
Synonyms
Type a word to see synonyms and antonyms.
- Offline first — a small built-in dictionary answers instantly, extended by the synonyms of
your personal dictionary.
- Online sources — CNRTL, CRISCO (Université de Caen) and/or Wiktionnaire, each toggled
independently. A one-click button saves any online result into your personal dictionary for
offline use; click a chip first to exclude it from that save.
- Rhyme-aware — every synonym/antonym that rhymes with your word gets a quality badge, and
the optional "Rime avec…" field keeps only those that also rhyme with a second word —
handy when another line has already fixed the rhyme.
Definitions
Look up a rare word before using it.
- A quick one-line definition appears immediately, then up to seven dictionaries (TLFi,
Wiktionnaire, Académie 9th/8th/4th editions, Littré, DMF for Middle French — only those that
cover the word) are offered as pills, TLFi first.
- Each source is split into collapsible sections (numbered senses, locutions, historical
notes…), with pure-definition text highlighted as on the CNRTL site.
- "Ouvrir sur CNRTL ↗" opens the real site for whatever you've typed. Nothing is looked up
automatically.
Hasard
One button, one rare or forgotten French word at random (smaragdin, coruscant,
pétrichor, s'ennuiter…), with a short gloss and quick links to the Definitions and Rhymes
tabs. A live counter shows how many words match the current filters before you draw, and the
draw avoids repeating recent words (a rolling window adapted to the filtered pool).
- Tags — every word can carry free-form tags (désuet, savant, poétique…), each with its own
stable colour, added or removed on the fly: preset buttons (your most-used tags first), a
free-text field with autocomplete, or several pills at once in the "voir tous les tags" panel.
- Filtrer par tags (collapsible, purple) — OR by default (at least one checked tag).
Tick "Tous les tags cochés (ET)" for a real intersection (méral + poésie together).
"+ au moins un tag en plus de ceux cochés" asks for the checked tag(s) plus any other
tag — "this tag, but already categorised further".
- Exclure des tags (collapsible, gold) — the NOT logic: removes any word carrying one of the
checked tags, whatever the include filters. "🚫 Masquer les mots connus" toggles the reserved
"connu" tag into this set.
- Shortcuts — "🚫 Explorer les exclus" (review mode, combinable with tag filters), "☆ Explorer
« like »" (your "like" tag), "📭 Masquer les mots déjà tagués" (0 tags) and "🏷️ Explorer les
multi-tagués" (2+ tags).
- Saving — "💾 Graver dans dictionnaire-perso.json" (after the tagging controls: tag first,
commit second) writes the drawn word's tags permanently and clears its session record; a bulk
"Graver en masse" lives in Settings. Merging never silently drops a note: if two differ and
neither contains the other, both are kept, joined by "· · ·".
- Stats (collapsible) — total words, excluded/untagged counts, "% already seen", a per-tag
breakdown and every tag combination actually present — handy to decide when to import new
words or spot an over-used tag.
- Manual entry — a small form adds a rare word (word, optional gloss, optional tags)
straight into your personal dictionary. Tags can also be declared directly in the file (see
Format E), e.g. to pre-tag a bulk import.
Notes
A maintenance tab listing every rare word and lexical-field word still missing a definition
(typically after a bulk import or an online source with no gloss), each with an inline field
to write one — saved to dictionnaire-perso.json, and removed from the list once done.
Guide
A quick reference on French versification: syllable counting, metre names, caesura,
enjambment, stanza names, classic forms (sonnet, rondeau, ballade, villanelle, pantoum,
triolet, virelai, tanka, calligramme, ode, haiku, fable, acrostic, free verse…), and the basics
of rhyme (schemes, quality, masculine/feminine alternation, eye-rhymes vs. ear-rhymes).
Commands
From the Command palette (Ctrl/Cmd+P):
- Open the Carnet du Poete
- Count the syllables in the selection (or the current line) — result in a notification,
with rhyme gender and diaeresis alternative.
- Search for rhymes for the selected word — opens a pop-up with the same results as the
Rhymes tab.
- Search for inspiration (vocabulary) for the selected word
- Reload the personal dictionary (dictionnaire-perso.json)
Manual installation
- Locate your vault's plugin folder:
<your-vault>/.obsidian/plugins/
(create the plugins folder if it doesn't exist yet).
- Copy the entire plugin folder into it, then make sure it is named
carnet-du-poete
(it must contain manifest.json, main.js and styles.css).
- In Obsidian: Settings → Community plugins. Turn off Restricted Mode if needed, then
enable Carnet du Poete in the list.
- A quill 🪶 icon appears in the left ribbon — click it to open the notebook.
No build step is required: the plugin is plain JavaScript, ready to run.
If you install via BRAT, note that BRAT only
downloads main.js, manifest.json and styles.css from the repository — it never copies a
custom data file. The base dictionary is downloaded by the plugin itself (see the next
section), and your personal dictionnaire-perso.json lives in your vault.
Extending your dictionaries with dictionnaire-perso.json
Everything below is optional. Out of the box, the plugin already ships with a curated rhyme
dictionary, ~30 vocabulary themes, and a small synonym list. dictionnaire-perso.json lets you
add to (or, for rhymes, largely replace) any of these — all from a single file.
Base dictionary and personal layer
Since 2.28, the dictionary is split in two files:
dictionnaire-base.json.gz — the published dictionary (~210,000 words with phonetics,
synonyms, Didier Méral's rare words). The plugin downloads it from this repository's GitHub
release into its own folder, on first launch and again only when a new version of the base
is published. This is the plugin's only automatic network access; no data about you or your
vault is sent. Offline, the plugin keeps the base it already has and retries at the next launch.
The plugin never writes to this file, so it can be replaced safely.
dictionnaire-perso.json — your own additions only (synonyms, rare words, tags, notes,
vocabulary themes), created in your vault at your first annotation. On loading, it is merged
over the base: tags add up, your note is shown above the base note, words you never touched receive
the base's corrections. A new base can therefore never erase your work, and uninstalling the
plugin doesn't delete it.
Upgrading from 2.27 or earlier: an old all-in-one dictionnaire-perso.json is converted
automatically at the first launch of 2.28 — the plugin first saves a timestamped copy
(dictionnaire-perso.sauvegarde-YYYYMMDD-HHMM.json, next to the new file; you can delete it
once everything looks right), then keeps only what differs from the base. If the old file was in
the plugin's folder, the new one is written at the root of the vault.
Where the plugin looks for it
The plugin searches, in order, and stops at the first match:
- The plugin's own folder (
.obsidian/plugins/carnet-du-poete/).
- The root of
.obsidian.
- The root of the vault itself.
- Anywhere else in the vault's normal content (any note folder) — the simplest option on
mobile or with BRAT: just drop the file into your vault like any other file.
- Any subfolder of
.obsidian, searched recursively (up to 5 levels deep), in case it ended
up somewhere unexpected.
You can reload it at any time without restarting Obsidian via the command
"Reload the personal dictionary (dictionnaire-perso.json)" — a notification will confirm
what was found, or tell you it searched everywhere and found nothing.
All of the following top-level keys are optional and can be combined freely in the same file.
Added to the built-in ones:
{
"familles": [
{
"son": "-onk [custom]",
"exemple": "conque, jonque",
"terms": ["onque", "onk"],
"mots": ["conque", "jonque", "adonque"]
}
]
}
terms are the spelling endings that trigger this family (longer, more specific endings win
ties). mots is the list of words offered as rhymes.
Exact matches from it take priority over the built-in approximation:
{
"ka": ["avocat", "cas", "syndicat", "..."],
"sa": ["cassa", "dansa", "pensa", "..."]
}
A flat object where each key is a phonetic rhyme identifier (its exact form doesn't matter, it
is never shown) and the value is the list of words that truly rhyme, grouped by actual French
pronunciation rather than spelling. This is the export format used by projects such as
Remède; if you ever generate one (for instance from a
phonetic lexicon such as Lexique383), drop it in as-is. Very large groups (some verb-conjugation
endings exceed a thousand words) are shown 100 at a time with a button to reveal the rest.
Added to the built-in ones:
{
"champsLexicaux": [
{
"theme": "My custom theme",
"motsClefs": ["trigger1", "trigger2"],
"mots": [
{ "mot": "rareword", "note": "short gloss or nuance" }
]
}
]
}
motsClefs are the everyday words that trigger this theme in the Inspiration tab (matching
ignores accents and simple plurals). A theme is matched against an existing one (built-in or
already loaded) by its name, case/accent-insensitively — if it matches, the two are merged
(keywords unioned, words added, empty notes filled in) rather than kept as a separate, invisible
duplicate. If your dictionnaire-perso.json predates this behaviour, run Settings → Carnet du
Poète → "Nettoyer et fusionner dictionnaire-perso.json" once to merge any existing duplicates
and repair auto-generated keyword lists from before the fix (a multi-word theme used to collapse
into one unsearchable glued string, e.g. "Night & darkness" → nightdarkness instead of
["night", "darkness"]).
Added to the built-in ones — this is also exactly what the "💾 Save to my personal dictionary"
button in the Synonyms tab writes for you automatically:
{
"synonymes": [
{ "mot": "brume", "synonymes": ["brouillard", "vapeur"], "antonymes": ["clarté"] }
]
}
Added to the built-in pool of rare/forgotten words, with optional tags for filtering the random draw (also addable/removable later from the UI):
{
"motsRares": [
{ "mot": "estival", "note": "qui appartient à l'été", "tags": ["saison"] }
]
}
This is also the format for bulk-importing a large word list (thousands of entries at once are
fine performance-wise). Tags added from the UI during a session live temporarily in Obsidian's
plugin data, not in this file — use the "💾 Graver" button (per word, Hasard tab) or "Graver en
masse" (Settings, all at once) to commit them here permanently.
A richer variant of format B, informally called "Format C" in the changelog, which can coexist
with format B keys in the same file. Instead of a flat
list of words, each key maps to an object of word → details, giving the word's full
phonetic transcription and its own synonyms/antonyms:
{
"sE": {
"abaissai": {
"phonetique": "abEsE",
"synonymes": [{ "mot": "baisser", "phonetique": "bese" }],
"antonymes": []
}
}
}
The phonetic alphabet is SAMPA-like, one character per phoneme (vowels: a i y u o e E O 2 9 ° @ § 5 1 — E=[ɛ], O=[ɔ], 2=[ø], 9=[œ], °=[ə], @ § 5 1=the four nasal vowels
[ɑ̃ ɔ̃ ɛ̃ œ̃]; consonants use their usual letter, R=[ʁ], S=[ʃ], Z=[ʒ], N=[ɲ], and j/w/8
for the semi-vowels [j]/[w]/[ɥ] — this matches the phonetic column exported by
Lexique383-based tools). synonymes/antonymes entries can be
plain strings or, better, {"mot": "...", "phonetique": "..."} objects — when the phonetic
field is filled in (because that synonym is itself a key elsewhere in the same dictionary),
rhyme quality between it and any other word becomes exact rather than approximated.
Whenever both words being compared (for rhyme quality, or in the Synonyms tab's "Rime avec…"
field) have a known phonetic transcription, the plugin uses it instead of the orthographic
heuristic — see Known limitations.
Online sources
Apart from the one-time download of the base dictionary from GitHub (see
Base dictionary and personal layer), the plugin only goes
online when you tick a source. Several tabs can query external sites live, directly from your device (through Obsidian's
requestUrl API, which works the same on desktop and mobile, without browser CORS
restrictions).
| Source |
Used in |
What it brings |
CNRTL (cnrtl.fr) |
Definitions, Synonyms, Inspiration |
The portal's internal JSON API: seven dictionaries (TLFi, Wiktionnaire, Académie 9th/8th/4th, Littré, DMF), synonyms, collocations, word family, sayings. When a word has several entries (os adjective vs noun), an "Entrée" pill row lets you pick one — the noun by default. |
Wiktionnaire (fr.wiktionary.org) |
Synonyms, Inspiration, Rhymes |
Its API: "Synonymes"/"Antonymes" sections; related vocabulary, derived words, etymological relatives, locutions and sayings; and the "Rimes en français" categories for rhymes. |
CRISCO (crisco4.unicaen.fr) |
Synonyms |
Université de Caen's Dictionnaire Électronique des Synonymes, tens of thousands of curated entries. |
JeuxDeMots (jdm-api.demo.lirmm.fr) |
Inspiration |
The LIRMM's crowd-built, weighted lexical network (associated ideas, characteristics, parts), sorted by weight. A demo endpoint: it may change or go offline without notice. |
RimesSolides (rimessolides.com) |
Rhymes |
A French rhyming dictionary with IPA transcriptions. |
Nothing is sent by default. In the Rhymes, Synonyms and Inspiration tabs every online source
is an opt-in checkbox, queried only when ticked (your ticked sources are remembered per tab); the Definitions tab queries CNRTL only when you
search. In the Synonyms and Inspiration tabs, a "💾 Save to my personal dictionary" button
writes results into dictionnaire-perso.json in one click (creating it at the root of your vault
if needed), so they stay available offline.
Adding a source to the Synonyms/Inspiration tabs is a small, self-contained change: a
function that takes a word and returns { synonymes: [...], antonymes: [...], trouve: true|false },
registered in the SOURCES_EN_LIGNE table (src/07-sources-en-ligne.js). Open an issue if
you'd like a specific source added.
Fair use note: these are third-party sites without a public API contract; the plugin fetches
their normal pages (or, for CNRTL, its internal JSON API) and extracts the relevant section. If a
site changes its layout, that source may temporarily return nothing — the other sources and the
local dictionaries are unaffected. CNRTL's portal redesign did break the plugin's HTML scraping
(see 2.24.3); the Definitions tab now uses their JSON API, more resilient but not a public
contract either.
Data sources & licences
The plugin's code is licensed under GPL-3.0 (see LICENSE). The published
dictionary dictionnaire-base.json.gz is a separate work: derived from Lexique383, it is shared under
CC BY-SA 4.0.
The base dictionary published with this repository is built from three
sources. Every word carries a src code recording where it comes from (explained in the
_legende field at the top of the file):
- L — Lexique383 (B. New, C. Pallier et al.): phonetic
transcriptions of ~121,000 word forms. Licence CC BY-SA 4.0 — the dictionary file, as a
derived work, is shared under the same licence.
- M — Morphalou 3.1 (ATILF – CNRS,
Nancy): ~89,000 additional forms (nouns, adjectives, participles, infinitives, adverbs), their
phonetics converted to Lexique's notation. Licence LGPL-LR.
- R — Didier Méral's inventory of rare, forgotten or obsolete French words, freely shared by
its author since 2006 (rare-word list and definitions, tag
méral).
A cor field marks the entries whose source phonetics were corrected: ai = future and
simple-past 1st-person -ai pronounced [e] rather than [ɛ] (aimerai, chantai), which Lexique383
transcribes as [ɛ].
Known limitations
- Syllable counting is a spelling-based heuristic (like most free online tools), not a full
phonetic transcription: very irregular cases (complex liaisons, rare words, Latinate or
Greek-derived words) may need manual judgement. One specific ambiguity — whether a word
ending in "-ent" is a silent 3rd-person-plural verb form (pleurent) or a genuinely
pronounced noun/adjective (récent, argent, président...) — is resolved exactly against
the extended phonetic dictionary when the word is covered by one, and falls back to a curated
list of ~70 common exceptions otherwise (not exhaustive).
- Whether a silent e elides before a word starting with a vowel follows the classic
versification rule, but some other online tools don't apply this consistently — expect
occasional differences with them, especially on free verse. The full syllable breakdown is
shown precisely so you can check the choice yourself, line by line.
- Diaeresis/synaeresis detection relies on a list of "fixed" diphthongs (always 1 syllable);
any vowel hiatus outside that list is flagged as a possible diaeresis, and the alternate
breakdown is shown — the choice of reading is yours.
- The built-in rhyme, vocabulary and synonym dictionaries are hand-curated, not exhaustive; a
rare word may not be recognised. The optional complete phonetic rhyme dictionary (format B
above) largely closes that gap for rhymes specifically.
- Rhyme quality (pauvre / suffisante / riche / très riche / léonine) is exact when
both compared words have a known transcription in an extended phonetic dictionary (format F
above) — real phonemes, no guessing. Otherwise it falls back to a spelling-based heuristic
that handles common mismatches (-tion≈-ssion, doubled letters, i/y semi-consonant,
ê/è/ei/circumflex, intervocalic "s"→[z], au/eau≈o, œu/oeu≈eu, um≈un, im≈in, infinitive
-er/-ez≈é...) but isn't infallible, especially on rare or irregular words — and can
occasionally be more generous than the real phonemes would be (a silent final e has, on
rare occasions, been miscounted as an extra shared son). The très riche/léonine distinction
(both engines) relies on an approximate syllabification (valid onset clusters, e.g. "pl",
"tr"); very unusual consonant clusters may still be split incorrectly.
- The online sources depend on third-party websites staying reachable and structurally
unchanged; treat them as a bonus on top of, not a replacement for, the offline dictionaries.
- Rhyme-pair colour-coding applies to the rendered analysis below the text box, not to the raw
text box itself, which a plain HTML
<textarea> cannot style character-by-character.
Changelog
2.31.1 — CSS lint fixes for the Obsidian plugin review.
- No more
!important (more specific selectors instead) and no more :has(): toggle pills
now get an is-checked class, kept in sync even when the plugin ticks a box itself
(settings loaded, "tick all rich rhymes", quick filters).
gap shorthand instead of row-gap/column-gap, and a dotted border instead of a
two-value text-decoration. Same look.
2.31.0 — Eleven more fixed forms, note loading, rhyme hints.
- Forme menu, now grouped: short forms (haïku, tanka, triolet), sonnets (French,
Shakespearean), refrain forms (rondel, rondeau with its rentrement, villanelle,
ballade), chained forms (pantoum, terza rima, sextine), and Fahsee. Each checks
its stanza structure, metre, rhyme scheme and, where relevant, refrains, chained lines or
rotating end-words.
- Note active button in the Syllables tab: loads into the draft the text selected in the
open note, otherwise its first
```poeme code block, otherwise the whole note — with the
frontmatter and Markdown syntax (headings, quotes, bullets, emphasis, links) stripped. A
forme: property in the frontmatter selects the form automatically.
- Two rhyme hints (⚠, never errors) for every form: rime du même au même (a word rhyming
with itself or its own derivative: tient / retient) and the classical written-consonant
rule (-s/-x/-z only rhyme together: amour / jours, sang / absent). Refrains and
repeated lines are exempt.
- In the compliance summary, each faulty line number is a link: click it to open the Rhymes
tab on that line's last word.
- 165 tests.
2.30.0 — Fixed forms, hemistich and masculine/feminine alternation checks, and fixes.
- Syllables tab: new Forme menu (libre, Sonnet, Fahsee). Picking a form shows a
compliance summary above the analysis, one ✓/✗ line per rule with the faulty line numbers.
Sonnet: 4+4+3+3, isometric alexandrines or decasyllables, regular hemistich, quatrains ABBA
ABBA on the same two rhymes, tercets CCD EED or CCD EDE, masculine/feminine alternation.
Fahsee: 25 lines in five 5-line stanzas, decasyllables cut 5 // 5, ABABA in each stanza
with rhymes of its own (the last stanza's A returns to the first's), a linking word (the last word of a stanza opens the next, possibly in another form:
relit → Relis) and a return word (the poem ends on its first word). Lines without final punctuation are
flagged ⚠ to check rather than as errors, since a real pause doesn't always need one.
- Syllable count: words with an aspirated h (haut, haine, héros, hibou, hors…) no
longer cause elision (le haut is 2 syllables, not 1).
- Rhymes: a final h after a vowel is silent (Shorah / déplaça), and à/ù rhyme like
a/u (là / Shorah).
- Syllables tab: new Hémistiche toggle (on by default). A
// marks the caesura after the
6th syllable of an alexandrine and the 4th of a decasyllable; a red césure badge flags one
that cuts a word or falls on a pronounced mute e. When only the diaeresis reading makes 12
(or 10), the mark goes on that reading.
- Syllables tab: new Alternance M/F toggle (on by default). A red alternance badge marks a
line that doesn't rhyme with the previous one but has the same gender (two masculine or two
feminine rhymes in a row), across stanza breaks too.
- Rhyme gender fix: a word in -ent now counts as feminine when the dictionary knows it only as
a verb (ils aiment), and stays masculine as a noun, adjective or adverb (vent, souvent)
or when ambiguous (couvent). Imperfect/subjunctive -aient/-oient stay masculine, as in
the classical tradition. It used to be masculine in every case.
- Definitions tab: the search field gets its own line, with Chercher and Ouvrir sur CNRTL ↗
below it. On a phone, the three side by side squeezed the field to a few pixels.
- Syllable count fixes: final -es/-ent no longer elide before a vowel inside a line
(vastes oiseaux, gouffres amers — Baudelaire's L'Albatros now scans 12); the tréma always
splits (na-ïf, No-ël, a-ïeux); circumflex vowel pairs (plaît, goût, maître) are no
longer offered a false diaeresis.
- Elided words rhyme and get their gender like the bare word: m'attends / longtemps,
t'aime / même, s'aiment feminine.
- Data safety: if
dictionnaire-perso.json can't be written, Hasard no longer empties the word's
pending tags, and Notes, Inspiration and Synonymes no longer report a false success. Two
overlapping dictionary loads no longer duplicate entries; 20 rare words present both in the
built-in list and in the base are no longer drawn twice as often; Settings no longer says
there is no personal dictionary when the base is missing (offline).
- Inspiration: adding several words reloads the dictionary once instead of once per word, and
deselecting clears the highlight on the result chips.
- Online sources: results are cached per word for the session, so ticking a filter or typing in
Rime avec… no longer re-queries RimesSolides, Wiktionnaire, CRISCO or JeuxDeMots. CNRTL
definitions are sanitized before display (scripts and event attributes removed).
- Tests: dictionary statistics, data-safety cases, prosody cases and the online cache are now
covered, including a full dictionary load with migration. The test harness supports
asynchronous tests. 141 tests.
2.29.1 — Dictionary statistics in Settings.
- New "Dictionary" section: word and rare-word counts for the base, and the path, size and
count of personal additions (rare words, lexical fields, synonyms) in your
dictionnaire-perso.json.
- Two bugs found and fixed while building it, with no effect elsewhere: the base's count was
read after a merge that mutates it in place, and the perso's path/size still reflected the
state from before a migration that had just run.
2.29.0 — Grammatical filter in the Rhymes tab.
- New checkboxes — Nom, Verbe, Adjectif, Adverbe, Autres — narrow rhyme results by
grammatical category, on top of the existing letter/syllable/quality filters. A word can
match several categories at once (e.g. abaissé, verb and adjective) and passes if any
checked box fits.
- The base dictionary now carries this category for every word, from Lexique383 and, where
Lexique has no entry, Morphalou. A word with no known category (a Méral rare word, or a
RimesSolides/Wiktionnaire result absent from the local dictionary) is never hidden by the
filter.
- Old dictionaries migrating straight from 2.27 or earlier are unaffected: the new field is
ignored when deciding what counts as a personal change, so it can't inflate your personal
file.
Full history of every version: see CHANGELOG.md.