ツ Ebook Reader: a browser e-book reader built for Japanese and Yomitan dictionaries
Online e-book reader that supports Yomichan
At a glance
- What is it?
- The ツ Ebook Reader is a Svelte application that reads HTMLZ, plain text and EPUB files, renders furigana, and pairs with dictionary extensions such as Yomitan, hosted at reader.ttsu.app and self-hostable through a Docker compose file.
- Who is it for?
- The ツ Ebook Reader fits a Japanese learner who wants to read a light novel or manga in the browser with dictionary lookup on every word and a count of how much they have read, and it fits anyone who wants to self-host a reader whose books never leave their own server.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly Svelte, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 21, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What it was built for, and what that limits
The ツ Ebook Reader is an online e-book reader that supports dictionary extensions like Yomitan, and the hosted instance is at reader.ttsu.app.
The README states its scope plainly: the reader was created for Japanese, for language learners, and while books in other languages may work to a specific degree, other functionality such as the character counter may have unsupported or unexpected results.
That is an unusual and useful thing for a project to say about itself, because it explains every design decision rather than presenting the tool as general purpose. A character counter that assumes Japanese text will count differently on a novel written in French, and the paragraph splitting rules are explicitly Japanese.
The second thing the README says is about maintenance: the reader is currently not actively worked on, maintenance only. Bug reports, feature requests and pull requests are welcome but timely responses should not be expected.
Those two sentences together define the adoption case. This is a finished-enough tool for a specific reader, with a maintained-by-necessity rather than actively developed status. If you need Japanese reading with dictionary support and are willing to run it yourself, that is a good fit. If you need a general reader or a project with a roadmap, it is not.
The project is BSD-3-Clause licensed, the primary language is Svelte, the last push was on 2026-10-15, and the releases are v2.0.0 from 2021-12-19 and v1.0.0 from 2021-09-18. The hosted version has continued past those tags, but the published releases stopped five years ago.
Formats, reading modes, and the tracking features
The feature checklist is complete, with every box ticked, and the items fall into a few groups.
On formats, it supports HTMLZ, plain text and EPUB files. On the environment, it is customizable, with themes, font size, image blur and furigana settings among the options. On reading, there is a continuous or pagination reader mode and a vertical or horizontal reading mode, plus auto scroll in continuous mode.
On tracking, there is a basic time and character and reading goals tracker, reading data statistics, and a character count and progress display. The statistics view is reachable from the reader header and filters by the current book.
On organisation, there is table of content support for EPUB files, automatic bookmark functionality, a book manager, data import and export via local and external sources, and installation and offline capabilities.
The reading tracker is the part that is specific to a learner rather than to a reader. It runs and pauses, and it pulses when you have an active freeze position. The header also has a control to jump to a selected character position, which for a Japanese reader is a way to navigate by character offset rather than by page, and a control for a custom reader point action.
Two implementation details are documented with care. The character count is mainly based on paragraph nodes in the book, so configuring a very high line height may update the counter more slowly. And for plain text files, the book title, which is also used to check for duplicates, is the name of the file, the text is split into paragraphs by the Japanese punctuation marks 。?! and by closing brackets and parentheses, and sections are split around 10000 characters each. The file content is parsed as plain text, so any HTML tags such as links are printed as text and not as elements.
The reader controls, and the EPUB import fix
Most of the reader controls live in a header you open by clicking or tapping in the upper area of the page, and the README tabulates them with their key bindings.
The table of contents control opens the table of content if available. The bookmark control creates a bookmark at your current location, bound to b, and the bookmark scroll control returns to the bookmark location, bound to r. The auto scroll speed indicator shows the current speed and is bound to a and d, presumably to adjust it. The finish control marks the current book as complete, the reading point control executes a custom reader point action, the fullscreen control enters fullscreen with F11, the statistics control navigates to the statistics with the current book as the filter, the jump control moves to a selected character position, the image gallery control opens the book image gallery, the settings control opens the settings, the manager control goes to the book manager or opens the action menu, and the bookmark icon is displayed at the current bookmark location.
The footer has the tracker controls, where the timer indicator shows whether the reading tracker is paused or running, and a sync indicator shows that there is data which will be exported if a sync target and auto export are configured, and clicking it runs a manual export.
There is one quirk worth knowing, because it looks like a bug and is not. Using the Blur Images setting applies unidirectionally to the gallery, meaning that showing an image in the reader will also remove the spoiler tag in the gallery, but not the other way round.
And there is a workaround for the most common EPUB problem. If you hit an issue with EPUB files that have non-closing anchor tags, the fix is to temporarily enable standard or extended mode for the Epub Import Fixes setting under Data and re-import the file to verify the potential auto fixes. The setting is a toggle rather than a repair tool, so if the auto fix mangles a file that was otherwise fine you can turn it off and import again.
Loading books works the way you would expect. The first time you enter the page, or when you have no files loaded, you select books from your device, either by clicking the dropzone or the icons, and you can also drag and drop files or folders onto the manager if your device supports it.
What the Yomitan integration actually needs from you
The dictionary support is the reason the project exists, and it is worth being precise about what the reader does and does not do.
The reader supports dictionary extensions like Yomitan. That is a browser extension, so the dependency is on the extension being installed and active in the same browser profile, and the reader's job is to make the text on the page look like something a dictionary extension can attach to. It is the page that cooperates, not the extension that reads the page.
That is a meaningful design constraint for a reader built around Japanese. Dictionary extensions like Yomitan attach to the text rendered on the page. For that to work, the text has to be in the DOM as text nodes that the extension can walk. In a document-based reader, the paragraphs are already there. In a reader that draws to a canvas, there is nothing for the extension to attach to, which is the structural reason a canvas-based approach and a dictionary-extension workflow are in tension.
The reader's own furigana settings fit the same picture. Furigana is the small reading guide printed next to kanji, and the setting controls how it is rendered, so the reader handles the reading aid itself and leaves the translation lookup to the extension.
The result is a division of labour that suits the use case: the reader handles the book, the pagination, the vertical text, the furigana and the progress tracking, and the extension handles the vocabulary. A user who already has Yomitan set up with a Japanese dictionary gets the whole workflow from the reader.
The hosted instance at reader.ttsu.app exists so that trying the combination does not require a server, and the self-hosting path exists for anyone who wants their library to stay on their own machine.
The stack, the self-hosting path, and the monorepo
The application is a Svelte project on pnpm, and the root package.json shows the shape. The workspace has a single app, apps/web, and the dev and build scripts both cd into it, with the dev script running pnpm dev and the build script running pnpm build.
The dependency versions are current for a project that is not being developed: Svelte 5.0.5, TypeScript 6.0.3, eslint 9.39.5, prettier 3.6.2, husky 9.1.7 and commitlint 21.2.3. The presence of eslint-plugin-svelte, prettier-plugin-svelte, prettier-plugin-tailwindcss, eslint-plugin-rxjs and eslint-plugin-headers tells you the frontend uses Tailwind, that RxJS is in play, and that a licence-header rule is enforced on source files.
The lint-staged configuration formats JavaScript, TypeScript and Svelte files with eslint and prettier, and JSON, Markdown, HTML, SCSS and YAML files with prettier alone. There is a pnpm setting that only builds two specific dependencies, svelte-preprocess and unrs-resolver, which is the pnpm mechanism for allowing install scripts for packages that need them and blocking them for everything else.
Self-hosting goes through a Docker compose file with a single service. The build context is the repository root, the dockerfile is apps/web/Dockerfile, the port mapping is 9010 to 80, and the restart policy is always. The upstream Dockerfile is at apps/web/Dockerfile rather than at the root, which is why the compose file points at it explicitly.
The repository root has a pnpm-workspace.yaml, a docker-compose.yml, an eslint.config.js, a.husky directory for the git hooks, an assets directory and a LICENSE. The top level also has a.commitlintrc.yaml, so the commit message format is checked as well as the code.
Editorial conclusion
The ツ Ebook Reader fits a Japanese learner who wants to read a light novel or manga in the browser with dictionary lookup on every word and a count of how much they have read, and it fits anyone who wants to self-host a reader whose books never leave their own server. It is a poor fit if you are reading a language other than Japanese, because the features were designed around Japanese text and the character counting and paragraph splitting assume it, and a poor fit if you need an actively developed project, since the author says it is under maintenance only. Before deploying, read the EPUB import fixes setting, because malformed EPUB anchors are common and the fix is a toggle rather than a repair.
Frequently asked questions
What is the ツ Ebook Reader?
It is an online e-book reader that supports dictionary extensions like Yomitan, hosted at reader.ttsu.app. It supports HTMLZ, plain text and EPUB files, with a customizable environment, continuous or pagination modes, vertical or horizontal reading, a reading tracker, statistics, bookmarks and a book manager.
Is the ツ Ebook Reader still being developed?
No. The README states that it is currently not actively worked on, maintenance only. Bug reports, feature requests and pull requests are welcome but timely responses should not be expected, and the last published release was v2.0.0 from 2021-12-19.
Can I use the ツ Ebook Reader for languages other than Japanese?
Partly. The reader was created for Japanese and language learners, and while books in other languages may work to a specific degree, features such as the character counter may have unsupported or unexpected results. Plain text is split into paragraphs by the Japanese punctuation marks and by closing brackets and parentheses, with sections split around 10000 characters.
How do I host the ツ Ebook Reader myself?
The repository ships a Docker compose file with one service that builds from the apps/web/Dockerfile, maps port 9010 to 80 and restarts always. The application itself is a Svelte project on pnpm with a single workspace app under apps/web, built with pnpm build.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/ttu-ttu-ebook-reader)Was this useful?