# primusread: fixation point typography that never leaves the browser

> PrimusRead is a React, Vite, Tailwind and TypeScript tool that applies fixation point typography, the technique of bolding the first letters of words so the eye can complete them, to documents you import as TXT, DOCX, PDF or EPUB. Everything runs client side, so no file is uploaded, and the EPUB export writes the bolded fixation points back into the chapters of the book. The project's own claim is a reading time reduction of up to 30 percent without loss of retention.

**crisanlucid/primusread** — PrimusRead — open-source fixation-point reading tool. React, Vite, Tailwind CSS & TypeScript. Import TXT, PDF, DOCX, EPUB · Export bionic EPUB · Reduce reading time up to 30%  ▎· Dark mode

- Repository: https://github.com/crisanlucid/primusread
- Stars: 539 · Forks: 36
- Language: TypeScript
- License: MIT
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/crisanlucid-primusread

## Bold the first letters, let the eye finish the word

PrimusRead is an open source tool built with React, Vite, Tailwind CSS and TypeScript that accelerates document comprehension through fixation point typography. The mechanism is the one that the tagline names: the brain completes each word from its bold starting letters. The project states that this reduces reading time by up to 30 percent without loss of retention, and it is worth being clear that this is the project's own claim rather than an independent measurement, since the repository documents no study behind it.

What the tool does concretely is simple enough to describe in one sentence. You paste or import a document, the text is transformed so that the beginning of each word is emphasised, and you read it. What is not simple is everything around that sentence: two different rendering strategies, a PDF export that has to reproduce a page layout, four import formats, and an EPUB export that rewrites the chapters of a book.

The project is MIT licensed, the repository was last pushed on 2026-05-13, and the three most recent releases, v0.17.0, v0.18.0 and v0.18.1, all carry that same date, which suggests an author shipping quickly rather than on a release train. There is a live demo hosted on GitHub Pages, and the source is a standard Vite project with the usual configuration files: eslint.config.mjs, prettier.config.ts, stylelint.config.cjs, tsconfig.json, tsconfig.node.json, vite.config.ts and postcss.config.mjs. The package is marked private in the package manifest, so this is an application to run rather than a library to install.

## Two rendering modes, and a 57 times speedup in the slower one

There are two ways the app can present the transformed text, and the difference between them is the most interesting engineering detail in the project.

The default is CSS mode, where the first letters are emphasised with markup and styling. The alternative is Unicode mode, where the transformation uses Unicode variant characters, so the emphasis is part of the text itself rather than something a stylesheet draws. The Unicode route was originally rebuilding all of its data structures on every call, and the fix was to hoist the toUnicodeVariant constants to module scope, so the structures are built once at load time instead of once per word. The README reports that this reduced the per-call overhead to zero and yielded a 57 times throughput improvement on a 500 word document, from 86 operations per second to 4,915, and the fix is linked to a specific commit.

The steady state numbers are in a small table. CSS mode handles roughly 15,700 operations per second on a 500 word document, and Unicode mode after the fix roughly 4,900. So CSS mode is the faster of the two once the constant building is out of the way, and the interesting result is that a badly structured implementation of the slower approach was more than a hundred times behind, not merely a little behind.

The project also tells you how to check the claim yourself, with a benchmark script exposed as npm run bench, run through the Vitest bench runner. That is a nice touch for a project making a performance claim: the benchmark is part of the repository rather than a number in a blog post.

## PDF export at three times pixel ratio, and a millimetre conversion

The Save as PDF feature is the part of the app that shows the most attention to detail, and the project keeps a running list of the problems it has fixed.

The export path uses html-to-image together with jsPDF. The Read Section is captured as a PNG at three times the pixel ratio, which is what makes the text sharp rather than blurry, and the image is then placed on the page at its true physical size. The sizing logic lives in src/util/pdfLayout.ts, in a function called calcPdfImageLayout, and it converts CSS pixels to millimetres with the factor of 25.4 divided by 96, centring the image horizontally.

Two of the fixes in the project table are directly about this feature. One replaced html2canvas with html-to-image for compatibility with Tailwind v4, which eliminated the grey background that appeared in the exported PDF. The other is the three times capture, which is what removed the blurry text. Both are the kind of defect that only shows up once you have actually exported a file and looked at it, and the fact that the fixes are recorded in a table in the README is a reasonable substitute for a changelog for a project this size.

The result is that a text transform, which is fundamentally a screen activity, can be turned into a document you can keep, and the export is calibrated in millimetres rather than in pixels, which is the difference between a page sized for the screen and a page sized for a printer.

## Import and EPUB export, entirely in the browser

The Advanced mode toggle in the header reveals the Import file button, and behind it is a format matrix. TXT, DOCX, PDF and EPUB can all be imported, and EPUB is the only one that can also be exported, as a bionic formatted .epub file. The others import only.

The guarantee the project makes is the important one for anyone with an unpublished manuscript or a confidential report: all parsing and export runs entirely in the browser, and files are never uploaded to a server. The parsers are named, pdfjs-dist for PDF and mammoth for DOCX, and the ZIP engine is jszip. All three are lazy-loaded on demand, so they do not affect the initial page load, which is a sensible trade for an application whose core use does not need them.

The EPUB export is the most detailed of these. It applies the bionic fixation points directly to each HTML chapter inside the EPUB, preserving the original structure, images, styles and metadata. That last part is the difference between a real export and a lossy one: an EPUB rewritten from scratch loses the styling that made the book readable, so the tool works inside the existing document rather than replacing it.

The practical upshot is that PrimusRead can be used on a document you are not allowed to send anywhere, since the file never leaves the tab, and the output is a book you can read in any EPUB reader, with the transformation baked in.

## The interface pieces, the backlog, and the dark mode

The project tracks what is done and what is not in a table, and reading it tells you what kind of tool this is.

Done: saving as PDF, Unicode support, the two PDF export fixes, dark mode with localStorage persistence, file import for the four formats, and the bionic EPUB export. The reusable UI components entry is also marked done, and it names them: Button, Textarea, Checkbox and ReadOutput, extracted into src/components/, described as accessible, typed and independently testable. That is the item that matters most for a project you might read the source of, because it says the interface is not a single monolithic file but a set of components with tests.

Two entries are in the backlog: showing characters after the textarea, and functionality to increase and decrease the font size. Both are small, both are things a reader would expect from a reading tool, and the fact that they are listed as not done tells you the app is still young. The same table records the 57 times Unicode speedup as a completed item with a link to the commit, so the table doubles as a changelog of engineering work.

Dark mode is a toggle with localStorage persistence, so the choice survives a reload, and the README shows the light and dark rendering side by side. The accessibility tooling in the repository backs the claim in the components entry: the ESLint configuration includes the jsx-a11y and react-hooks plugins, and there is a separate stylelint configuration for the CSS.

## The toolchain, and how the releases were made

The package manifest shows a modern React toolchain in detail. The engine requirement is Node 22.x, React and React DOM are on 19, React Router is on 7, and the Tailwind integration goes through the Tailwind v4 Vite plugin. The runtime dependencies are the ones the features need and nothing else: html-to-image, jspdf, jszip, mammoth and pdfjs-dist alongside the React packages.

The scripts cover the whole loop. Development is vite, the build is tsc followed by vite build, there is a separate typecheck script that runs tsc with no emit, the lint script runs ESLint over the source with a quiet flag, styling has stylelint and Prettier with separate check and fix commands, and the tests run under Vitest with a UI mode and the bench mode used for the performance numbers. jsdom is in the development dependencies, which is how the DOM-dependent parts are tested.

The local run is two commands:

```bash
npm install && npm run dev
```

The repository also documents its own release process in a ReleaseFlow.md file, and the released versions carry the patch level in the package manifest, currently 0.18.1. The top level contains a dist/ directory, which suggests the built output is committed or published alongside the source, and both a package-lock.json and a yarn.lock are present, which is an inconsistency in a project that otherwise picks one tool per job. The workflows in the .github directory cover Node CI, CodeQL analysis and a deploy job, so the live demo is deployed automatically rather than by hand.

## Conclusion

PrimusRead fits a reader who wants to try fixation point typography on documents they already have, and who does not want to upload a manuscript, a report or an unpublished book to a server to do it, since the parsing and the export both run in the browser. It is the wrong tool if you need a reading system with research behind it rather than a typographic transformation, because what the project does is bold the first letters, and the retention claim is the project's own. It is also the wrong tool if you need the output to keep the original formatting intact in a way an EPUB rewrite cannot, since the export rewrites the HTML chapters of the book. Before you rely on it, run npm run bench to see the two rendering modes on your own machine, read the backlog in the project table, where the font size controls and the character display are still marked as not done, and check that the imported PDF and DOCX parsers are loaded lazily if initial page load matters to you.

## FAQ

### What is PrimusRead and what does fixation point typography do?

PrimusRead is an open source React, Vite, Tailwind CSS and TypeScript tool that applies fixation point typography to documents, bolding the first letters of words so the eye completes them. The project states that this reduces reading time by up to 30 percent without loss of retention, and it also offers a Unicode mode that bakes the emphasis into the characters themselves.

### Does PrimusRead upload my documents to a server?

No. The README states that all parsing and export runs entirely in the browser and that files are never uploaded to a server. The PDF and DOCX parsers, pdfjs-dist and mammoth, and the ZIP engine, jszip, are lazy-loaded on demand so they do not affect the initial page load.

### Which formats can PrimusRead import and export?

It imports TXT, DOCX, PDF and EPUB, and EPUB is the only format it can also export, as a bionic formatted .epub file with the fixation points applied to the HTML chapters while preserving the original structure, images, styles and metadata.

### How do I run PrimusRead locally?

The README gives npm install and npm run dev, which starts the Vite development server. The repository also exposes npm run bench for the throughput benchmark that compares CSS mode against Unicode mode, and the tests run under Vitest.

## Sources

- [crisanlucid/primusread on GitHub](https://github.com/crisanlucid/primusread)
- [Issues](https://github.com/crisanlucid/primusread/issues)
- [License: MIT](https://github.com/crisanlucid/primusread/blob/main/LICENSE)
- [README](https://github.com/crisanlucid/primusread/blob/main/README.md)
- [Releases](https://github.com/crisanlucid/primusread/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/crisanlucid-primusread
