Repository navigation
Releases: bee-san/hachidori
Release list
Hachidori 0.3.2
🐦 Hachidori 0.3.2
Blurred definitions can now wait for a click, so a stray hover no longer gives the answer away. Frequency dictionaries now work as they do in Yomitan, with one average, and names follow the order of the dictionaries you rank first. Kanji entries can be mined to Anki. Large libraries can be exported as a backup, a folder of dictionaries imports in one go, and a backup made with 0.3.1 restores in this version.
🙈 Reveal blurred definitions with a click
Settings → Reading → Definition blur → Reveal has a third choice, On click only, beside After a delay and On hover only. Hovering and time never reveal; click a definition or the compact summary when you are ready. With the keyboard, Tab to a blurred definition (a screen reader announces it as "Reveal definitions") and press Enter or Space. Until you reveal them, nothing inside the blurred definitions can be opened or looked up, so the click only reveals. Automatic pronunciation still waits and plays once at the reveal. (#599, fixes #598)
📊 Frequencies, the way Yomitan reads them
- One average. A frequency dictionary that does not say whether it lists ranks or counts, such as CC100 or BCCWJ, is read as a rank list, as Yomitan does. With Design → Frequency labels → Show frequency averages on, it now averages with Jiten's ranks: a word ranked 15,700 by Jiten and 26,700 by CC100 shows one Avg rank of about 19.8k instead of two separate averages. The average uses Yomitan's rule (each dictionary's first value, harmonic mean), so Anki's
{frequency-harmonic-rank}gives the same number. (#588, #591) - Each dictionary beside the average. Design → Frequency labels → Show each dictionary's frequencies with the averages keeps each dictionary's value after the average. It is off by default, so with averages on you see only the average, as in Yomitan. (#591)
- Sort direction for lists that don't say. Choosing such a dictionary under Reading → Frequency sorting sets its direction from sample words, as Yomitan does; an inconclusive sample reads it as ranks, lowest first. Definition blur's automatic direction reads it as ranks too. The original Innocent Corpus counts occurrences without saying so: choose Descending as its Blur threshold direction. (#586, #588)
- Names follow your dictionary order. When a frequency doesn't separate two readings of a name, the reading from the dictionary you ranked higher comes first, as in Yomitan: 神原 reads かんばら from JP Wikipedia Proper Nouns before Pixiv's かみはら. With no sort dictionary, or with the sort order on Automatic, results follow your dictionary order, and Settings now says so: None — dictionary order and Automatic — dictionary order. (#576, #589)
- JPDB's kana rank stays its own. JPDB v2.2 Kana Display Only shows 読む as
312, 19896㋕. Hachidori no longer labels the word's rank 312 as the kana form's rank. (#590)
🀄 Kanji
- Mine kanji entries. When a clicked kanji opens a kanji dictionary's entry (readings, meanings, stroke count), that view now has the Anki button and your custom Anki buttons in the Default, JL, Bee and Nazeka themes. Templates gain
{character},{onyomi},{kunyomi}and{stroke-count}. (#592) - Your clicked-kanji dictionary stays chosen. Disabling and re-enabling it, for example Bee's Ultimate Kanji Dictionary, no longer leaves kanji clicks failing with "Kanji lookup failed". (#593)
🃏 Anki
- Sentence furigana.
{sentence-furigana-plain}now gives今日[きょう]は<b>食[た]べます</b>と 言[い]った。and{sentence-furigana}the same in ruby, so the Kiku preset's SentenceFurigana field gets readings. (#595) - Smaller Anki cards is a regular option under Anki → Card formatting, off by default. If you turned it on as an experiment, it stays on. (#587)
- Pressing Enter on the popup's Anki button, to add a note or to view existing notes, keeps the popup open, and the button gets the keyboard focus back when it finishes. (#564)
- Plain-text Anki definitions from very deeply nested dictionary entries no longer fail to export. (#585)
📚 Dictionaries
- A folder of dictionaries imports in one go. A batch no longer loses archives to "the dictionary engine is busy mutating". Each archive waits for the previous one ("Waiting for the previous import to finish…"), a failed attempt is retried, and Cancel import stops the rest. (#581, fixes #578)
- See which dictionaries need an update. Dictionaries → Updates lists available updates and failed checks by name, with Update, Retry update or Check again for each. Update all includes disabled dictionaries. (#565)
- A stalled update check no longer holds up the rest. A dictionary whose update server stops answering fails after two minutes without data, and the others are checked. (#584)
- Bee's Theme keeps All. With a Grammar group first, Bee's Theme showed only that group. All now always shows every definition, and Grammar filters only when you choose it. (#566)
💾 Backups
- Large libraries export. Export backup no longer fails in Chrome with "Check internet connection" on a large library. With Chrome's usual storage (OPFS), the archive is written to a file as it is made instead of being assembled in memory. (#580, fixes #577 and #579)
- Settings restore one at a time. A setting this version can't read is skipped on its own and the rest of the backup's settings are kept; before, one such setting meant all of the backup's reader settings were skipped. A backup from a newer Hachidori restores too, without what it added. (#580)
- Checked from 0.3.1. A new browser test exports a backup with the released 0.3.1 and restores it into this version, then exports and restores again with this version. Dictionaries, settings, Anki settings, the personal dictionary, lookup counts and known words all come back. (#600)
✨ No longer experimental
Design → Theme Store and Reading → Word highlighting are always available. Word highlighting stays off until you turn it on, and your theme choice is kept. (#587)
🎬 Netflix mining (experimental)
Drag a subtitle line to move it; it stays where you put it until you reload. Opening a lookup pauses the video, even without hovering the subtitle first. (#583)
🐞 Better bug reports
Errors are kept from the moment each part of Hachidori starts, including the errors Settings showed you and which buttons you pressed before them (never what you typed or looked up), and they survive a browser restart. Settings → Advanced → Troubleshooting → Get debug info includes them, and Copy error details beside an error copies a report you can paste into an issue. (#582)
🛠️ Under the hood
- The dictionary engine (hoshidicts) is updated for the dictionary-order tie-break. (#576)
- Test tooling: jsdom 30.1.2, puppeteer-core 25.13.0, @puppeteer/browsers 3.2.4 and undici 8.12.3. They are used only in development and are not part of the extension. (#568, #569, #570, #594)
- CI: actions/setup-node 7.1.0, actions/upload-artifact 7.0.2 and actions/download-artifact 8.0.2; Dependabot runs monthly and the weekly note-type check is gone. (#571, #572, #573, #567)
- The issue template asks four questions. (#574)
- The release guide and the 0.3.1 speed claim are corrected. (#563)
- The theme guide describes what the click reveal does to a theme's popup, and the new backup test no longer fails now and then while waiting for a clicked kanji. (#601, #602)
📦 Downloads
*-chrome.zip: extract it, openchrome://extensions, enable Developer mode, choose Load unpacked, and select the extracted folder. To update an existing unpacked installation, replace its files and click Reload.*-source.zip: the matching complete source, including the engine and the sources of bundled dependencies.*-SHA256SUMS.txt: checksums for both packages.
Chrome 128 or newer is supported. Your dictionaries and saved settings are kept, and you don't need to reimport anything.
Full changelog: 0.3.1...0.3.2
Hachidori 0.3.1
🐦 Hachidori 0.3.1
Hachidori now understands older and literary Japanese conjugations, so historical spellings in visual novels and manga reach the same entries as modern forms. You can also add a card to Anki without waiting for its duplicate check, and backups made by an older Hachidori now restore their dictionaries.
📜 Older Japanese, looked up properly
The dictionary engine now follows Yomitan's Japanese conjugation rules. Lookups use the full scanned form and show the conjugation trace, just as for modern Japanese. (#561, #560)
- Historical kana spellings. 思ふ, 思ひたい and 思はない reach 思う; 食べませう and 食べてゐる reach 食べる; してゐる reaches する. They work with old kanji forms too: 讀みませう reaches 読む.
- Emphatic negatives. Forms such as 食べやしない and 食べやしませんでした reach 食べる.
- Single-character verb stems. 来 on its own is looked up as 来る.
- Honorifics only match whole words. ございます reaches ござる, but a longer word that merely ends the same way no longer matches the honorific by mistake.
- Nearly as fast as before. In the engine benchmark on Jitendex, hover lookups and page highlighting are within about 4% of 0.3.0. (#561)
This is conjugation support, not a converter for every old spelling. Forms such as 思へる, or 買つてゐる with a large つ, still don't resolve.
🃏 Add to Anki while the duplicate check is still running
The spinning Anki button can now be clicked. Clicking it adds a new note straight away, without waiting for the duplicate check to finish, and it never overwrites an existing note. Your When found setting (Prevent, Add anyway or Overwrite) is still used for every other add. The Add note shortcut still waits for the check, so a quick key press can't add a duplicate by accident. A screen reader announces the spinner as "Checking Anki card status — click to add anyway". (#559)
💾 Backups that restore across versions
- Your dictionaries come back even when the settings can't. If a backup's reader or update settings come from another Hachidori version, or can't be read, the restore keeps your current settings and still brings back every dictionary and personal entry. Both the preview and the result tell you which settings were skipped. (#558)
- Older backups keep their settings. Experimental feature switches saved by an older or newer Hachidori restore by name: switches this version knows keep their saved values, new ones start off, and retired ones are dropped. Your theme, Anki Templates and other settings are no longer discarded because of them. (#558)
- Automatic backups stay listed and keep protecting their dictionary files, even when only their settings are incompatible. (#558)
🛠️ Under the hood
- The test tooling's
source-map-jsis updated to 1.2.2. It is used only in development and is not part of the extension. (#539)
📦 Downloads
*-chrome.zip: extract it, openchrome://extensions, enable Developer mode, choose Load unpacked, and select the extracted folder. To update an existing unpacked installation, replace its files and click Reload.*-source.zip: the matching complete source, including the engine and the sources of bundled dependencies.*-SHA256SUMS.txt: checksums for both packages.
Chrome 128 or newer is supported. Your dictionaries and saved settings are kept, and you don't need to reimport anything.
Full changelog: 0.3.0...0.3.1
Hachidori 0.3.0
🐦 Hachidori 0.3.0
A cleaner Settings page, word highlighting that follows your Anki progress, and new tools for mining Netflix subtitles. This release also improves dictionary imports, pronunciation controls and troubleshooting. Every Advanced feature switch starts off, including “Use less ram by default”; your explicitly saved choices are preserved.
✨ Settings, easier to find and use
Settings has a new layout built around clear rows, grouped controls and switches. Dictionaries and Reading keep their related tasks together, while each option keeps its explanation close by. (#543)
- Start with the features you choose. All experimental features default off. Enable the ones you want under Advanced → Experimental features. (#556)
- Choose your memory tradeoff. Advanced → Memory lets you keep dictionary hash indexes in memory for lookup speed or read them from disk to save RAM. Use less ram by default is now off unless you have explicitly saved another choice. When enabled, Automatic hash storage shares a 65 MiB resident budget across the library; Low memory mode keeps its separate 32 MiB budget. (#497, #530, #556)
- Clear imported dictionaries or reset your counts. Settings now offers Remove all imported dictionaries and Reset lookup counts, with confirmation before clearing them. Your personal dictionary stays unless you also choose to erase its source; Anki notes and retained backups stay intact. (#514)
📖 See the words you know
The experimental Word highlighting feature marks Japanese words by their Anki status: unknown, learning or known. Enable it in Advanced → Experimental features, then turn on Reading → Word highlighting → Highlight words by Anki status. Choose which statuses to show and whether to use underlines, text colour or backgrounds. (#525, #526, #528)
Hachidori uses your installed dictionaries to split the text and its cached Anki index to check the words. Opening a page does not contact Anki. In the popup, Mark as known and Ignore let you set a word's status yourself; keyboard shortcuts are available too. (#529)
🎬 Experimental Netflix mining
Turn on Netflix mining under Advanced → Experimental features to pause playback while hovering a subtitle and use the whole subtitle line as your mined sentence. Anki field templates can also include:
{sentence-audio}— audio for the subtitle line, taken from a rolling 30-second buffer of what you have heard.{gif}— a looping GIF of the line.
When a line has not been heard in full, Hachidori can play on or replay it once to finish the clip. Hover pause also works on pages that were already open when you enabled the feature. Reload Netflix after enabling it so the playing episode's subtitle timing is available for media mining. (#518, #521, #527, #545, #550)
The separate Netflix preview screenshots switch can use a timeline preview for {screenshot} when ordinary capture is black. These previews have lower resolution and show a nearby moment rather than the exact frame. (#532)
These integrations are experimental: Netflix may change its subtitle and preview interfaces, and protected playback can produce silent audio or black captures. Missing media is reported as a warning on a note saved with its other fields.
📚 More dictionaries, smoother lookups
- More archives import correctly. Added support for kanji frequency lists and the NHK pitch archive, dictionary titles containing slashes, escaped bank filenames and Zip64 archives. (#517, #524)
- Every frequency dictionary gets its label. Frequency tags now identify their source dictionary in the popup. (#509)
- Tune hover timing. No-key lookups now have configurable page-hover and definition-hover scan delays. (#515)
- Pronunciation choices stay beside the audio button. The chooser opens next to the button you used and stays within the popup. (#513)
- Quieter audio failures. A failed pronunciation no longer interrupts reading; Audio → Test explains the error when you need it. (#511)
- Screenshots survive page navigation. Anki screenshot mining works after sites change their URL without a full reload. (#508, #523)
🛠️ Better bug reports
Advanced → Troubleshooting → Get debug info downloads a report with the extension's recent logs, engine state, installation and service details, settings, and stored-file information. The AnkiConnect API key is removed. Personal dictionary entries, lookup history and Anki notes are left out. (#519, #522)
📦 Downloads
*-chrome.zip: extract it, openchrome://extensions, enable Developer mode, choose Load unpacked, and select the extracted folder. For an existing unpacked installation, replace its files and click Reload.*-source.zip: the matching complete source, including the engine and bundled dependency sources.*-SHA256SUMS.txt: checksums for both packages.
Chrome 128 or newer is supported. Existing dictionaries and saved settings are retained; the default changes apply when you have not saved a choice.
Full changelog: 0.2.3...0.3.0
Hachidori 0.2.3
🐦 Hachidori 0.2.3
Large libraries take far less memory, more dictionaries import, and the popup behaves the way Yomitan users expect. This release cuts the engine's resident memory by up to 90%, imports ZIPs from streaming writers such as 小学館 日本大百科全書(ニッポニカ), makes MDX dictionaries and long entries standard features, and fixes several popup problems reported on Discord: the header now follows the entry you are reading, you can move between entries with Alt+wheel, and the lookup count no longer shifts the frequency tags.
🧠 Much less memory for big libraries
With Jitendex and Pixiv Full installed (measured on Chrome 152, macOS arm64):
- Dictionary entries are paged from disk on OPFS. The engine heap after a restart drops from 698 MB to 68 MB. Lookups return identical results, import speed is unchanged, and a lookup's median round trip rises by only 0.4 ms. Settings → Advanced → Memory → Dictionary entries lets you choose Automatic, Read from disk or Keep in memory. Automatic is the default and needs no reimport. (#475)
- Disabled dictionaries no longer occupy memory. Hachidori still checks them at startup, but reads their entries on demand, so disabling Pixiv Full drops the heap after a restart from 604 MB to 121 MB. (#478)
- IndexedDB hosts no longer duplicate every dictionary file. On GameSentenceMiner/Electron, and on Chrome without OPFS, large files stay as Blobs instead of being copied into JavaScript: 591 MB → 3 MB outside the engine. (#480)
- The single-thread engine runs in its own worker. Without shared memory, lookups and imports no longer block the document that plays audio and talks to Anki. (#481)
📚 Importing dictionaries
- Imports ZIPs that store entry sizes after the data. Archives from streaming ZIP writers, such as the Nipponica encyclopaedia shared on Discord, failed with archive entry sizes disagree between headers. They now import, and archives that are actually forged are still refused. (#494)
- Large imports recover and explain failures. An out-of-memory failure while staging a dictionary no longer appears as a bare WASM exception. The error names the file, the stage that failed, and what to try (memory, storage quota or access). One failed file no longer stops the rest of the batch. (#476)
- MDX dictionaries and long dictionary entries are standard features. Add dictionaries always accepts
.mdxwith its.mddfiles. Proverbs, titles and other entries longer than the scan length are always found, and dictionaries without long keys behave as before. Both leave Experimental features. (#483) - Import from a linked browser. A browser linked through Settings → Sharing can install a dictionary ZIP on the host. SubMiner and GSM character dictionaries no longer need a manual import on the host every time. (#479)
📖 A popup that follows your reading
- The header follows the entry you're reading. As you scroll or move with Alt+↓, the pinned headword and reading switch to that entry, for example from 明日/あした to 明日/あす. The Anki, audio and Note buttons in the header act on that entry too. (#493)
- Alt+wheel moves between entries. Holding Alt and scrolling over the popup steps one entry at a time, as in Yomitan. Both bindings can be changed in Keybinds. (#489)
- The lookup count no longer moves the frequency tags. "Looked up N times" has its own place, so the frequency tags and definitions stay still when the count arrives. (#492)
- A clearer header setting. Toolbar position is now Headword and toolbar position, and its hint says that Automatic puts the headword at the bottom when the popup opens above the word. Choose Top to keep it at the top. (#487)
- Definitions in dictionary order by score. In Jitendex, 青タン now lists "bruise" before the hanafuda meaning, as Yomitan does. (#473)
🎨 Bee's theme
- Even spacing for Anki, audio, Note and custom buttons; long dictionary names are truncated with the full name in a tooltip; Back sits at the upper left with a visible focus ring. (#466, #471)
- Frequency metadata wraps on its own line, All comes before saved dictionary groups, and More actions closes on Escape and returns focus to the button that opened it. (#471)
🃏 Anki
{frequencies}writes a Yomitan-style list (one<li>per value, with dictionary aliases), so note types that expect that format show it correctly. (#470){popup-selection-text}keeps line breaks when you select several definitions. (#465)- NHK pitch tables are no longer clipped on the left. (#470)
🛠️ Under the hood
- Removed the obsolete owner-only accessibility review gate; accessibility labels, contrast checks and screenshots remain part of every popup change. (#467, #468)
Full changelog: 0.2.2...0.2.3
Packages
*-chrome.zip: the Chrome package, also submitted to the Chrome Web Store.*-source.zipand*-SHA256SUMS.txt: the matching complete source and the
checksums of every package above.
Hachidori 0.2.2
🐦 Hachidori 0.2.2
More useful pitch accent, better furigana, and fewer interruptions while reading. This release adds pitch colours and an overline style, lets you look up Japanese inside text boxes, speeds up Anki button readiness, and fixes backup and restore failures.
🎵 Pitch accent at a glance
The Default theme gains two options under Design → Pitch accent:
- Furigana pitch style → Overline draws a line above high morae and a hook where the pitch drops, matching the pitch list. Contour remains the default.
- Show pitch accent colours colours headwords and pitch lines by accent group: blue for 平板 (heiban), red for 頭高 (atamadaka), orange for 中高 (nakadaka), green for 尾高 (odaka), and purple for 起伏 (kifuku). It is off by default.
Both update open popups and the Design preview immediately. Pitch colours follow the selected pitch dictionary, and Windows contrast themes keep using system text colours. (#461, #463)
Furigana also gets smarter. Mixed kana/kanji words no longer duplicate readings, as ゴミ箱 could previously do. When a split is ambiguous, bundled KANJIDIC readings can resolve it: 好き嫌い → 好(す)き嫌(きら)い, and 長い間 → 長(なが)い間(あいだ). The same split reaches the popup, Anki's {furigana} / {furigana-plain}, and the scanning API. (#460, #462)
📖 Smoother reading
- Look up Japanese inside text boxes. Hover over words in text and search inputs or textareas, including Jisho's search field. Scrolled fields work too, and you can keep typing normally. (#441)
- Keep your place when switching apps. Switching tabs, windows, or applications now keeps the popup and your Note draft open. (#444)
- Fit more definitions on screen. The Default theme's new Design → Definitions → Compact glossaries option puts compatible glossary items on one line, separated by
|. (#445) - See the settings your theme supports. Design and Settings search now show the selected theme's controls. JL and Bee's Theme also update their pitch markers immediately when you change the pitch switch or dictionary. (#439)
- Mine cleaner sentences from selections. Selecting a word now finds its surrounding sentence the same way hovering does, keeping ruby readings, hidden text, and page scripts out of the sentence and custom links. (#447)
⚡ Faster Anki checks and better integrations
- Anki buttons become ready with fewer requests. Results sharing an Anki Template are checked in batches, and compatible note types' field discovery is batched too. Popups with many results spend less time waiting on AnkiConnect. (#451, #452)
- Save the source URL. Add
{url}to an Anki field template for a clickable link to the page you mined from, or{url-plain}for its address. Both work when mining through a linked browser. (#443) - Let other tools read your Anki Templates. Hachidori Relay 0.0.5 adds Yomitan-compatible
/ankiCardFormats, allowing tools such as GSM Companion, Yomine, and asbplayer-mining to discover your saved formats. Settings → Sharing downloads the updated relay. (#448)
📚 More faithful dictionaries
- Definition tags now use the dictionary's categories, colours, descriptions, and ordering. Multiword Jitendex tags stay intact, and Anki exports use the same tags. Reimport an existing dictionary to pick up its tag-bank metadata. (#446, #449)
- Frequency dictionaries storing ranks as text, such as monogatari's
324/37459, now display their values. Existing installations work without reimporting. (#442) - Frequency values stay in dictionary order, making the displayed values easier to compare with the average rank. (#431)
- Dictionary images specifying only width or height now keep their natural proportions, fixing stretched accent glyphs. (#434)
- MDict imports handle key rules, redirect chains, legacy stylesheet encodings, and
<font size>more faithfully. Import progress also explains any skipped records, unresolved aliases, or missing/unreadable resources beneath the Imported line. (#453, #449, #450)
🛠️ Fixes and polish
- Fixed
outputSizeerrors when exporting backups or restoring them. (#420) - Background request failures now return an error response instead of leaving the caller without a reply. (#428)
- Added a one-minute walkthrough to the README, showing real lookups, mining, the personal dictionary, definition blur, and themes. (#455)
Full changelog: 0.2.1...0.2.2
Hachidori 0.2.1
Hachidori 0.2.1
This release adds two new Theme Store themes, JL and Bee's Theme, and a tidier Settings page with one clear label per setting. Popups now stay put on live chat feeds and in GameSentenceMiner's OCR overlay. The default popup gets definitions on screen sooner. It also fixes mining from clicked-kanji dictionary groups, Anki refusing definitions that contain cloze text, and flickering image previews, and it shows the extension's full memory use in Settings.
Highlights
Two new themes in the Theme Store
JL follows rampaa/JL's popup, with JL's colours, font sizes, spacing and Meiryo. Bee's Theme keeps JL's compact layout and adds formatted definitions (lists, tables, furigana, links and images), dictionary-group tabs, one audio/Anki/edit icon group per entry, enlarged image previews and a Girlypop blush-and-violet palette. The Store now has Previous themes and Next themes buttons, so you can see every theme even on a wide window or with overlay scrollbars. Nazeka and Plain lay out structured glossaries the way JL does: tags are spaced and readings are bracketed, and there are no runs of blank lines. The Theme Store is still an experimental feature under Settings → Advanced → Experimental features. (#395, #405, #412, #413, #414, #416, #393, #392, #394)
Settings that say what they do
Settings now has one label per setting, and each control sits where you'd look for it:
- The two popup timers are together under Reading → Popup closing, as Grace period to reach the popup and Delay after leaving the popup. They were called Hide delay and Hide popup on cursor exit in different groups.
- The frequency-blur dictionary defaults to Same as sorting.
- Each dictionary picker names its role.
- Show the audio button is now in Audio.
- The personal dictionary switches are in Library → Personal dictionary.
- The unused hover-delay option is gone.
Existing settings and backups carry over unchanged. (#410)
The popup stays where it opened
On pages whose text keeps moving, such as a live-stream comment feed, the popup used to chase the word as it scrolled and closed when the word scrolled away or was removed. Like Yomitan, it now stays where it opened until you close it with Escape, the close button, an outside click, cursor exit or a new lookup. Mining, audio and Back still work after the source text has gone. (#411)
A more compact default popup
The default theme wastes much less space above your definitions. The compact summary now sits beside the headword instead of under it, and icon-only toolbars no longer reserve 270 px. Controls, tabs, labels and padding are tighter. Definition text stays at 16 px. For 食べる in the default 560 × 420 popup, the first definition moves up from 240 px to 154 px below the top and 8 lines fit instead of 5. The kanji view also loses its stray scrollbar. (#418)
Reading
- In GameSentenceMiner's OCR overlay, moving the mouse off the OCR text or switching focus to the game no longer closes the popup. Browser tabs behave as before. (#407)
- The new Design → Definitions → Image hover preview setting offers Off, Large images only (default) and All images. Small inline glyphs, such as
em-sized SVG brackets and labels, no longer flash a full-screen preview as you scroll past them. (#408) - Settings → Advanced → Memory shows the extension's total memory next to the engine heap, including how much sits outside the heap. If Hachidori seems to grow over a long session, this is the number to watch.
docs/memory.mdexplains what it covers. (#417)
Anki
- Clicking a kanji whose Clicked-kanji dictionary is a group containing a kanji-only dictionary (KANJIDIC, 漢字辞典オンライン, …) now lets you mine it. The mining button used to fail with
Cannot read properties of undefined (reading 'split'). Thanks to @jangirdnick for tracking down the cause in #409. (#415) - Definitions that contain literal cloze text, such as
{{c1::より}}in some grammar dictionaries, can now be added to Basic and other non-Cloze note types. The braces display as normal. (#406) - With Smaller Anki cards on, rich definition fields no longer end with a Rules / Deinflection footer. (#404)
Full Changelog: 0.2.0...0.2.1
Hachidori 0.2.0
Hachidori 0.2.0
Hachidori has a new experimental Theme Store, more faithful dictionary rendering, and more ways to control when a popup opens and stays open. Monochrome dictionary images now follow the text colour, including in Windows contrast themes. This release also makes Anki glossaries easier to read and fixes lookups in asbplayer's video frame and fullscreen player.
Highlights
Choose how your popup looks
Settings → Advanced → Experimental features → Theme Store unlocks three bundled renderers in Design. Default keeps the familiar rich popup and its colour palettes. Nazeka offers a compact, familiar layout; Plain shows just definition text. The Store previews each renderer and switches it immediately. The feature is off by default while it is still evolving; switching it off keeps your selected theme for when you turn it back on. Nazeka currently omits Note/custom buttons, dictionary tabs, pitch graphs and media. (#380)
Dictionary entries look more like Yomitan
Definitions now use Yomitan-style glossary markup and CSS, including list markers, links, tables, image captions, line breaks and language tags. Structured content's inline styles also follow Yomitan more closely. Monochrome dictionary images, such as stroke-order strips and gaiji, paint in the popup's text colour in both the card and enlarged preview. Windows forced-colors mode uses the system text colour so the image remains visible. (#366, #381, #329, #389)
More control over scanning and nested popups
You can choose No key for hover scanning or hold the middle, Back or Forward mouse button to scan. A child popup can wait for the activation key or a click, and Hide popup on cursor exit has its own delay. Popups beside a word use less space and sticky child popups stay open while you move between them. These controls also work with the GameSentenceMiner overlay. (#374, #378, #375, #382, #371)
Smaller Anki cards, if you want them
The new Smaller Anki cards experimental switch writes compact glossary HTML instead of repeating popup CSS in each rich definition field. Text, useful dictionary markup and image sizing stay; the existing Anki output is unchanged when the switch is off. In the PR's five-entry Jitendex example, the rich fields fell from 70,508 to 18,963 bytes with the switch on. (#377)
Reading
- Hover lookups now work in asbplayer's in-page video frame and compatible fullscreen players. (#338)
- An experimental Google Docs switch enables lookups in Docs' canvas-rendered text. It is off by default and depends on Google's annotation layer. (#328)
- Pitch accent badges can show their dictionary names, and pitch furigana draws connected levels on one row. (#370, #372)
- Frequency tags show the dictionary's full value by default; Abbreviate large numbers in Design restores
k/m/blabels. When averages are shown, per-dictionary tags remain hidden in the DOM for Custom CSS. (#373, #383) - Switching Library tabs no longer moves the tab strip. (#368)
Anki and audio
- Anki glossaries keep line breaks and separate list items; exported images preserve
emsizing. (#367, #327) - Detect local audio now works with the AnkiWeb Local Audio Server add-on. If detection failed during first-run setup, click Detect local audio once after updating. (#369)
- AnkiConnect's unknown-reason cloze refusal now names the cloze rule, and deferred audio is retained when an Anki add-on rewrites another field. (#376, #326)
Compatibility changes
- Hachidori now ships a Chrome MV3 extension and source archive only. Firefox support and its XPI release have been removed. (#339)
- The experimental media-mining recorder and its controls have been removed. Ordinary text and dictionary mining, downloadable pronunciation and the separate
{screenshot}Anki field remain. (#341)
Full Changelog: 0.1.6...0.2.0
Hachidori 0.1.6
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
0.1.5
Hachidori 0.1.5
This release is all about speed, Anki mining, and polish. Dictionary imports and lookups are dramatically faster, Anki integration gained custom buttons and
multiple templates, MDict dictionaries can now be imported, and a new Experimental features section gives early access to work in progress.
Highlights
MDict (.mdx/.mdd) dictionary import
Hachidori can now import MDict dictionaries alongside Yomitan ZIPs. Drop or pick .mdx files (with their companion .mdd media archives) and the engine
converts the HTML entries to structured content on import. Enable it under Settings → Advanced → Experimental features → MDX dictionaries. (#278)
Custom buttons and multiple Anki templates
Define your own popup buttons and keep several Anki note templates side by side, so mining into different decks or note types no longer means constantly
reconfiguring settings. Anki field mapping also gained editable marker comboboxes, and the Anki settings page was laid out after Kellen's mockup. (#239, #244,
#250, #270)
Much faster imports and lookups
The dictionary engine got a deep performance pass:
- Runtimes are built with wasm SIMD and LTO, and a 64-byte SIMD classifier skips irrelevant glossary and metadata objects during parsing. (#241, #246, #247)
- Dictionary banks are parsed without redundant UTF-8 validation, and zstd training in the importer is cheaper. (#242, #243)
- Import archives are handed to the engine as raw bytes, and the import's tail phases run on the worker pool. (#251, #253)
- Electron gets a threaded engine, geometric file growth during imports, and Blob-backed storage for large files. (#234, #249, #257)
- The first lookup after startup is warm instead of cold, and base64 uses the native
Uint8Arraycodec. (#234, #259) - Reordering, enabling, or disabling dictionaries applies in place instead of rebuilding. (#235)
Experimental features
Settings has a new Advanced destination with an Experimental features group. Three flags live there today, all off by default:
- Media mining – screen and audio capture for cards. (#274)
- Long dictionary entries – finds dictionary keys longer than the scan length. (#268)
- MDX dictionaries – MDict import, described above. (#278)
Yomitan-compatible API via Hachidori Relay
Hachidori now answers the Relay's Yomitan-compatible HTTP API: term and kanji lookups, Anki field rendering, tokenization, and dictionary downloads. Tools
built against yomitan-api can talk to Hachidori through Relay 0.0.4. (#273)
Automatic daily backups
Hachidori keeps two retained automatic daily backups, so a bad import or a mistaken deletion is no longer a disaster. (#231)
Redesigned Autumn theme and automatic theme by default
Fresh installs follow your system's light/dark preference automatically, and the Autumn theme has been redesigned from the ground up. (#229, #230)
Dictionary rendering
- Every pitch accent badge is drawn as a mora contour graph, not just the primary one, so multiple pitch dictionaries read consistently. (#271)
- Deeply nested structured glossary content renders correctly. (#261)
- First-entry frequency tags match the styling of later entries. (#269)
- Yomitan data attributes, gaiji
emsizing, and media spellings are handled correctly. (#272)
Anki improvements
- Anki readiness checks are batched through AnkiConnect
multi, cutting round trips. (#263, #264) - Anki media is confirmed before notes are written, preventing cards with missing audio or images. (#223)
- Pitch graph markers render as SVGs in Anki. (#262)
- "View Card" readiness uses the Anki index and shows a loading indicator while it resolves. (#226, #227)
- The Anki duplicate index is rebuilt in Electron overlays. (#266)
- Fixed false AnkiConnect timeouts under concurrent load and made the client tolerant of slow Anki replies. (#218, #228)
- Fixed TTS attachment for Anki mining on Electron; overlay-mode browser speech is now playback-only, with capture handled by the host. (#233, #267)
Fixes and polish
- Selected-text lookups respect the configured activation key. (#220)
- Updated dictionaries are replaced atomically, so a failed update can't leave a half-written dictionary behind. (#222)
- Single-glossary markers remain stable across dictionary updates. (#224)
- Structured-content limit errors name the offending dictionary. (#221)
- Fixed popup position clamping, backup retention, and the
{audio}marker check. (#265) - Fixed a Chrome startup race with the minimum heading. (#219)
- Custom links work inside Electron overlays. (#232)
- Popup toolbar actions stay on a single row, the drag handle is visible again, and entry action buttons shrink gracefully. (#225, #254)
- The settings page was unified onto a single metric scale. (#252)
Under the hood
- The engine is synced with upstream hoshidicts and tracks the fork's main branch. New imports use the
_5/_6on-disk layout with double-precision scores;
existing dictionaries continue to load. (#236, #240, #268) - Fixed the Firefox Advanced test for sectionless experimental flags. (#277)
Full Changelog: 0.1.3...0.1.5
0.1.4
What's Changed
- fix: tolerate slow Anki replies and enable ready mining actions by @bee-san in #218
- Fix Chrome minimum startup heading race by @bee-san in #219
- Gate selected-text lookups by the configured activation key by @bee-san in #220
- Identify dictionaries in structured-content limit errors by @bee-san in #221
- fix: replace updated dictionaries atomically by @bee-san in #222
- Confirm Anki media before note writes by @bee-san in #223
- Stabilize single-glossary markers across dictionary updates by @bee-san in #224
- Keep popup toolbar actions on one row by @bee-san in #225
- Use the Anki index for View Card readiness by @bee-san in #226
- Show Arrow Clockwise while Anki readiness loads by @bee-san in #227
- Fix false AnkiConnect timeouts under concurrent load by @bee-san in #228
- Default fresh installs to automatic theme by @bee-san in #229
- Redesign the Autumn theme by @bee-san in #230
- Add two retained automatic daily backups by @bee-san in #231
- Enable custom links in Electron overlays by @bee-san in #232
- Fix Electron TTS attachment for Anki mining by @bee-san in #233
- perf: faster imports, warm first lookup, threaded engine on Electron by @bee-san in #234
- perf: apply dictionary reorder/enable/disable in place by @bee-san in #235
- chore: sync the engine with upstream hoshidicts main by @bee-san in #236
- perf: pick up the faster lookup and import engine by @bee-san in #238
- Add Custom buttons and multiple Anki Templates by @bee-san in #239
- chore: track the engine fork's main branch by @bee-san in #240
- perf: build the runtimes with wasm SIMD and LTO by @bee-san in #241
- perf: parse dictionary banks without re-validating UTF-8 by @bee-san in #242
- perf: cheaper zstd training and default FSE tables in the importer by @bee-san in #243
- perf: load dictionaries through sync access handles on the WasmFS runtime by @bee-san in #245
- perf: skip term glossaries with a 64-byte SIMD classifier by @bee-san in #246
- Add editable marker comboboxes to Anki fields by @bee-san in #244
- perf: skip meta data objects with the SIMD classifier too by @bee-san in #247
- Polish Anki settings and popup controls by @bee-san in #250
- perf: grow classic-FS files geometrically during imports (Electron) by @bee-san in #249
- fix: show the drag handle again and let entry action buttons shrink by @bee-san in #254
- perf: hand the staged import archive to the engine as bytes by @bee-san in #251
- perf: run the import's tail phases on the worker pool by @bee-san in #253
- perf: small importer follow-ups (trainer threads, record buffer reserves) by @bee-san in #256
- refactor(settings): unify the page on one metric scale by @bee-san in #252
- perf: persist large classic-FS files as Blobs in IDBFS (Electron) by @bee-san in #257
- perf: encode and decode base64 with the native Uint8Array codec by @bee-san in #259
Full Changelog: 0.1.3...0.1.5