Hachidori 0.1.6
Dictionary updates no longer interrupt reading, the engine uses far less memory, and a batch of Settings and popup rough edges reported in #282 are fixed. Anki sentences are cut at real sentence boundaries, nested popups hang from the word that opened them, and clicked kanji can open a whole dictionary group.
Highlights
Zero-downtime dictionary updates
Updating a dictionary used to fail every lookup with Dictionary update in progress for the whole import. Imports now run in an isolated worker and the new revision is swapped into the live engine in place, so the popup keeps answering from the old revision until the new one is ready. Settings shows Updating… on the affected row while it happens. In the benchmark, refused lookups during an update went from up to 26 of 29 to 0, and the engine heap no longer keeps the import's high-water mark (255 → 131 MiB after a Jitendex update). Electron and Firefox keep the previous in-engine path and now say so. (#317)
Low memory mode and a memory readout
The engine keeps every installed dictionary resident, and until now nothing showed where the memory went. Settings → Advanced → Memory reports the engine's heap and each dictionary's share (also shown in a dictionary's Details). A new Low memory mode switch recycles the engine worker after it has been idle for two seconds following an import, releasing the import's peak; with Jitendex the steady heap drops from 265 MB to 130 MB at the cost of ~23% slower imports. Running out of memory while loading a dictionary now says so instead of reporting a damaged file. A new memory guide explains the model. (#281)
Anki sentences stop at sentence boundaries
Mining from texthooker pages or VN overlays put several lines into the card's sentence field. Sentences are now extracted with Yomitan's rules: cut at 。!?… and line breaks, quotes enclosing the match dropped, pairs inside the sentence kept, and adjacent blocks treated as separate sentences. The same sentence feeds the Note prefill and custom %s links. Cost: about 28 µs per hover in the worst case. (#314)
Nested popups anchor to their word
A child popup opened beside its parent's box, sometimes hundreds of pixels from the word. Nested panes now open directly under (or above) the text that opened them, and clicking back into a parent dismisses its children, as in Yomitan. (#313)
Dictionary groups for clicked kanji
Clicked-kanji dictionary accepts a dictionary group. Clicking a kanji shows every enabled member of the group in group order, each in its own tab, so KANJIDIC, an etymology dictionary and 漢字ペディア can be compared without changing the setting. (#316)
Settings
- Reordering dictionaries is immediate: rows move as you click, a burst of moves is saved once, and the engine applies the new order in place instead of reloading every dictionary. (#305)
- Each managed dictionary's Details has its own Check for update button that checks only that package. Check now still never installs anything. (#304)
- Switching to Updates, Sharing, Backup & restore or Advanced no longer shifts the page sideways when the scrollbar disappears. (#302, #309)
- Three-digit dictionary ranks (100+) no longer run into the dictionary title. (#303)
- The saved theme is applied before the first paint, so Settings no longer flashes the browser's colour preference on reload. (#315)
- When several dictionaries fail to load, the sidebar lists each one with its own error instead of one run-on paragraph. (#311)
- Sankoku 8 English is no longer a recommended dictionary; existing installs are untouched. (#307)
Reading
- Selecting non-Japanese text (English words, URLs) no longer opens a No definition found popup: selections respect Only scan Japanese text like hovering does. A new Show a popup when a selection has no definition switch (Settings → Reading → Personal dictionary) turns the notice off for Japanese misses too. (#308)
- Hovering padded or covered page text (YouTube's sidebar tiles, for example) no longer looks up a label tens of pixels away: the pointer must be on the glyph, and the hit-tested element must contain the text. (#301)
- Deeply nested structured content (の in 大辞泉, 何事 in 三省堂 全訳読解古語辞典) renders everywhere, including the compact definition summary, which previously dropped the deeper senses. (#312)
Anki
- Anki error messages name the deck, note type and field involved, and list the note type's available fields. (#280)
Under the hood
- New benchmarks:
benchmark/dictionary-update.mjs(lookup availability during updates) andbenchmark/low-memory-mode.mjs;benchmark/hover-popup.mjsgains a long-paragraph sentence case. (#281, #314, #317) - README spelling and contributor-guide anchors fixed. (#300, #306)
- Test tooling: jsdom 30.1.1 (with a workaround for its
focus()regression), puppeteer-core 25.11.0. (#276, #310)
Full Changelog: 0.1.5...0.1.6