Skip to content

Repository files navigation

rubric

a reading application for macos and windows

a book open in rubric: pages turning, then the paper changing from white to sepia to night

install · build · what it reads · aloud · numbers · limits

it opens epub, fictionbook, mobi, kindle, pdf, comics and plain text, and it sets them the way a book is set: an open spread with a real gutter, contents down the leading edge, notes in the margin, a ribbon where you stopped.

paste an address and it fetches the book. a direct link works, and so does a catalogue page — it follows the page to the file. books can also be dropped on the window or opened from finder.

the spread on white paper the same spread on night paper
nine papers, from warm white to ink. the measure holds at sixty-six characters and the text sits on a baseline grid. old-style figures, hung punctuation, kerning and contextual ligatures on, and nothing synthesised — no faked bold or slant.
the library the speech settings
the library is one sqlite file. covers, progress and marks travel with it. every control is in the window, never in the menu bar, and a button looks like a button.

install

the installers are on the releases page: a .dmg for macos on apple silicon, a -setup.exe or .msi for 64-bit windows.

neither build is signed, and each system says so in its own way.

macos quarantines the download and says rubric "is damaged". it isn't — that is what gatekeeper says about anything it cannot vouch for. drag it to applications, then name that copy:

xattr -dr com.apple.quarantine /Applications/Rubric.app

the command has to name the copy in applications; run against the disk image it does nothing, the image is read-only.

windows shows "windows protected your pc" instead. more info, then run anyway.

build it yourself

npm install
npm run tauri icon path/to/icon.png   # once
npm run tauri build

the engine is a plain rust library with no tauri dependency, so it builds and tests anywhere:

cargo test -p rubric-core   # the engine
npm test                    # the interface
npm run smoke               # a browser, walking the whole of it

what it reads

format what is read
epub 2 / 3 metadata, spine, nav or ncx, images, covers
fictionbook nested sections, poetry, epigraphs; windows-1251 and koi8-r decoded
mobipocket palmdoc, exth metadata, images, filepos links
kindle kf8 partial — see limits
pdf text reflowed, or real pages rendered
cbz comics, one page at a time or two
txt, html, markdown encoding detected, gutenberg boilerplate trimmed

format is decided by the bytes, not the extension, so download.php?id=41 is read correctly. drm-protected files are refused with a sentence, not a stack trace.

aloud

it will read a book aloud and hand you back an m4b with chapter marks. the voice is the system's, a neural model you fetch, or a service you have a key for. for russian it knows where the stress falls, which is the difference between a reader and a metronome.

the voices that download are piper, which covers both languages, and kokoro, which is english only and much less flat over a chapter. kokoro is one network shared by all of its voices: the first costs 92 mb, every one after it costs half a megabyte.

the interface is english, german and russian throughout.

numbers

measured, not estimated.

measured
engine tests 504, and every parser handed the same damaged corpus
interface tests 48, plus a walk of every view that checks what it saw
stress dictionary 872,742 russian forms, 1.04 mb
stress resolved 95.8% of onegin, 100% of a page of modern prose
narration pauses asked 220 / 640 / 1400 ms, measured within 0.083 ms
join discontinuity 346 of 32,768 — the tone's own step. a butt join would be 11,676
fonts 24 faces, 1.2 mb, bundled; no cdn
library one sqlite file

limits

  • kf8 is partial: skel and fragment indices are not reassembled.
  • huff/cdic mobipockets are unsupported. they fail with a message.
  • neither mobi parser has met a file from kindlegen.
  • scanned pdfs render but do not reflow; a pdf's title comes from its filename.
  • neural voices need espeak-ng on the machine for anything but russian.
  • the interface is covered by unit tests and one end-to-end walk, not by a test per component.
  • the windows build compiles, bundles and its installers are what they claim to be. nobody has yet opened it on windows. the engine is tested there; the window it opens in is not.
  • looking a word up in the dictionary is macos only. there is no equivalent to ask on windows.

stack

rust for the engine, tauri v2 for the shell, react and typescript for the interface, sqlite for the library, onnx runtime for local voices. literata, eb garamond and vollkorn, all with cyrillic.

mit.

About

a reading application for macos. epub, fictionbook, mobi, kindle, pdf and comics, set the way a book is set — real gutter, margin notes, baseline grid, nine papers. reads books aloud into an m4b, and knows where russian stress falls. rust engine, tauri shell.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages