8 comments

  • dithernaut 4 minutes ago
    Great idea, great execution! Took me a while, but I got used to controls. The only small annoyance i had was the “saved” notification popping up making me miss a few words. Would love a “zen” mode with no UI other than the text.
    • SamuraiLion 0 minutes ago
      Thanks, I'm glad the controls eventually clicked.

      The saved toast is a reasonable hit and frankly is worse than annoying. The whole format is based on your eyes never having to leave the same area, so popping anything up next to the word display forces exactly the saccade you are designed to eliminate. It directly attacks the one function it is designed to fulfil. There’s no need for Auto-save to pop anything up at you either; it never received a request to save and there is no need to echo that action back at you.

      Good call on Zen-mode, and I’m of the opinion that is what should be the default, once you start reading; when words begin moving make thechrome fade out, when words stop, make it reappear. I will consider both of these.

      Was the control issue the Hold to Read option, out of interest? Just wondering what it was.

  • lagrange77 3 minutes ago
    Cool idea!

    Maybe you could somehow integrate it with Calibre [0].

    https://calibre-ebook.com/download

  • carterEthan 15 minutes ago
    Nice idea. I like the local-first approach. How are you handling large EPUB or PDF files? Have you noticed any performance issues with very large books?
    • SamuraiLion 11 minutes ago
      Thanks. The parsing cost is the entire one-time cost, the rest of the operation involves simply walking an array of words, a 900 page novel and a short story will perform the exact same. There is essentially zero cost in rendering a word at a time no matter the size of the book.

      PDF is significantly the worst. We use pdf.js, and it has to page by page to retrieve the text layer, so a large book takes a little while and the tab feels 'busy' while doing so. EPUBs are considerably faster, it's mostly a case of unzipping and parsing xhtml.

      The main thing that was the difference maker was separating storage into two IndexedDB stores, one for metadata, and one for the full text. When we open the library list we only read from the metadata store, not pulling the entire content of all books you own into memory. We only pull in the one you actually want to read.

      The biggest edge case by far are scanned PDFs that have no text layer (there is no OCR, so nothing is returned) that are currently not failing audibly enough to make it clear.

  • kadhirvelm 37 minutes ago
    Wow that was a fascinating experience - honestly the biggest revelation for me is how much I skim content without realizing it. Reading and remembering every single word, one at a time, and comprehending what was being said was more effort than I expected! I also took away how much I need the inter-word formatting to keep track of what's being said
  • Aaoo 24 minutes ago
    I like it. Feels solid and cool. I read a lot of books with some images and graphs how they get processed?
    • SamuraiLion 18 minutes ago
      Thanks. To be frank, the images and graphs are the weak spot at the moment. The parsers extract just the text layer and that’s the extent of it, so images are just discarded and you don’t even get told there was one.

      Tables are worse than dropped - PDF extraction de-flattens them into a stream of values in reading order, so you just get a torrent of disconnected numbers flitting past which don’t mean a great deal.

      I would read figures in the normal way for this type of book and then use the tool for the prose. It’s not really fixable at the format level too, there is no good way of showing a person a graph word by word. I suppose what I really should add is some kind of flag to say there was a figure here instead of just letting the process go ahead and drop everything. Otherwise, you can’t really know that you’re missing things.

  • hazn 30 minutes ago
    i have tried variations of this many time, it personally doesn't work for me. the word flashes into my brain, and i can keep up with "reading" at high wpm's, but the whole sentence doesn't register. i am not seeing the forest because of all the trees.
  • tommytman 1 hour ago
    I like how it pauses near where I would normally pause while reading. How did you choose the cadence?
    • SamuraiLion 43 minutes ago
      Thanks, that's the detail I was most hoping someone would pick up on.

      It started as a flat interval and felt terrible. Every word got the same slot, so sentences never landed and it read like a stock ticker.

      Now there's a base duration from the WPM setting, with per word multipliers on top: 3x on sentence-ending punctuation, 2x on commas and semicolons, and an extra 0.7x if the word is 8 characters or longer.

      The punctuation weights came from reading passages out loud and noticing where I actually stopped. Those are the breath points, so giving them proportionally more time puts the sentence structure back in. The long word bump is closer to the eye tracking literature, where fixation duration scales with word length. It felt wrong for a 12 letter word to get the same slot as "the".

      The actual numbers were tuned by ear over a lot of real reading. I tried syllable estimates and word frequency weighting too, but neither was noticeably better than punctuation plus length, and they made the rhythm less predictable, which turned out to matter more than being clever.