Planck Build

A 40% Ortholinear Keyboard

Beginning Switch Install

Ortholinear is a semi-made-up word that was originally coined (to my knowledge) by TypeMatrix as “ortho-linear” - this term got concatenated, became popular among the keyboard community, and eventually became the banner for a keyboard company! It refers to keyboard layouts where the keys are aligned vertically and horizontally, compared to standard staggered keyboards. No studies have been done to test the ergonomics of ortholinear keyboards (versus a comparable staggered one), but the change can make it easier to design and visual custom keymaps, and may help relieve RSI symptoms.

[OLKB]

The Ortholinear keyboard concept has exploded within the keyboard community lately. Among the many that exist, those made by Jack Humbert’s Planck and Atomic have proven to be incredibly popular. A recent group buy on Massdrop had hundreds of participants. Nearly every custom keycap buy that is launched now has support for Planck or Atomic layouts in some way or another.

Atomic and Planck are both reduced size boards. Atomic being a 65% sized board, Planck a 40%. The typical board has 104 to 108 keys, Planck has a mere 48. Like most custom keyboards, Planck must rely on function layers to produce the full range of 100+ keys (should the user so desire). A function layer should be familiar to many laptop owners: you press the function key, and other keys change from doing one thing, to doing another. Many, if not most custom keyboards employ some level of function keys, but unlike laptops, custom keyboards often have multiple function layers.

Planck’s implementation of layers is quite novel and elegant. Unlike other boards that have arbitrary positions for function keys, with x number of layers, and a stack and priority to memorize, Planck by default employs just three. The main layer, the lower layer, and the upper layer.

Planck default layout [source]

Planck comes shipped from OLKB with a very usable layout. For those who want to program it, Planck uses QMK, a fork of the popular TMK firmware. QMK is clever, it employs the TMK core, but has lovely programming shortcuts built in. These shortcuts make it simple to modify a keymap, and succeed in making the code much more human-readable. For example, in TMK, to a macro of modifier keys would require a dedicated macro script + a function key dedicated to it. Below is a macro to key Ctrl+Alt+Del with one key:

/*
 * Fn action definition
 */
const uint16_t PROGMEM fn_actions[] = {
    [0] = ACTION_LAYER_MOMENTARY(1),                  // Default Layer
    [1] = ACTION_LAYER_TOGGLE(1, FN1),          // Apple FN + Others Layer
};


/*
 * Macro definition
 */
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    switch (id) {
        case ALT_TAB:
            return (record->event.pressed ?
                    MACRO( D(LALT), D(LCTRL), D(KC_DEL), END ) :
                    MACRO( U(LALT), U(LCTRL), D(KC_DEL), END ));
    }
    return MACRO_NONE;
}

QMK vastly simplifies the process, modifiers can be chained, with no dedicated macro even being required - leading to much simpler code:

LALT(LCTL(KC_DEL))

Or a simple method to make a key be shift while held, capslock when tapped:

{MT(MOD_LSFT, KC_CAPS)

Again, with no dedicated macro or function layer required to make that happen.

I found the changes from TMK to QMK easy to grasp, and I was able to quickly adapt to using it. I’m seriously considering adapting my TMK keymaps for my Alps64 boards to QMK, just for prettier code.

The keymap I’ve configured for my Planck is below:

 #define _QW 0
 #define _LW 1
 #define _RS 2
 #define _SH 3

 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   // Defalt Layout
   /*
    * ,-----------------------------------------------------------------------.
    * |ESC  |Q    |W    |E    |R    |T    |Y    |U    |U    |O    |P    |BSPC |
    * |-----------------------------------------------------------------------|
    * |TAB  |A    |S    |D    |F    |G    |H    |J    |K    |L    |SCLN |QUOT |
    * |-----------------------------------------------------------------------|
    * |LSFT |Z    |X    |C    |V    |B    |N    |M    |COMM |DOT .|SLSH |ENT/RS|
    * |-----------------------------------------------------------------------|
    * |M0   |LCTL |LALT |LGUI |FNLW |SPC        |FNRS |LEFT |UP   |DOWN |RGHT |
    * `-----------------------------------------------------------------------'
    */
 [_QW] = { /* Qwerty */
   {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
   {KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
   {MT(MOD_LSFT, KC_CAPS), KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, MT(MOD_LSFT, KC_ENT) },
   {M(0),    KC_LCTL, MT(MOD_LALT, KC_CAPS), KC_LGUI, MO(_LW), LT(_SH, KC_SPC), LT(_SH, KC_SPC),  MO(_RS), KC_LEFT, KC_UP   , KC_DOWN,   KC_RGHT}
 },
 // RAISE
 /*
  * ,-----------------------------------------------------------------------.
  * |GRV  |1    |2    |3    |4    |5    |6    |7    |8    |9    |0    |BSPC |
  * |-----------------------------------------------------------------------|
  * |TAB  |A    |S    |D    |HOME |G    |H    |4    |5    |6    |MINS |BSLS |
  * |-----------------------------------------------------------------------|
  * |LSFT |Z    |X    |C    |END  |B    |N    |1    |2    |3    |SLSH |ENT/RS|
  * |-----------------------------------------------------------------------|
  * |M0   |LCTL |LALT |LGUI |FNLW |SPC        |0    |0    |.    |DOWN |RGHT |
  * `-----------------------------------------------------------------------'
  */
 [_LW] = { /* LOWER */
   {KC_GRV,  KC_1,      KC_2,      KC_3,      KC_4,      KC_5,      KC_6,      KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
   {KC_TRNS, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_HOME,   KC_TRNS,   KC_TRNS,   KC_4,    KC_5,    KC_6   , KC_MINS, KC_BSLS},
   {KC_TRNS, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_END,    KC_TRNS,   KC_TRNS,   KC_1,    KC_2,    KC_3   , KC_TRNS, KC_TRNS},
   {KC_TRNS, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_0,    KC_0,    KC_DOT , KC_TRNS, KC_TRNS}
 },
 // LOWER
 /*
  * ,-----------------------------------------------------------------------.
  * |GRV  |1    |2    |3    |4    |5    |6    |7    |8    |9    |0    |DEL  |
  * |-----------------------------------------------------------------------|
  * |TAB  |MUTE |VOLD |VOLU |HOME  |G    |H   |J    |BSLS |=    |-    |"    |
  * |-----------------------------------------------------------------------|
  * |LSFT |MPRV |MPLY |MNXT |END  |B    |N    |F13  |BSLS |[    |]    |RSFT |
  * |-----------------------------------------------------------------------|
  * |M0   |LCTL |LALT |LGUI |FNLW |SPC        |FNRS |LEFT |UP   |DOWN |RGHT |
  * `-----------------------------------------------------------------------'
  */
 [_RS] = { /* RAISE */
   {KC_GRV,  KC_1,      KC_2,      KC_3,      KC_4,      KC_5,      KC_6,      KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL},
   {KC_TRNS, KC_MUTE,   KC_VOLD,   KC_VOLU,   KC_HOME,   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_BSLS, KC_EQL, KC_MINS,  KC_QUOT},
   {KC_TRNS, KC_MPRV,   KC_MPLY,   KC_MNXT,   KC_END,    KC_TRNS,   KC_TRNS,   KC_F13,  KC_BSLS, KC_LBRC, KC_RBRC, KC_TRNS},
   {KC_TRNS, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT}
 },
 // Space FN
 /*
  * ,-----------------------------------------------------------------------.
  * |~    |!    |@    |#    |$    |%    |^    |&    |*    |(    |)    |DEL  |
  * |-----------------------------------------------------------------------|
  * |TAB  |A    |S    |D    |F    |G    |H    |J    |PIPE |+    |_    |QUOT |
  * |-----------------------------------------------------------------------|
  * |LSFT |Z    |X    |C    |V    |B    |N    |M    | |DOT .|SLSH |RSFT |
  * |-----------------------------------------------------------------------|
  * |M0   |LCTL |LALT |LGUI |FNLW |SPC        |FNRS |LEFT |UP   |DOWN |RGHT |
  * `-----------------------------------------------------------------------'
  */
 [_SH] = { /* SpaceFN/Shifted Layout */
 {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
 {KC_TAB,  KC_A,    KC_S,    KC_D,    KC_HOME,    KC_G,    KC_H,    KC_J,    KC_PIPE,    KC_PLUS,    KC_UNDS, KC_TRNS},
 {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_END,    KC_B,    KC_N,    KC_M,    KC_PIPE, KC_DOT,  KC_SLSH, KC_TRNS },
 {M(0),    KC_LCTL, KC_TRNS, KC_LGUI, MO(_LW), KC_TRNS, KC_TRNS, MO(_RS), KC_LEFT, KC_UP,   KC_DOWN,  KC_RGHT}
 },
 };

 const uint16_t PROGMEM fn_actions[] = {

 };

 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
   // MACRODOWN only works in this function
       switch(id) {
         case 0:
           if (record->event.pressed) {
             register_code(KC_RSFT);
             backlight_step();
           } else {
             unregister_code(KC_RSFT);
           }
         break;
       }
     return MACRO_NONE;
 };

Assembly

My Planck was ordered from the Massdrop group buy. I selected a purple milled case bottom, a MIT layout plate (this uses a 2u spacebar instead of 2 separate keys where space would go), and OEM profile blank white keycaps.

All Parts

I selected the purple milled bottom to match a Binge/HungerWorks artisan keycap I won during the initial Zealio group buy. I was wary after my purchase about whether I’d made the right decision - but seeing it in person assuaged all my fears. This thing is absolutely gorgeous.

Milled Purple Bottom

For this build I’ve employed three different switch types. Tactile 65g Zealios, linear Gateron Reds. and a Cherry MX Black. The Zealios have been placed on the alphanumeric keys, linear reds on the modifiers, Cherry black (which is a heavy switch) on space. Switch Install

Assembly of Planck is incredibly straightforward. One might not think a 40%, QMK programmed custom keyboard would be a great introduction for someone getting into custom keyboards, but it really is. The PCB comes with all controller parts and diodes pre-soldered, so assembly is simply a process of placing the stabilizer (if using the MIT layout), placing switches in the plate, then soldering them to the PCB. It’s dead simple board to assemble. I wish more were like it.

Switches Installed

The kit does ship with 48 white LEDs included. Not being a fan of LED backlighting on most boards, I opted to only install one - below my artisan keycap.

Fully Assembled

Elegance and simplicity typify this keyboard. It’s a pleasure to look at, and with the tactile zealios and adorable compact size it’s a pleasure to type with. The ortholinear layout does take a few hours to acclimatize to, after years of touch typing on a staggered board, but it’s easy to do. One might imagine so few keys to be a hurdle to overcome, but it really isn’t, The upper/lower layer concept makes learning the function layers very easy.

Planck compared to AEKII

Planck compared to a full-sized Apple Extended Keyboard II.

At the moment I have the OEM blank keycaps installed - I may consider putting Granite keycaps on the board when those arrive this summer, but I haven’t decided yet. Until then, it’ll continue to look beautiful with the blanks and the Binge slow fi.

Slow Fi


Typed on Planck

Removing Dampers From Linear Matias Switches


Red Matias Linear Switches

In addition to sorting out what was bugging me with the performance of the spacebar on my Orange Alps64 board the other day, I’ve also taken the time to tinker with the linear Matias switches I have installed on the modifier keys on this board.

The board uses tactile Orange Alps for alphas, and Matias linear switches(red sliders) for modifiers. Alps switches have a relatively high actuation force, most of the vintage SKCM switches are around 70 grams. I love a heavy switch on alphas, but it’s a burden on my poor pinkies to have such heavy switches on modifiers - thus linear mods.

I love an MX mount linear; Cherry/Gateron Reds are a lovely switch. I did find that Matias’ linears, they very spongey, particularly when bottoming out. Further investigation revealed to me that Matias installs dampers. Cue the music, it was time to tweak and modify.

Conveniently, Alps mount switches are very easy to open - they can be opened and modified while still soldered to the plate. Here you can see the plastic clips that hold the bottom of the switch to the top.

Alps Switch Clips

Opening the switch is relatively easy. Insert some form of prying tool (in this case a driver and tweezers) between the clips and the top of the switch. Wiggle the top up slightly until the clips no longer lock back into place.

Opening up the switch

Delicately remove the top of the switch from the bottom.

Removing the topcase

Note that if your switch is soldered down, one of the leaves will of course remain in place.

Switch bottom soldered to board

Typically the spring will remain attached to the slider. Remove it, and take care not to lose it.

Removing spring

Next remove the slider from the topcase.

Removing slider

Removing slider 2

Finally, remove 2nd leaf (again, this will typically stay in the topcase when it is removed).

Removing leaf from

Now we can see the dampers. Notice that they damper protrudes significantly from the bottom of the slider. This was what was causing the terrible spongey feeling when bottoming out.

Dampers

The two dampers (on either side) are easily removed with a set of tweezers.

Removing dampers

Nice and clean - no more silly damper.

Damper free

To reassemble, first insert the slider into the topcase, followed by the leaf. I would recommend placing the spring on the slider, then holding the keyboard (or switch if you haven’t soldered it down yet) upside down and carefully reattaching the topcase to the bottom (which will be attached to the board) - this will make it very easy to get the spring properly placed inside the switch.

Now I’ve got undampened linear mods, and the board feels better than ever.

Damper free switches in board


Typed on Orange Alps64

The Art of the Bodge


The secret to bodge jobs: adhesive

Thinking back to my white Alps64 build, it was a good introduction not only to custom keyboards, but to bodge jobs. Much like the British Leyland in the 1970’s, sometimes you really only need to get things to “good enough”. Sometimes in order to make something happen you’ve got to do a bodge job.

do a bodge job

The following is gonna look pretty rough, but it serves its purpose.

Alps spacebar with dowel

Unlike Cherry and MX mount boards, Alps boards only have one option for stabilizers. Alps style stabs are much like Costar. They’re crisp, but at the expense of overall…well…stability.

On original Alps boards, you had the wire stabs, snap in to latches on the plate. You also had a 2nd stabilizer, a dowel that fit into a correctly sized plunger, for lack of a better work. The wire stab succeeded in keeping the spacebar at the same vertical height, the plunger stab succeeded in keeping one side of the spacebar from twisting forward as force was applied to the other (usually right) side.

Plunger

Trouble is, modern-day Alps keycaps sets aren’t designed with this in mind. For that matter, the only stab mounts on these keycaps sets are MX mount!

When I build my Orange Alps64 I used modern-day caps, and subsequently wasn’t pleased with how the spacebar performed. Cue the music!

First I harvested the plunger from a donor board I had lying about and installed it in the Orange Alps64’s plate(pictured above). Next, I took a spacebar from that same donor board, and set about removing its dowel with the use of my flush clippers.

Dowel removed from donor spacebar

My next victim was the new spacebar. The MX-mount had to be extracted (so that it didn’t interfere with the newly installed plunger). I then took a large amount E6000 industrial adhesive (forgive me, I didn’t have epoxy handy) and bodged the plunger on and left it to cure over night.

Bodge Job 1

Bodge Job 2

It looks really rough, but conveniently like most bodge-jobs, it can’t be seen during everyday usage. The newly-bodged spacebar performs beautifully. Now I’ll just need to source a vintage plunger and Alps spacebar to harvest from when I build my Blue Alps64.


Typed on Orange Alps64

White Alps64 Round 2 Board #1

Build Log of my SKCM White Alps64.

Title Image w/ Alps64 & AEKII

When you’re writing a blog that revolves a lot around your hobby and projects, namely being a keyboard wonk, it’s probably a good idea to write up a post about your first-ever project in that hobby.

Backstory

As written in a previous post on how I came into the keyboard hobby, my very first project was a recreation of a 1995, Made in Mexico, Apple Extended Keyboard II.

Having experienced the GLORY of using the AEKII at work, I needed a board at home - soon the quest for a small board with the exact switches that I was using at work began. Here’s the rub: Alps switches like the AEKII I have at work aren’t in manufacture anymore, so it’s impossible to just go out and buy one. The only option to have a compact board with those type of switches is to make one.

Most folks who get into the hobby seem to take a path where they start with a Corsair, or a Razer, or a gaming board of some kind, then they progress to manufactured 60% boards like the Pok3r), then finally to custom boards. Because I am a weird person, and my first real exposure to mechs was Alps, I skipped a couple steps and went straight to custom boards.

Sourcing The Parts

Unlike the Orange Alps64, and my soon-to-be-built Blue Alps64, when I started this adventure, there was no handy person running an all-inclusive group buy with every part a guy would need to build an Alps board. Like many projects and passions in life, this build started with research.

Parts required for a board:

  • Switches
  • Electronics
  • Plate
  • Keycaps
  • Case

I learned that the white Alps switch in my AEKII were not unique to that board - arguably the white Alps is the most common type of Alps switch - so I had that going for me. Done!

Obviously Alps aren’t in manufacture anymore, so I’d need a donor board for switches; a vintage board that I could desolder switches from. Done!

Donor board

There weren’t any PCBs around for Alps, only Cherry. There had been a few 60% sized Alps-mount PCBs in the past (Duck, Infinity), but those were hard to come by. I’d probably have to hand-wire the board. The idea of hand-wiring something like this was daunting at the time. Mind you, I still haven’t done a hand-wired board, but I will at some point. Done!

At the time I started, there weren’t any 60% Alps compatible plates around, but I figured I could Dremel down the plate from the donor board. Done!

Given that this was going to be a 60% recreation of an AEKII, the natural donor for such keycaps would be an AEKII. Done!

Gratefully, cases for 60% boards are pretty easy to come by. Basic plastic or acrylic ones are readily available, and nice milled aluminum ones are intermittently available through retailers or through group buys. Done!

At this point I only had ideas of where and how I was going to put things together. The most daunting task was going to be the electronics. Hand-wiring a board seemed very scary. It was going to be a tricky proposition to have all that custom wiring done by an idiot that barely knew his way around a solder iron.

Conveniently for me, as my research was hotting up, I stumbled across Hasu’s 60% Alps64 PCB. Hasu is well-known in the keyboard community as the creator of the TMK firmware - far and away the most popular custom keyboard firmware in use. At the time there had only been a small ~10 person proof-of-concept group buy for his rev 1 pcb. Initial feedback had been positive, and I just happened to be at the right place at the right time. Hasu began a 2nd round group buy for Alps64, and I was able to get in on it. Luckily for me and my lack of manufacturing skills, Nubbinator came up with a group buy at the same time for laser-cut plates to fit Hasu’s PCB. The prospect of using a Dremel and cutting off one of my fingers would have to wait.

Be mindful, condensing this build and sourcing parts down to a few paragraphs makes it sound like this first custom board build came together in a matter of days. When one is getting into building a board exactly the way you want it, you can’t exactly go out and buy all the parts from a single place on a single day. The keyboard community is pretty sizable, but a lot of these parts aren’t available on a regular basis. The only way to put all these parts together is either through trolling the MechMarket, eBay, getting in on Group Buys, or maybe, maybe getting some parts from a retailer. From beginning research to fully assembled and completed board was from February to September 2015.

Time To Build

All the research done, months of slowly acquiring parts. Here’s the final tally of what all is in this board:

  • AEKII donor board
    • Keycaps
    • Stabilizers
    • Lock switch
  • AEKI donor board
    • Lock switch (yup, I bought an entire board for one hard-to-find switch)
  • Loose harvested white Alps switches
  • Hasu’s Alps64 round 2 PCB
  • Tex CNC Aluminum 60% keyboard cases

Assembly begins:

Just like my Orange Alps64, this round 2 board first required diodes to be soldered.

Prepping the PCB

Next came the plate and switch installation.

Installing Switches in the plate

Secret: I initially started with Matias click switches, which are a modern-day Alps clone. Thing about Matias clicks is that they’re a recreation of Alps’ later simplified (SKBM) switch design, as opposed to the complicated (SKCM) switches I was used to in my AEKII at work. I used the Matias for a few weeks, then later acquired some SKCM white Alps to replace them.

Mostly assembled board, performing testing

The board currently uses white Alps except for the Capslock position, and the RGUI position (programmed as a Function layer lock on this board).

The downside of this custom keyboard business: there’s a whole lot of hurry-up-and-wait. The wait wasn’t all bad, however. It gave me plenty of time to fix my initial mistakes with assembly, and to program the board. I won’t deny it, most of my mistakes were made when I switched from the Matias to the genuine Alps switches. At the time this was my first solder work, so I made the grievous error of ruining a few solder pads during removal. I was able to MacGyver it together and get the PCB fully functional again, though.

Bodge job

It was a significant change from the Apple Aluminum Keyboard I’d been using. For a good long while I had the board assembled, but was still waiting on the aluminum case to arrive.

Assembled but missing the case

Comparison to Apple aluminum

Programming

The layout on this board is not all that dissimilar from my Orange Alps64. The differences are in the bottom row: there is one fewer left-hand modifier key, and the normal RGUI position has a lock switch installed, and is configured as a function lock. Initially I was only using function lock to access my function layer - it was only later that I discovered and implemented SpaceFN. In hindsight, with the use of SpaceFN a locking function switch isn’t necessary.

#include "keymap_common.h"

/*
 * Hasu
 */
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: DEFAULT LAYER
 * ,-----------------------------------------------------------.
 * |Esc  |  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  #|Bsp|
 * |-----------------------------------------------------------|
 * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|DEL  |
 * |-----------------------------------------------------------|
 * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
 * |-----------------------------------------------------------|
 * |Shft|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Esc|
 * |-----------------------------------------------------------'
 * |Ctrl|ALT |GUI |      Space/FN1        |FN2  |GUI |FN3/Ctrl |
 * `-----------------------------------------------------------'
 */
[0] =KEYMAP_AEK( \
    ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC, \
    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,DEL, \
    LCAP,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,  \
    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,RSFT, \
    LCTL,LALT,LGUI,          FN1,                     FN2, LGUI,FN3),

  /* 0: MORGAN LAYER
  * ,-----------------------------------------------------------.
  * |GRV  |MUTE|VOLD|VOLU|MPRV|MPLY|MNXT| 7| 8| 9| 0| -| =/#|Bsp|
  * |-----------------------------------------------------------|
  * |Tab  |  Q| UP|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \  |
  * |-----------------------------------------------------------|
  * |Caps  |LEFT|DOWN|RIGHT|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
  * |-----------------------------------------------------------|
  * |Shft|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Esc|
  * |-----------------------------------------------------------'
  * |Ctrl|Gui |Alt |         Space              |FN2 |GUI |Ctrl |
  * `-----------------------------------------------------------'
  */
 [1] =KEYMAP_AEK( \
     GRV,MUTE,VOLD,VOLU,MPRV,MPLY,MNXT,   7,   8,   9,   0,   MINS,PPLS, BSPC, \
     TAB, Q,  UP,   E,HOME,   T,   Y,   4,   5,   6,PAST,   LBRC,RBRC,BSLS, \
     TRNS,LEFT,DOWN,RIGHT, END,   G,   H,   1,   2,   3,  PSLS,  QUOT,  ENT,  \
     LSFT,Z,   X,   C,   V,   B,   N, F13,   COMM,DOT, SLSH,RSFT, \
     LCTL,TRNS,TRNS,          TRNS,                     TRNS,TRNS,TRNS),

  /* 0: DEFAULT LAYER
   * ,-----------------------------------------------------------.
   * |Esc  |  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  #|Bsp|
   * |-----------------------------------------------------------|
   * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|DEL  |
   * |-----------------------------------------------------------|
   * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
   * |-----------------------------------------------------------|
   * |Shft|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Esc|
   * |-----------------------------------------------------------'
   * |Ctrl|ALT |GUI |      Space/FN1         |FN2 |FN3/GUI |Ctrl |
   * `-----------------------------------------------------------'
   */
  [2] =KEYMAP_AEK( \
   ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC, \
   TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,DEL, \
   TRNS,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,  \
   LSFT,Z,   X,   FN4,   V,   B,   N,   M,   COMM,DOT, SLSH,RSFT, \
   LCTL,LALT,LGUI,          TRNS,                     TRNS,TRNS,TRNS),

};


/* id for user defined function/macro */
enum function_id {
    NONE,
};

enum macro_id {
    COPY_TAB_PASTE,
};


/*
 * Fn action definition
 */
const uint16_t PROGMEM fn_actions[] = {
    [0]  = ACTION_LAYER_MOMENTARY(1),                  // Default
    [1]  = ACTION_LAYER_TAP_KEY(1, KC_SPC),            // MORGAN LAYER
    [2]  = ACTION_LAYER_MOMENTARY(1),
    [3]  = ACTION_LAYER_MOMENTARY(2),                  // CMD Layer
    [4]  = ACTION_MACRO(COPY_TAB_PASTE),               // Copy tab paste in browser
};


/*
 * Macro definition
 */
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    switch (id) {
        case COPY_TAB_PASTE:
            return (record->event.pressed ?
                    MACRO( D(LGUI), T(C), T(T), T(V), U(LGUI), T(ENT), END ) :
                    MACRO( END ) );
    }
    return MACRO_NONE;
}

Final Assembly

After months of waiting, my Aluminum case arrived, so I finally go around to cleaning up the donor AEKII keycaps.

Assembled with case

Side view assembled

Front View Assembled

Top view Assembled

I really am in love with this board. After being in this hobby for a year now, I have quite a few boards, but this one remains my favorite, and my daily-driver at home.

Complete

Complte

Complete

The mission was to create a smaller version of the exact same board I use at work - and I’ve succeeded. I won’t dare to call it my endgame keyboard, since there is no endgame keyboard - but it’s pretty damn close.

Comparison to the AEKII


Typed on White Alps64

It's All About Precedent


FBI director James Comey:

The San Bernardino litigation isn’t about trying to set a precedent or send any kind of message. It is about the victims and justice.

[via Lawfare]

This whole fight isn’t about precedent at all he says. It’s about justice…you know…for the families and stuff.

Look, we know, they know – this is all about setting precedent. The proof is in the pudding:

The U.S. Justice Department is looking at court orders forcing Apple Inc to help investigators extract data from iPhones in about a dozen undisclosed cases across the country, the Wall Street Journal reported, citing sources.

[via Reuters]

One phone…a dozen phones. Counting is hard.


Typed on AEKII