Moving Day


I’ve moved many times in my life. Perhaps a dozen total, five or six in my adult life. Moves have always been predicated by major life changes such as a new job, or a decision to go to college, or moving closer to an existing job to eliminate a commute. The move I made today was for a new reason: to start a life with someone.

I suppose it wouldn’t exactly be proper to call this moving day, a more apt description would be that this is the day my move ends. My girlfriend and I have been together for nearly a year now. She makes me the happiest I’ve ever been, and she makes me a better man. There has definitely been a strain though, with us living an hour and a half apart. We’re rectifying the situation by moving in together. I’ve moved from my apartment in the town where I work to a house we’ll share - it’s just a short 15 minute drive from my work. She will be making the larger sacrifice, leaving her apartment and more importantly her job to come live in this rental house with me. It’s a big change for both of us, but we’re both incredibly excited.

The beauty of moving such a short distance is that one can take time with a move. I’ve spent the past week making a single run every night to the new house, my car crammed to the gills with stuff. This method allowed me to take my sweet time and move slowly. It also saved from having to rent a significantly larger UHaul. Save for my couch, mattress, and a few other odds and ends, I was able to move everything in only my Kia Soul - or as I call it: the hamstermobile. It’s amazing what you can fit in a tiny car if you take all the seats out and put your mind to it.

Today was UHaul day - the day my mattress made the move from the apartment to the house. Other than cleaning supplies, the old apartment is cleared out. I’ll still need to finish cleaning it up, but I’ve got until the 30th to finish. From today I will be living in our new home. This will the first time I’ve lived in a detached house since high school, and I love it. It’s just a rental, and by no means our dream house but it’s a lovely place to start the rest of my life with her.

She still has another week left at her job, so she won’t be moving down for another week. The largest benefit of this is logistics. It’s difficult enough to try to manage two moves in a short span of time, much less in a single day or weekend. By staggering our moves a week apart it gives me time to get my belongings unpacked here at the house, and gives us two full weekends (this one and next) to get the move completed. When it comes to moving my girlfriend here, we’ll be moving all her belongings in one shot - but that’s a decision predicated by her 1.5 hour driving distance to the new house.

Hodgepodge of stuff in the new house

It’s good to get moved in to the house. I’m glad my move is basically over. There’s still the stresses of getting all her things here, and figuring out how you combine two households of things into one, but it’s desperately exciting. For the first time, I’m legitimately very very excited for a move - not for the fact that I’m moving, but because I’m starting a life with the woman I love.

Typed on MBP

Hot Keys Project Warmaster

Hot Keys Project had a sale last month for Easter themed keycaps. I picked up this Warmaster in anticipation for my Satan GH60 build.

I’m not 100% certain I’ll end up using this on that board full time. I think I’m happier with how my Entling looks. Either way, the HKP keycap is pretty rad. I’ll find a home somewhere for it.

Typed on AEKII

Pleased to meet you. Hope you guess my name.

Satan GH60 Build Log

RGB Underglow

The impetus for this build was the availability of the GH60 PCB on Techkeys’ site. A 60% PCB designed designed by community members on Geekhack. At the time, a few months ago, I already had enough spare MX mount board parts on hand to nearly complete a board, I was just missing a PCB. Mind you, I didn’t have any great intention to build a 60% MX mount board, I’d just been accumulating random parts over the months.

The Rev C GH60 on Techkeys was soon dismissed when I discovered the Satan GH60 PCB - an asian made PCB available on eBay. The GH60 moniker on the Satan is just a marketing ruse, it bears no relationship to the true GH60 other than its form factor. The Satan’s advantages over the mostly-unavailable true GH60 are clear:

  • It is readily available and in stock.
  • It has an extant and well commented firmware available.
  • It has modern features such as LED support.

The big selling factor for me was the LED support. I’m not a fan of LED backlighting, especially RGB LED backlighting, but I am a big fan of RGB underglow - as popularized by Gon and Winkeyless. What had began as a “fuck it, I’ve already got most of the parts” build became a build I actually cared about after I noticed a0-c’s build on r/MK.

An eBay purchase and a 2 week wait for shipping via concrete rowboat from China later, and I had the PCB on hand and was ready to build.

The Parts

  • Satan GH60 PCB
  • Tex Acrylic 60% Case
  • PCB Mount Stabs
  • Vintage Cherry MX Black switches (alphas)
  • Gateron Reds (mods)
  • WS2812b RGB LED strip
  • Universal MX Mount plate (painted white)
  • GeekKeys Rainbow PBT Keycaps

The Build

The Satan PCB is cheap in both senses of the word. The board is very inexpensive, at only $35, but there are compromises. Sure the PCB is full featured, but it’s cheaply made, with low quality through hole mounts, and the PCB itself was noticeably warped. I wasn’t desperately concerned with the warping though, I figured once the switches were in the plate and soldered in, and once the PCB was mounted to the case any warp would be worked out.

First came the PCB-mount stabilizers. Wires were lubed with Finish Line Extreme Flouro) teflon lube.

Installation of the switches was largely uneventful. While I’m typically a fan of tactile switches - namely Zealios when dealing in MX mount boards, I opted for Cherry MX blacks as the primary switch for this build.

I had plenty of desoldered blacks on hand from my Data911 modifications, and didn’t feel like making a big investment on this board. Note: I’m actually really pleased with the feel of blacks. I’ve shied away from reds as a primary switch on other builds as I feel it’s too light, and I haven’t cared for their linear feel on alphas. With their slightly higher 50g weight, blacks feel lovely to type on, albeit not tactile of course.

I did deploy reds on a few of the modifier keys. I prefer a lighter linear feel on mods. In hindsight, I don’t like a linear for the enter key, I may later change that to a Zealio.

Adventures in Stupidity

With the plate installed and the switches soldered, next came the exciting part of the build: installing the LED strip. Per a0-c’s build, I opted for a WS2812b strip. The WS2812b is a great strip. It supports RGB lighting and is programmable. The calculations to drive the LED’s color arrangement are light enough that they can be calculated on-the-fly by the board’s controller - obviating any need to program the colors directly in the firmware.

The Satan has breakouts for power, and the power leads can be ran to any of the 5V and ground points in the sequence (shown above).

A data line must also be ran to the first LED in the sequence. The strip is designed such that only one data connection is required. The firmware will be programmed with the number of LEDs in the sequence, and the single data connection will send controls down the line of the strip controlling the desired number of LEDs.

The Satan does not have breakouts for data, specifically, so it’s necessary to wire data directly to an unused pin on the controller - a delicate operation, as I soon learned.

In a0-c’s build, data was connected to the E2 pin - located on the top right hand side of the controller. E2 is a data register and data port pin, but it is not used by the Satan to control the columns or rows of the key matrix.

Here’s where the stupidity begins: I chose solid-core cable for the power (they were easily accessible and I had them on hand), but I made the error of choosing the same type of cable to wire to the E2 pin. In hindsight I should not have used such a thick gauge wire for this connection. After I finished soldering the lead to E2 I promptly broke the pin entirely off the controller as soon as I went to move the wire.


With E2 broken off, I would need to find another unused data register pin on the data port, and I would would need to move to a smaller gauge stranded wire. First I consulted the config.h file of the uncompiled firmware.

#define COLS (int []){ F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 }
#define ROWS (int []){ D0, D1, D2, D3, D5 }

These are the pins on the Atmel controller that the board uses to control the columns and rows of the key matrix. I’d have to use one of the spare pins. For reference, the controller on this board is about 1/4th the size of a postage stamp - there isn’t exactly room on the PCB to label all 44 pins. I would also need to consult the datasheet for the controller to see which pins were which.

Consulting the sheet, I determined E6 to be my best option. Like E2 it is on a corner, so it would be easily accessible, and wasn’t used. I made my solder connection, edited the config.h file to point it to the new pin.

/* ws2812 RGB LED */
#define ws2812_PORTREG  PORTE
#define ws2812_DDRREG   DDRE
#define ws2812_pin PE6

I then compiled the firmware and uploaded it to the board. All would be well in the world.

Adventures in Stupidity 2.0

Firmware was uploaded, LED wires and pins were soldered, I was feeling confident. I plugged the board in, lo and behold the LEDs did not work. Add to that, I suddenly had an entire column (1, Q, A, Z, ⌥) that were showing as being depressed. Not that they weren’t working, the board thought all were being held down.

So as it turns out, I’m an idiot who can’t read.

#define COLS (int []){ F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 }

E6 turned out not to be unused, it turns out to be the third damn column. No wonder that entire column was being depressed, I was completing the entire circuit by connecting the data from the LED strip to the pin!

So I desoldered the wire from E6 and started over…oh wait, except now the 1, Q, A, Z, ⌥ wasn’t working at all! I was pretty sure I’d totally borked the controller by constantly hitting the pins on it with my iron as I stumbled my way through idiocy. Fortunately as I took a closer look at the board, I found that when I removed the wire from E6 I’d pulled up the pin slightly. I hit E6 with a tiny bit of solder and had it working again.

After consulting config.h and the Atmel data sheet once more, I was found that F7 wasn’t being used. F7 isn’t ideal, it’s the 3rd pin in from the right on the top part of the controller. I figured I’d janked the board up enough at this point that it was worth a shot.

The results aren’t pretty. On the right you can see the ripped-off E2 pin, on the left, the E6 that I janked, and up top F7. Another config edit, compile, and reflash of the board, and I was ready to see if this worked.


Adventures in Stupidity 2.5

What the hell?! Why wasn’t it working?! The board was typing keys, nothing was held down, nothing was smoking, why the hell wouldn’t the damn LEDs light up?

Turns out my friends, that when you edit firmware, you must edit correctly.

I’d remembered to change the LED to pin F7, but forgot to tell the board to send controls to the memory and port registers for the F pin drivers. Oops!

Once more I edited the config file, compiled, and reflashed.


Working LED Strip

I FINALLY had working LEDs! After spending an hour and a half playing with firmware and wires, and consulting the damn data sheet I was victorious! I was embarrassed, but victorious.

The Code

My keymap differs quite a bit from a0-c’s, but remains similar to other boards I’ve built. I’ve set up the base layer for a Mac, with a single function layer for other functions, and moved the locations of the LED control keys on the backlight control layer to the number keys. There are LED controls for toggling between modes, adjusting hue, saturation, and brightness.

#include "satan.h"

#define _BM 0
#define _FL 1
#define _MV 2

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* Keymap _BM: (Base Mac) Mac Default Layer
   * ,-----------------------------------------------------------.
   * |Esc~| 1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backsp |
   * |-----------------------------------------------------------|
   * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|
   * |-----------------------------------------------------------|
   * |CAPS   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return |
   * |-----------------------------------------------------------|
   * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift     |
   * |-----------------------------------------------------------|
   * |Ctrl|Alt |Gui |      Space/_FL         |Gui |Alt | _FL|_MV |
   * `-----------------------------------------------------------'
  F(0),    KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,  KC_EQL,   KC_DEL, \
  KC_TAB,  KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC,  KC_RBRC,  KC_BSPC, \
  KC_CAPS, KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT,            KC_ENT,  \
  KC_LSFT,         KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,            KC_RSFT, \
  KC_LCTL, KC_LALT,KC_LGUI,          F(11),                                       KC_RGUI, KC_RALT,  KC_RCTL,  F(9)),
  /* Keymap _FL: Function Layer
  * ,-----------------------------------------------------------.
  * |GRV  |MUTE|VOLD|VOLU|MPRV|MPLY|MNXT| 7| 8| 9| 0| -| +  |Bsp|
  * |-----------------------------------------------------------|
  * |Tab  |   | UP|   |HOME|   |   |  4|  5|  6|  P|  *|  ]|  \ |
  * |-----------------------------------------------------------|
  * |Caps |LEFT|DOWN|RIGHT|END|   |  1|  2|  3|  L|  /|  '|Enter|
  * |-----------------------------------------------------------|
  * |Shft    |    |   |   |   |   |   |  0|  ,|  .|  /|Shift    |
  * |-----------------------------------------------------------'
  * |Ctrl|Gui |Alt |         Space         |Gui |Alt |GUI |F13  |
  * `-----------------------------------------------------------'
  KC_LCTL, KC_TRNS, KC_TRNS,          KC_TRNS,                           KC_TRNS, KC_RALT,KC_TRNS, KC_F13),
  /* Keymap _MV Backlight Control Layer
   * ,-----------------------------------------------------------.
   * |   | F1| F2 | F3 |F4 | F5| F6| F7| F8|  |   |   |   |      |
   * |-----------------------------------------------------------|
   * |   |BL- |BL+ |BL(T) |   |   |   |   |   |   |   |   |   |  |
   * |-----------------------------------------------------------|
   * |      |   |   |   |   |   |   |   |   |   |   |   |        |
   * |-----------------------------------------------------------|
   * |        |   |   |   |   |   |   |   |   |   |   |          |
   * |-----------------------------------------------------------|
   * |    |    |    |         KC_TRNS        |    |    |F(10)|   |
   * `-----------------------------------------------------------'
  KC_NO,  F(1),   F(2),   F(3),   F(4),   F(5),   F(6),   F(7),   F(8),  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO, \
  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO, KC_NO,  KC_NO,          KC_NO, \
  KC_NO,          KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO, KC_NO,  KC_NO,          KC_NO, \
  KC_NO,  KC_NO,  KC_NO,         KC_TRNS,                                        KC_NO,  KC_NO,  F(10),  KC_NO),


enum function_id {

const uint16_t PROGMEM fn_actions[] = {


a0-c’s firmware is available here.

My version of config.h is here, and my keymap is here


To finish the board off, I installed blank rainbow PBT keycaps from Geekkeys, and a Zorbcaps Chilly Entling on Esc.

RGB Underglow

Despite my struggles with getting the LED strip functioning, I’m very happy with this board. It started off as a throw some shit together that I have lying around board into one I love and am very proud of. I typically fall back to one of my Alps boards fairly quickly, but this has remained my daily driver for some weeks now. I’ll definitely be pursuing future projects with LED underglow on future boards.

Typed on Satan GH60

I'm Blue Da Ba Dee Da Ba Die...

Blue Alps Build (Video Log)

Back in December I wrote about my search for a blue alps donor board
Blue Alps64 for another 60% alps-mount board I was planning on building. This will be my third board based on Hasu’s Alps64 PCB, and second built from Bluenalgene’s Alps Party group buy on Geekhack.

The other two builds were exercises in learning about the custom-keyboard world, and in sourcing parts. This build was far more ambitious. I wasn’t simply accumulating and assembling parts - I got far more involved than that. This was definitely my most rewarding build yet. Six or seven months of preparations and acquiring parts culminated in a marathon 12 hour build session.

I’ve never before built a board in a single day, much less a sitting. I’ve always broken the build up into a couple sessions over a few days. This was an exhausting marathon, but I’m incredibly pleased with how it turned out.

The Parts

The Plate

I had originally bought a Infinity layout plate for this buy, but later changed my mind and decided a HHKB layout plate would be better for this build. After much searching I was able to source a plate from another user on Geekhack. This being a blue themed build, the only sensible option was to paint the bare steel blue.

I’ve never dealt in painting anything before, much less something I want to look beautiful, but I made my best effort anyway.

First was primer (sanded).

Followed by three or four coats of color, with intermittent sanding in between coats.

Finished with a clear coat enamel.

Getting the plate powder coated would have been a better option than spray paint perhaps, but out here in the middle-of-nowhere Iowa finding a good business to do so would prove difficult. There were certain difficulties with painting the plate, as I live in an apartment. With no garage or workshop to paint in, I was relegated to painting in a cardboard box outside, and praying the elements or dust didn’t muck up the paint. In my opinion the plate looks great.

The Lube

This build was also my first time endeavoring to lubricate my switches. Blue alps are known for being the smoothest and best feeling of alps-mount switches, and the ones from my donor board were very nice. Still, given their age and apparent dirtiness (what can one expect after 20+ years) I felt lubing them would only improve the feel.

I initially tried a thin linear krytox lube. Krytox is very popular in the community, and is regarded by many as the best option for lubing switches. I chose the thin lube to try to provide only a small amount of lubrication. I was disappointed to discover that krytox, applied even very sparingly removed the lovely click from the blue switches and completely modified the feel.

I ended up opting for DuPont Silicone Teflon lubricant - per this guide. Each donor switch was disassembled and had a light amount of lube applied to the slider(on the sides), the top housing (where it meets with the slider sides), and spring. The difference between the unmodified and lubricated switch is subtle, but very pleasant. The tactile feel remains, but actuation is smoother. The click is perhaps a bit subdued and lowered, and spring ping is almost entirely eliminated. I quite like it.

I also chose (per Ripster’s recommendation & lube guide) Finish Line Teflon grease for lubricating the stabilizers. I haven’t felt a need to lubricate my cherry boards nor my White Alps board
White Alps64 (which uses entirely vintage stab clips and wires), but I did notice the mishmash of modern and vintage clips and wires in my Orange Alps
Orange Alps64 build weren’t smooth. This is the downside of adapting old boards and layouts into different layouts - one is forced to mix vintage and modern stab components. The Finish Line lube does a fantastic job of keeping the stabilizers smooth and feeling great.

The Keycaps

Alpine Winter [Source]

Keycaps for this board are from njabair’s Alpine Winter group buy. They are doubleshot thick ABS alps-mount DCS profile caps from Signature Plastics. As far as I’m aware they are the only community designed alps keycap set to have been made. Alpine Winter supports most 60% layouts all in a single set. It’s gorgeous, and it was brilliantly timed to accompany Alps Party 3 and Monarch. The initial run wasn’t without its problems - due to a manufacturing error by Signature Plastics many caps have mismatched heights. SP is opting to rerun the entire set at no extra charge to rectify the error. Also, the flashing on the stems has been found to be slightly too large (what can be expected from 20+ year old tooling), but this is easily remedied with an Xacto knife.

I’ve never used DCS profile before, but it is fast becoming my new favorite profile. Unlike OEM, Cherry, and AEK, rows 3 and 4 are sculpted and arch back up. The sculpt is gorgeous and feels great. I’m incredibly pleased with this keycap set.

DCS Profile

After the first fitting:

The Code

Code for this board is mighty similar to my other builds. It uses the basic ANSI layout I have for my Orange build
Orange Alps64, with changes for the bottom row, the function toggle, and backspace/delete positioning.

#include "keymap_common.h"

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

  * ,-----------------------------------------------------------.
  * |-----------------------------------------------------------|
  * |Tab  |  Q| UP|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|DEL  |
  * |-----------------------------------------------------------|
  * |Caps|LEFT|DOWN|RIGHT|  F|  G|  H|  J|  K|  L|  ;|  '|Enter |
  * |-----------------------------------------------------------|
  * |Shft| \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |TRNS|
  * |-----------------------------------------------------------'
  * |    |TRNS |TRNS |         Space         |TRNS |TRNS|  |    |
  * `-----------------------------------------------------------'

 * 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_TOGGLE(1),
    [3]  = ACTION_LAYER_MOMENTARY(2),                  // CMD Layer
    [4]  = ACTION_MACRO(COPY_TAB_PASTE),               // Copy tab paste in browser

The Result

The blue theme really came together with this build. It’s blue on blue on blue on blue. The board looks absolutely gorgeous, the switches feel fantastic. With this build I pushed my abilities and built a board I love. This board is fast becoming my favorite, and is a contender to be my new daily driver.

Typed on Blue Alps64

Apple Building Their Own Servers?

At least part of the driver for this is to ensure that the servers are secure. Apple has long suspected that servers it ordered from the traditional supply chain were intercepted during shipping, with additional chips and firmware added to them by unknown third parties in order to make them vulnerable to infiltration, according to a person familiar with the matter. At one point, Apple even assigned people to take photographs of motherboards and annotate the function of each chip, explaining why it was supposed to be there. Building its own servers with motherboards it designed would be the most surefire way for Apple to prevent unauthorized snooping via extra chips.


So Xserve 2.0? They should sell them too. As much as Apple is growing in enterprise there’s bound to be interest in Apple server hardware, especially under Tim Cook’s security focused Apple.

Typed on Octopage