Hacker News new | past | comments | ask | show | jobs | submit login

I played around with something like this a while ago (my files have 2004 timestamps, but those may have updated when I copied stuff to a new computer). I had a command-line based program that took text and displayed it a word at a time. If anyone would like to play around with it, here's my source.

Compile: c++ speedread.cpp

Usage: ./a.out [delay_in_ms] < text

Should work on Mac and Linux, and maybe Windows if you uncomment the first line. (Looks like a #include <stdlib.h> needs to be included to make it compile on Linux. Not sure what I don't need that on Mac).

It's kind of fun. I played around with showing words at a constant rate, and with throwing in an extra delay whenever there was punctuation. The version below does the latter. I had thought of this as a possibly good way for displaying text on the limited phones of the early 2000s. Also, I thought it might be an interesting way to display status information on many processes at once. A display line wide enough to display, say, 10 words could be used to display 10 status messages at once instead of one.

Oh...2 clause BSD license, if anyone cares.

    //#include <windows.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>

    #include <unistd.h>
    #include <signal.h>
    #include <sys/time.h>

    typedef unsigned long DWORD;

    bool cont = true;

    stop( int sig )
        cont = false;

    Sleep( int msec )
        usleep( msec * 1000 );

        static unsigned long base = 0;
        struct timeval tv;
        gettimeofday( &tv, 0 );
        if ( base == 0 )
            base = tv.tv_sec;
        return (tv.tv_sec - base) * 1000 + tv.tv_usec / 1000;

    int main( int argc, char *argv[] )
        int delay = 250;
        std::string word;

        if ( argc == 2 )
            delay = atoi(argv[1]);

        signal( SIGINT, stop );

        std::cout << "\n\n\n";

        int words = 0;
        DWORD start = GetTickCount();
        std::string display_word = "";
        while ( std::cin >> word && cont )
            if ( display_word.length() )
                display_word += ' ';
            display_word += word;
            //if ( display_word.length() < 5 )
            word = display_word;
            display_word = "";
            int punc = word.find(".");
            if ( punc == std::string::npos )
                punc = word.find(",");
            int pad = 15 - word.length()/2;
            for ( int i = 0; i < pad; ++i )
                std::cout << " ";
            std::cout << " " << word << "                                  \r";
            if ( punc != std::string::npos )
        DWORD stop = GetTickCount();
        float seconds = (stop - start) / 1000.0;
        printf( "\n%d words in %f seconds\n", words, seconds );
        if ( seconds != 0 )
            printf( "%f words/second, %f words/minute\n", words/seconds,
                    (60*words)/seconds );
        return 0;

Use a pastebin mate

I also did an RSVP app many years ago. I did mine for j2me - http://kybernetikos.com/bookreader-and-bookreaderdeployer/ and read books from gutenberg on my mobile phone at the time. It had pause and jump forward/backward as many people in this thread are saying is important to them.

The FAQ tries to make the claim that Spritz is not just another RSVP speed reader (although I'm not sure how much I believe it).

> Reading with RSVP is somewhat stressful and the reading speed is limited. Reasons therefore are the word alignment and display times. Briefly, RSVP still forces the eye to perform saccades (eye movements) while removing targeting these saccades by peripheral visioning. Spritz instead takes saccades out of the game by applying a new method of word alignment. Our technology is based on the science of how people read, how they learned to read when they were young, and what your eyes expect when you are reading.


my quick python version:


Mocked this up in 30 mins this evening.


Applications are open for YC Summer 2019

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact