Steno Keyboard

Type at 300 words per minute!

Similar projects worth following
Stenotyping is a technique of typing text very fast, by using a specially designed shorthand system, using chords of multiple keys pressed at once, and a special keyboard. Each pressing and release of the keys corresponds to a single word. The chords are designed around how the words sound, and are quite easy to learn and remember.

Stenotyping lets you type faster than speak -- in particular, it lets you easily write down what other speak in real time, with some margin to spare. All you need is to learn the system of phonetic chords that correspond to the individual words.

It is possible to do it on standard PC keyboard (as long as it allows you to press so many keys at once), there is even very nice software that lets you do that. However, it's easier and more convenient to use a dedicated keyboard. And that's what this project is all about.

  • Version Two

    deʃhipu02/22/2021 at 23:10 0 comments

    As you might have guessed from the previous log, I decided to try and make another stenotype. This time with a little bit more experience from my low-profile keyboard projects. Of course it's low-profile, and of course it runs CircuitPython.

    I used blue Kailh Choc switches, because they are very light, with 25g springs. That is important, because you are usually pressing a lot of keys at once, and the forces add up quickly. The switches are linear, not clicky, but I think it's fine.

    I used some keycaps I had left over from building other keyboards — mostly function keys and some random stuff like Print Screen or alternate Alt. I couldn't use keys with proper legends, because the letters repeat here, so I would need several sets. Instead I bought several sheets of stickers for "converting" your keyboard to a different layout. They look bad, but it works well enough for training.

    Right now I programmed it as a keyboard to be used with Plover, but ultimately I want to make it work like real stenotypes, as a serial device. CircuitPython just recently had a se]cond USB CDC device added, so I can use that.

  • Soon...

    deʃhipu11/25/2020 at 16:36 0 comments

  • It's Alive, ALIVE!

    deʃhipu08/01/2017 at 15:44 0 comments

    Having cleaned the switches overnight, in the morning I started to work on the wiring. I used a two-sided tape to glue a Pro Micro to the base, added a USB cable (I had to file the plug a little to make it fit inside the keyboard), and started to add the wires and diodes.

    I decided to use 3 rows and 8 columns, with the two large keys in the same row as the vowels on the bottom. This lets me return the row status as a single byte and makes the scanning quite fast.

    For software, I used the same TMK keyboard firmware as in #Alpen Clack, with just two changes, one to the key map:

    static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        {KC_W,    KC_E,    KC_R,    KC_U,    KC_I,   KC_O,   KC_P,    KC_LBRC},
        {KC_S,    KC_D,    KC_F,    KC_J,    KC_K,   KC_L,   KC_SCLN, KC_QUOT},
        {KC_Q,    KC_T,    KC_C,    KC_V,    KC_N,   KC_M,   KC_NO,   KC_NO},

     and one to the matrix functions:

    /* Column pin configuration
     * col: 8
     * pin: PD0 PD1 PD2 PD3 PD4 PD7 PC6 PE6
    static void  init_cols(void) {
        // Input with pull-up(DDR:0, PORT:1)
        DDRD  &= ~0b10011111;
        PORTD |=  0b10011111;
        DDRC  &= ~0b01000000;
        PORTC |=  0b01000000;
        DDRE  &= ~0b01000000;
        PORTE |=  0b01000000;
    static matrix_row_t read_cols(void) {
        return (PIND&(1<<0) ? 0:(1<<0)) |
               (PIND&(1<<1) ? 0:(1<<1)) |
               (PIND&(1<<2) ? 0:(1<<2)) |
               (PIND&(1<<3) ? 0:(1<<3)) |
               (PIND&(1<<4) ? 0:(1<<4)) |
               (PIND&(1<<7) ? 0:(1<<5)) |
               (PINC&(1<<6) ? 0:(1<<6)) |
               (PINE&(1<<6) ? 0:(1<<7));
    /* Row pin configuration
     * row: 3
     * pin: PF7 PF6 PF5
    static void unselect_rows(void) {
        // Hi-Z(DDR:0, PORT:0) to unselect
        DDRF  &= ~0b11100000;
        PORTF &= ~0b11100000;
    static void select_row(uint8_t row) {
        // Output low(DDR:1, PORT:0) to select
        switch (row) {
            case 0:
                DDRF  |= (1<<7);
                PORTF &= ~(1<<7);
            case 1:
                DDRF  |= (1<<6);
                PORTF &= ~(1<<6);
            case 2:
                DDRF  |= (1<<5);
                PORTF &= ~(1<<5);

    Unfortunately the Pro Micro doesn't break out any of its pin ports in whole, so I had to use multiple ports for the columns. I still have whole port B free, I might decide to add LEDs to the keys as a teaching help. For now let's keep things simple.

    I don't have any CapsLock or NumLock keys, so the LEDs on the board are unused. I still placed it in such a place, that it is visible, just  in case I might need them for something later.

    Once I made all the connections and uploaded the firmware, I realized that 5 of the switches actually didn't survive the glue removal operation — they give no electrical connection. Fortunately I still had a bunch of switches left to replace them.

    Now I'm going through the lessons at

  • Back on the Ring

    deʃhipu08/01/2017 at 02:01 0 comments

    I found this keyboard today in my drawer, and decided to try and revive it. The project got, um, paused indefinitely over a year ago, when I stupidly got superglue inside the key switches, and pretty much ruined them.

    Today I decided to take a little bit of risk -- since the switches are broken anyways the way they are -- and applied a little bit of acetone to one of the keys. Lo and behold, it budged! A little bit of wiggling and scraping and removing the gunk from it, and it works almost as well as it used to. Great! Only 21 more to go!

    Three hours later I pretty much have all the switches working (I had to replace one of them, but fortunately I still had some spares), and I am back to where the project was last time -- I have the rows of the keys soldered, and now I need to solder a diode to each key and then connect the columns, and connect everything to a Pro Micro.

  • Abort Mission

    deʃhipu04/15/2016 at 12:58 5 comments

    Last Monday I worked a little bit more on this keyboard. I decided to start on the wiring. I did the rows, and then I decided the keys are not sitting in their holes well enough. So I decided to do what I did with my previous two keyboards -- glue the switches in place.

    Unfortunately, this time I used instant glue, and applied it when the keyboard was up-side-down, so that the glue got into the switches. Sure enough, they are all glued hard, and there is no force that could budge them now. I suppose I could try removing them, opening each and cleaning, but they would never again work as well as before, and I honestly don't have any stamina left to do it.

    So I'm aborting this project, with a small possibility of reviving it if I get my hands on some spare switches again.

  • Backplate

    deʃhipu04/06/2016 at 10:55 0 comments

    OK, the power of procrastination is immense. I already made the backplate. Started by cutting a rectangle from a piece of sheet metal. Who needs laser cutters when you have a hacksaw?

    Next, I taped the two plates together and drilled the holes, then did some filing and dremeling to make the metal plate smooth and to round its corners. The result:

    I used nylon spacers to connect the two plates together, cutting off the excess pieces of the bolts.

    Next up: wiring.

  • Keycaps

    deʃhipu04/06/2016 at 08:45 0 comments

    The blank keycaps I ordered finally arrived. I decided to use blanks, because this keyboard layout is really non-standard, and it would be difficult to get the right keys with the right letters on them, especially since some of the letters repeat. I might figure out some way of adding the letters on those keycaps later on, we will see.

    The keycaps are low-profile, but the keyboard is still pretty high -- as is expected with a mechanical keyboard. Next I need to cut a bottom plate for it, but that's after the conference.

  • Designing a Keyboard

    deʃhipu03/26/2016 at 19:53 0 comments

    I've been through building a keyboard twice already, so this time I knew exactly what to do. First I went to and made a keyboard with the steno layout, which, for English at least, looks like this:

    Then I clicked on the "raw data" tab, and copied the keyboard definition, which looks like this:
    [{a:7,h:2},"S","T","P","H",{h:2},"<i class='fa fa-asterisk'></i>","F","P","L","T","D"],

    Then I went to and pasted that code in there. After selecting some options, it generated me an SVG file that looks like this:

    I opened that in Libre Office (Inkscape has problem with exporting PDFs with very thin lines), changed the line width to 0.01mm, saved that as PDF and went to the nearby FabLab to have it laser-cut. I actually choose too weak laser power, so the cuts were not whole way through, and then I moved it, so I couldn't repeat the cutting, but nothing that can't be fixed with a bit of demeling. Final plate looks like this:

    I still have some Gateron Brown switches left from my previous keyboard, so I will be using those. They just snap into those holes -- easy enough. Keycaps are a bigger problem -- as you can see, I will need several with the same letter, and also for different rows than normally. The keys on your keyboard usually have different height depending on which row they are.

    So I went to and ordered myself some blank keycaps. I also picked the low-profile ones, which are all the same height. This is actually the most expensive part of this project. Now I'm waiting for the keycaps to arrive.

View all 8 project logs

Enjoy this project?



Jeremiah Johnson wrote 11/05/2016 at 16:00 point

yeah this looked good.  I would really want to see what happens when I can type faster than I can talk.  It honestly sounds fun.

  Are you sure? yes | no

Charley Shattuck wrote 10/08/2016 at 20:46 point

Very sorry to see that you've aborted the project! Good looking keyboard!

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates