<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[FlatFootFox]]></title><description><![CDATA[Tech Reviews, DIY Projects, and Longform Write-Ups]]></description><link>https://flatfootfox.com/</link><image><url>https://flatfootfox.com/favicon.png</url><title>FlatFootFox</title><link>https://flatfootfox.com/</link></image><generator>Ghost 5.24</generator><lastBuildDate>Thu, 16 Apr 2026 07:28:48 GMT</lastBuildDate><atom:link href="https://flatfootfox.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[The RevXL Keyboard]]></title><description><![CDATA[The RevXL is a maximalist Reviung-inspired ergonomic keyboard with per-key RGB LEDs, an OLED display, a rotary encoder, and a breakaway arrow cluster.]]></description><link>https://flatfootfox.com/the-revxl-keyboard/</link><guid isPermaLink="false">6787d1d5de06ab68d0f89842</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sat, 15 Feb 2025 20:23:39 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2025/02/RevXL-Hero.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2025/02/RevXL-Hero.jpg" alt="The RevXL Keyboard"><p>The RevXL is a maximalist <a href="https://github.com/gtips/reviung">Reviung</a>-inspired ergonomic keyboard with per-key RGB LEDs, an OLED display, a rotary encoder, and a breakaway arrow cluster. It&#x2019;s powered by a wired RP2040 microcontroller with QMK and Vial handling things on the firmware side. At its core, the RevXL is designed to be an on ramp to the ergonomic mechanical keyboard space. It shows off the scene&#x2019;s most catchy bells and whistles while still providing a few creature comforts of more traditional layouts.</p><p>This design is a bit of a throwback for me. My journey into this strange world of ergonomic mechanical keyboards started with building a kit of the oft-praised <a href="https://flatfootfox.com/a-review-of-the-sofle-choc/">Sofle Choc</a>. It&apos;s a split keyboard which features RGB LEDs, an OLED Display, and a pair of rotary encoders. Noticing some similarities here? Once I was ready to start making designs of my own, I leapt straight into the world of wireless <a href="https://zmk.dev">ZMK</a>-powered keyboards with the <a href="https://flatfootfox.com/the-chonkv-keyboard/">ChonkV</a> and the <a href="https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/">Type Boy</a>. As much as the flashy lights and enticing knobs drove me to the Sofle, I never actually learned how to build a wired keyboard with RGB LEDs. This keyboard is a chance to backfill some of those PCB design skills I skipped over while taking the Reviung layout for a spin.</p><!--kg-card-begin: html--><div class="PCBWay" style="background: var(--color-table-background);; border-radius: 16px; padding: 12px 32px 1px 32px;"><!--kg-card-end: html--><h2 id="sponsored-by-pcbway">Sponsored By PCBWay</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2025/01/PCBway.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1690" height="511" srcset="https://flatfootfox.com/content/images/size/w600/2025/01/PCBway.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/01/PCBway.png 1000w, https://flatfootfox.com/content/images/size/w1600/2025/01/PCBway.png 1600w, https://flatfootfox.com/content/images/2025/01/PCBway.png 1690w" sizes="(min-width: 720px) 720px"></figure><p>Speaking of PCB design, this project is sponsored by <a href="https://www.pcbway.com">PCBWay</a>. They&apos;re the internet&apos;s premier PCB fabricator and are a one-stop-shop for all your prototyping needs. They offer PCB fabrication services, 3D printing with a variety of materials, and even PCBA assembly services for those of you who prefer not to solder their own projects. If it can be represented as a design file, you can probably upload it to <a href="https://www.pcbway.com">PCBWay</a> and receive it a few days later in the mail.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Bubble.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1672" height="941" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Bubble.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Bubble.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Bubble.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Bubble.jpg 1672w" sizes="(min-width: 720px) 720px"><figcaption>Thanks PCBWay!</figcaption></figure><p>PCBWay did a great job manufacturing the RevXL PCB. The order shipped quickly, and all of the PCBs arrived safe and sound inside of a well packed box and vacuum sealed bubbled wrap. My thanks to <a href="https://www.pcbway.com">PCBWay</a> for helping to make this keyboard a reality.</p><!--kg-card-begin: html--></div><!--kg-card-end: html--><h2 id="the-revxl-layout">The RevXL Layout</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Layout.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="2000" height="630" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Layout.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Layout.png 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Layout.png 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Layout.png 2338w" sizes="(min-width: 720px) 720px"><figcaption>The RevXL wears its influences on its sleeve. And chin. And breakaway arrow cluster.</figcaption></figure><p>This keyboard is a very longwinded answer to the question, &quot;Wait, those low profile keyboards of yours have clicky switches too?&quot; That&apos;s right, the RevXL design is technically a <a href="https://simpsonswiki.com/wiki/The_Homer">Homer</a>. After seeing me build a set of <a href="https://flatfootfox.com/the-typeboy-mk-ii/">increasingly</a> <a href="https://flatfootfox.com/65-crimes-a-ch559l-fak-keyboard/">elaborate</a> keyboards, my husband finally got low profile mechanical keyboard curious. His initial design ask had three parts: Clicky Choc switches, per-key RGB LEDs, and the layout had to have an arrow cluster that wasn&apos;t buried on a secondary layer.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/image.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1200" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/image.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/image.png 1000w, https://flatfootfox.com/content/images/2025/02/image.png 1200w" sizes="(min-width: 720px) 720px"><figcaption>Close but no cigar Cepstrum.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>As much as I like designing keyboards from scratch, Keeb.io&apos;s <a href="https://keeb.io/products/cepstrum-keyboard-pre-built">Cepstrum</a> sounded like a solid fit for these design priorities. It&apos;s a split row-staggered 65% keyboard with low profile switches and per-key RGB LEDs. Unfortunately, Choc v1 switches are still relatively niche in the custom keyboard building space. There are more keycap options now than their used to be, but there are literally <em>no</em> shine-through options for the larger row-staggered keys. Your <code>1.75u</code> Caps Lock, <code>2.25u</code> Enter, and <code>2.75u</code> Shift all have to go without any labels on the keys. Keeb.io&apos;s made the best of this situation by providing some near-matching blank keycaps for these modifiers, but it&apos;s a less than ideal situation aesthetically speaking.</p><p>That left us in a bit of a lurch. The obvious next steps were to either ditch the row-staggered layout, or look beyond the Choc v1 switches into the world of MX-stemmed keycaps.</p><p><a href="https://fkcaps.com/custom?a=FlatFootFox">FK Customs</a> does offer low profile shine-through keycaps in the form of their new LPF profile keycaps. Paired with some Choc v2&apos;s and we&apos;d be all set to go. I&apos;d also just be making another 65% keyboard at that point however. Having just come off of the <a href="https://flatfootfox.com/65-crimes-a-ch559l-fak-keyboard/">65 Crimes</a> build, I was hoping to do something a little different. I had to broach the ergonomic question.</p><p>&quot;Just how weird can I get with this layout?&quot;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/EwVgVIbVgAESmEK-1.jpeg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1006" height="1083" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/EwVgVIbVgAESmEK-1.jpeg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/EwVgVIbVgAESmEK-1.jpeg 1000w, https://flatfootfox.com/content/images/2025/02/EwVgVIbVgAESmEK-1.jpeg 1006w" sizes="(min-width: 720px) 720px"><figcaption>With apologies to <a href="https://x.com/s_k_hanselmann/status/1370607580620353536">Simon Hanselmann</a>.</figcaption></figure><p>I&apos;ve been happily typing along on unusual bespoke ergonomic mechanical keyboards for the last two years. When you get into a niche hobby like this, you have to be weary that you don&apos;t delve too far off the deep end and become a <em>weird keyboard pusher</em>. I was all ready to accept that going beyond row stagger would be a red line for this build. To my surprise, after spending a day experimenting with my old Sofle, my husband decided to give an ergonomic layout a try. The previous ask for some dedicated arrow keys remained however. With those updated parameters in place, I got to work creating a potential layout.</p><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/revxlp.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1024" height="768" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/revxlp.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/revxlp.jpg 1000w, https://flatfootfox.com/content/images/2025/02/revxlp.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>Imitation is the sincerest form of flattery, right Pete?</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>I decided to use the Reviung layout as the basis of my inspiration for this build. I&apos;ve always liked the striking look of Reviung keyboards, and the unibody layout would make the logistics of dealing with the RGB LEDs a bit simpler. I was already tackling some new technologies in this build. Omitting the dual microcontrollers, reversible footprints, and TRRS cable would help manage the scope of this project.</p><p>Reviung variants have featured a variety of thumb key configurations over the years. I&apos;m particularly fond of Pete Johanson&apos;s <a href="https://gitlab.com/lpgalaxy/revxlp">revxlp</a>&apos;s split spacebar design, so I shamelessly copied that for the RevXL. I&apos;m still a sucker for dedicated number keys, and this design is supposed to be for a beginner friendly keyboard anyways, so I added a number row onto the basic Reviung41 layout.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/Rev57LP.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="2000" height="1334" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/Rev57LP.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/Rev57LP.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/Rev57LP.jpg 1600w, https://flatfootfox.com/content/images/size/w2400/2025/02/Rev57LP.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>I&apos;ve come <em>this</em> close to purchasing a Rev57LP in the past.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>At this point I&apos;m awfully close to 42Keebs&apos; <a href="https://42keebs.eu/shop/kits/pro-micro-based/rev57lp-50-low-profile-hotswap-ergo-kit/">Rev57LP</a> design. They&apos;ve even added RGB LEDs to the latest revision of this keyboard. If you&apos;re looking for a big low profile Reviung, it&apos;s probably a much more straightforward option. They even have some nice acrylic cut cases options. The RevXL needed arrow keys however, so I was firmly in the realm making a custom design.</p><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/AfternoonBreeze.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1000" height="625" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/AfternoonBreeze.jpg 600w, https://flatfootfox.com/content/images/2025/02/AfternoonBreeze.jpg 1000w" sizes="(min-width: 720px) 720px"><figcaption>The RevXLP shares a lot of DNA with the Afternoon Breeze.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>Arrow keys aren&apos;t completely unheard of in ergo mech circles. The <a href="https://github.com/mmccoyd/hillside/tree/main/hillside52">hillside52</a> and <a href="https://kbd.news/Atalante-1961.html">Atalante</a> have found room to sneak arrow keys into a traditional split ergonomic keyboard layout, and designs like the <a href="https://github.com/mylestunglee/articulation70">articulation70</a> have dabbled in adding entire clusters. My largest inspiration came from Afternoon Lab&apos;s <a href="https://www.afternoonlabs.com/breeze/">Breeze</a> keyboard however. It too is designed to be an introductory ergonomic split keyboard. It features a layout very similar to the <a href="https://github.com/kata0510/Lily58">Lily58</a>, but with a breakaway arrow key cluster added onto the side. I always liked the idea of physically being able to &quot;graduate&quot; to a smaller keyboard, and the aesthetics of the optional module are pretty nice.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-PCB.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="2000" height="745" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-PCB.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-PCB.png 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-PCB.png 1600w, https://flatfootfox.com/content/images/size/w2400/2025/02/RevXL-PCB.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>With those inspirations in tow I hopped into Ergogen and got to work. Thankfully this keyboard is fairly similar to the design I created in my <a href="https://flatfootfox.com/ergogen-introduction/">Ergogen tutorial series</a>. Ergogen has you break a keyboard down into a group of &quot;points&quot; which are used to define where the key switches and other parts should go. From there you define an &quot;outline&quot; which is used to create the shape of the board, and then finally the &quot;pcb&quot; and the 3D &quot;case&quot; files. This particular build doesn&apos;t have many tricks that should be unfamiliar for folks who read that series. The most substantial wrinkle is the amount of point groups I created. There&apos;s a dedicated definition for the main key groups, the modifiers, the layer keys, the spacebars, and the arrow cluster.</p><p>The biggest deviation from the influences I just rattled off is the PCB&apos;s overall shape. Most Reviung derivatives have a PCB outline that hugs fairly tightly to the key layout. That would work here, but then the more organic shape would just sort of be bolted onto the rounded rectangle of the arrow cluster. Instead I decided to lean into the more square shape of the arrow cluster and expanded it out to cover the rest of the Reviung layout. As you can see the rectangle doesn&apos;t quite cover all of the main keyboard, but it does so in a way that actually looks pretty nice. The top and bottom keys poke out of the keyboard&apos;s basic outline ever so slightly. It maintains the travel-friendly rectangular shape while providing <em>just</em> enough character to the RevXL. You almost get the sense that the keyboard&apos;s trying to break outside of the conventional box.</p><p>I usually don&apos;t write this much about a keyboard&apos;s basic layout. I drew inspiration from a lot of existing designs for this build however, and it&apos;s always good to show your work. Hopefully that bit of extra backstory will explain the maximalist character of this particular board.</p><h2 id="rgb-leds">RGB LEDs</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-RGB.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1000" height="562" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-RGB.jpg 600w, https://flatfootfox.com/content/images/2025/02/RevXL-RGB.jpg 1000w" sizes="(min-width: 720px) 720px"><figcaption>Ooohhh... Shiny...</figcaption></figure><p>The per-key RGB LEDs were one of the largest drivers of this board. QMK features all sorts of dazzling lighting effects. Strobing rainbows, green Matrix rain, velocity matched heat maps, the list goes on and on. It&apos;s a sight to behold, and thanks to the introduction of the <a href="https://en.wikipedia.org/wiki/RP2040">RP2040</a>, QMK-compatible microcontrollers now have much more storage space to contain these light shows.</p><p>The RevXL uses <a href="https://42keebs.eu/shop/parts/components/sk6812-ws2812b-rgb-led-modules/">SK6812 MINI-E</a> LEDs. SK6812 is the generic name for Adafruit&apos;s <a href="https://www.adafruit.com/category/168">NeoPixels</a> if you&apos;re familiar with that product line. The SK6812 is available in several different form factors with frustratingly different pinouts. Make sure you buy the right ones if you&apos;re working with these LEDs. The &quot;MINI-E&quot; variant has long legs which are more easily hand-solderable. They sit on the underside of a PCB and shine up through a hole in the PCB. Choc v1 switches have a small transparent hole in the top half to let LEDs shine through and light up the bottom of a keycap.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Animated.gif" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="800" height="450" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Animated.gif 600w, https://flatfootfox.com/content/images/2025/02/RevXL-Animated.gif 800w" sizes="(min-width: 720px) 720px"><figcaption>Look at &apos;em go!</figcaption></figure><p>SK6812 LEDs operate off of a one-wire serial protocol. (The practice is affectionately known as &quot;<a href="https://en.wikipedia.org/wiki/Bit_banging">Bit Banging</a>&quot;.) They&apos;re wired together in a series similar to Christmas tree lights. Each SK6812 has a Digital-In pin, a Digital-Out pin, as well as a power and ground pin. The first LED connects its input pin to your microcontroller. Then it uses its output pin to connect to the input pin of the second LED. The second LED connects its output pin to the input pin of the third LED, and you continue the chain until you get to the last LED. On the software side of things, the microcontroller is able to say, &quot;LED 8 needs to be green right now.&quot; Each LED in the chain reads the message and determines if it has instructions for it to act on. If LED 8 reads the message, it will update its color. Otherwise it just disregards the message and passes it along the chain for the correct LED. It&apos;s a simple setup and only needs one extra data pin from your microcontroller.</p><p>The complexity comes in the wiring. Keyboards traditionally have a matrix of columns and rows. On most builds, it&apos;s not too difficult to fall into a pattern of wiring your row pins on one side of the keyboard, then placing the column routes on the reverse side of your keyboard. They generally stay out of each other&apos;s way and you can have nice repeatable patterns in your wiring. Then your LEDs get in the way and start snaking across the matrix in a complicated S-shaped pattern. Sometimes it&apos;s going left and right, other times it needs to drop down to the next row, and all the while every key now needs access to power and ground.</p><p>The trick to keeping this all neat and organized on your keyboard is, uh... You don&apos;t?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Mess.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1652" height="1536" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Mess.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Mess.png 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Mess.png 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Mess.png 1652w" sizes="(min-width: 720px) 720px"><figcaption>Your routes are going to bottleneck in certain areas.</figcaption></figure><p>Your wiring&apos;s going to be a bit of a mess. Unfortunately your Ergogen config will be as well. (If you&apos;re not interested in how these are configured in Ergogen, feel free to hop onto the next section.)</p><p><a href="https://github.com/ergogen/ergogen">Ergogen</a> was designed to have nice minimalist code. You can easily specify &quot;The far left column will all connect to Pin8&quot; and &quot;the middle row will all connect to Pin4.&quot; LEDs don&apos;t work like that. They need to know, &quot;I&apos;m LED32, I connect to LED31 and LED33.&quot; In the world of Ergogen, that means you&apos;re going to have to create an entry for <em>every key on your keyboard.</em></p><p>To accomplish this, let&apos;s first start with the footprint definitions. I&apos;ve included the switch, diode, and LED definitions here so you can see how they&apos;re placed in relationship to one another. (Some parameters have been committed with <code>[...]</code>, check out the <a href="https://github.com/ImStuBTW/revxl">Github</a> repo for the full code.)</p><pre><code class="language-yaml">footprints:
  # Hotswap Choc keys.
  choc_hotswap:
    what: switch_choc_v1_v2
    where: true
    params:
      [...]
      from: &quot;{{column_net}}&quot;
      to: &quot;{{colrow}}&quot;
    adjust:
      rotate: 180
  # SMD Diodes
  diode:
    what: diode_tht_sod123
    where: true
    params:
      from: &quot;{{colrow}}&quot; 
      to: &quot;{{row_net}}&quot;
    adjust:
      shift: [-8.275, 1]
      rotate: -90
      resist: true
  # LEDs
  sk6812:
    what: led_sk6812mini-e
    where: true
    params:
      P2: &quot;{{key.led_next}}&quot; #DOUT 
      P4: &quot;{{key.led_prev}}&quot; #DIN
    adjust:
      shift: [0, 5]
</code></pre><p>The SK6812 footprints are from Ceoloide&apos;s excellent <a href="https://github.com/ceoloide/ergogen-footprints">ergogen-footprints</a> repository. Since I was already importing some footprints from that repo, I&apos;m also using his Choc and diode footprints as well.</p><p>The <code>rotate: 180</code> parameter in the Choc switch ensures that the LED is shining through the top of the key. The <code>to:</code> and <code>from:</code> switch and diode parameters are unchanged from their usual configuration.</p><p>The LED footprint contains four pins. P1 maps to VCC by default, P3 maps to GND, and P2 and P4 are initially undefined Digital-Out and Digital-In pins. In this Ergogen config, we&apos;ve specified a slightly unusual <code>{{key.led_next}}</code> and <code>{{key.led_prev}}</code> variable definitions. As discussed in my Ergogen tutorial, these are not fixed keyword properties in Ergogen. These are variable names that we&apos;ve created ourselves. They could just as easily be called <code>{{key.led_dout}}</code>. All these configurations are saying is, &quot;Look at the <code>key:</code> property for each point. There should be a property called <code>led_next:</code> and <code>led_prev:</code> which define the nets for this footprint.&quot;</p><p>This is where the tedious needing-to-configure-every-switch step comes in. Up in your <code>points:</code> definition, each column area will look like this:</p><pre><code class="language-yaml">points:
  zones:
    matrix:
     [...]
     columns:
       outer:
         key:
           column_net: col0
         rows:
           bottom:
             key:
               led_prev: LED23
               led_next: LED24
             mirror.key:
               led_prev: LED34
               led_next: LED35
           home:
             key:
               led_prev: LED12
               led_next: LED13
             mirror.key:
               led_prev: LED45
               led_next: LED46
           top:
             key:
               led_prev: LED11
               led_next: LED12
             mirror.key:
               led_prev: LED46
               led_next: LED47
          [...]</code></pre><p>Inside of each <code>columns:</code> section we need to create an intersecting <code>rows:</code> definition. This is where our <code>key:</code> property with the <code>led_prev:</code> and <code>led_next:</code> variable will live. Here we&apos;re able to define that <code>matrix_outer_top</code> has a key property of <code>led_prev: LED11</code> and <code>led_next: LED12</code>. The next LED in the chain is <code>matrix_outer_home</code> with <code>led_prev: LED12</code> and <code>led_next: LED13</code>. This continues all the way around the keyboard, including on the mirrored side with the <code>mirror.key:</code> properties you can see in the above example. (If it&apos;s not clear, the <code>[...]</code> ellipses are just truncating parts of the config.yaml file which aren&apos;t relevant for this LED example.)</p><p>The LED order is a <em>little</em> tricky to follow in the above example. My LEDs travel up and down each row, so in the column definitions the numbers jump pretty significantly between keys. These are the definitions for keys 12, 13, and 24 in the diagram below.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-LED-Layout.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1163" height="420" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-LED-Layout.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-LED-Layout.jpg 1000w, https://flatfootfox.com/content/images/2025/02/RevXL-LED-Layout.jpg 1163w" sizes="(min-width: 720px) 720px"><figcaption>Purple are my columns, orange are my rows, and white&apos;s the LED chain snaking its way across the keyboard. The Western Duplex matrix doesn&apos;t help things on the simplicity side either.</figcaption></figure><p>Hopefully that&apos;s enough to help you get going. It makes for a bit of a bloated config. If you have a preview of your PCB in another window, it&apos;s thankfully not that hard to define every key. I have my LED chain snake back and forth every column starting from the top left.</p><h2 id="screen-rotary-encoder">Screen &amp; Rotary Encoder</h2><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-OLED.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-OLED.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-OLED.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-OLED.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-OLED.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>Love the glow on these.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>The <a href="https://42keebs.eu/shop/parts/oled-display-0-91-128x32/">SSD1306</a> display is back! This OLED screen is used commonly in mechanical keyboard builds. There&apos;s nothing too fancy here. I have a different image I&apos;m showing for each layer in the keymap config. I haven&apos;t had a chance to kick the tires much with the screen in QMK too much, but it&apos;ll be nice to experiment with in the future.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Encoder.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="2000" height="1125" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Encoder.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Encoder.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Encoder.jpg 1600w, https://flatfootfox.com/content/images/size/w2400/2025/02/RevXL-Encoder.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>Nice cozy knob!</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>The rotary encoder is also your bog standard EC11 encoder with pushbutton action. The pushbutton is wired into the keyboard matrix with a diode like any other switch on the board. The actual rotation pieces need an additional two pins. I hadn&apos;t done much shopping for knobs before laying out the rest of the keyboard. It turns out most options are either 20mm or 25mm. The gap between the keys is closer to 24mm, so I ended up going with one of the nicer <a>20mm knob options</a>.</p><h2 id="the-breakaway-arrow-cluster">The Breakaway Arrow Cluster</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Breakaway.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1285" height="698" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Breakaway.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Breakaway.jpg 1000w, https://flatfootfox.com/content/images/2025/02/RevXL-Breakaway.jpg 1285w" sizes="(min-width: 720px) 720px"><figcaption>Break me off a piece of that keyboard.</figcaption></figure><p>PCBs are manufactured from large sheets of <a href="https://en.wikipedia.org/wiki/FR-4">FR-4</a> fiberglass composite and copper. Your PCB is typically manufactured on the same FR-4 sheet as several other designs. Manufacturing services will silently &quot;panelize&quot; a PCB before sending it through the fabrication process so that your small PCB can be cleanly snapped off from the larger sheet.</p><p>There are a variety of techniques to create these breakaway tabs. They typically use a pattern of small drill holes to weaken the structure of the PCB near the edge you need to break off. This has lead to them receiving the affectionate name of PCB &quot;mouse bites&quot;. Sparkfun has published an entire <a href="https://news.sparkfun.com/4400">white paper</a> on the design of these perforated tabs.</p><p>Nothing&apos;s to stop you as a designer from including your own breakaway tabs. (Except for perhaps your PCB fab&apos;s manufacturing policies.) One interesting design option with mouse bites is that you can often send traces between perforated holes. As long as your circuit doesn&apos;t need to be a complete loop, you can include optional components on the far side of breakaway tabs. If you need those parts of the board, you can keep them intact. If you don&apos;t need those components, you can snap them off without disrupting the electronics on the main part of your circuit.</p><p>Thanks to the chain-like nature of the RGB LEDs, that means we can snap off the last 10 keys without disrupting the rest of the circuit. The keyboard matrix likewise doesn&apos;t mind the last two columns being unceremoniously snapped off. Even if this ergo mech experiment ends up being a bust for my husband, I&apos;ll still have a nice traditional Reviung board for my own use.</p><p>I&apos;m not going to lie, part of me just likes the aesthetics of the breakaway section. I might keep the arrow keys intact even if I end up daily driving one of these boards. Flexibility in one&apos;s keyboarding is always nice. I definitely didn&apos;t follow the best practices here. I&apos;m using large 2mm drill holes for my mouse bites similar to the <a href="https://www.afternoonlabs.com/breeze/">Breeze</a> keyboard. They&apos;re more like... Capybara Bites? It worked well enough for me, but it might be worth searching out some other examples if you&apos;re serious about panelization.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Bites.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Bites.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Bites.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Bites.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Bites.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>The trimmed breakaway headers before any cleanup.</figcaption></figure><p>If you do take this same route, I <em>highly</em> suggest using flush cutters rather than actually snapping the PCB. Fiberglass shards can do really nasty things to the inside of one&apos;s lungs. Avoid using Dremel or sandpaper as well. Or maybe just wear eye protection and a spare KN95 you&apos;ve got laying around.</p><h2 id="keycap-considerations">Keycap Considerations</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Blue.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="2000" height="1125" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Blue.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Blue.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Blue.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Blue.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption>MBK Glow with custom Insert, Delete, Home, End, and Page Up/Down keys.</figcaption></figure><p>Hang on. We went over this in the layout section. This keyboard only uses <code>1u</code> keycaps. We just need a copy of <a href="https://fkcaps.com/keycaps/mbk/legend-glow-r2">MBK Glow</a> and we&apos;re good to go. Next section!</p><p>Err...</p><p>Right. So it turns out that in my haste to recreate the four arrow keys and the six other cluster keys, I never actually checked to see if the MBK Glow keycap set contained an <code>Insert</code>, <code>Home</code>, <code>End</code>, <code>Page Up</code>, or <code>Page Down</code> key. I&apos;m all set with <code>Delete</code>, but the other arrow cluster keys would need to leverage one of the keycap set&apos;s more generic symbols.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Cluster.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1580" height="888" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Cluster.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Cluster.jpg 1000w, https://flatfootfox.com/content/images/2025/02/RevXL-Cluster.jpg 1580w" sizes="(min-width: 720px) 720px"><figcaption>Just a quick <a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a> order, right?</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>The whole point of this layout was trying to make an aesthetically uncompromised keyboard. Whoops. No problem. I can still fix his. <a href="https://fkcaps.com/?a=FlatFootFox">FK Caps</a> has their <a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a> service! I can just print a few keycaps to round out the set. No problem!</p><p>Small problem. It turns out FK Custom has a $40 minimum purchase limit. That means you need to manufacture over custom 30 keys in a single order. Well drat. I would need to design an entire new keycap set to make it worth printing out a few extra keys.</p><h2 id="i-designed-an-entire-new-keycap-set-to-make-it-worth-printing-out-a-few-extra-keys">I Designed An Entire New Keycap Set To Make It Worth Printing Out A Few Extra Keys</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Keycaps.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1656" height="487" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Keycaps.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Keycaps.png 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Keycaps.png 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Keycaps.png 1656w" sizes="(min-width: 720px) 720px"><figcaption><a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a> to the rescue!</figcaption></figure><p>I think I may be starting to lose the plot of this particular build. I started looking into <a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a>, and the got the ball rolling on a back burner idea I&apos;ve had in my head for a while. I&apos;ve always liked the idea of keycap glyphs which are inscrutable at first glance, but actually start to make sense if you stare at them long enough. I had a couple of false starts down this path, but settled on a minimalist low resolution pixel look.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/3x3_enumerated.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="828" height="450" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/3x3_enumerated.png 600w, https://flatfootfox.com/content/images/2025/02/3x3_enumerated.png 828w" sizes="(min-width: 720px) 720px"><figcaption>There are so few 3x3 glyph options you can actually write them all out.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p><a href="https://moonbench.xyz/projects/tiny-pixel-art-fonts/">Moonbase</a> has an excellent blog post exploring the readability of low resolution pixel fonts. 3x3 pixels is <em>just</em> enough resolution to start cobbling together letters. Some fare better than others. <code>A</code> and <code>T</code> are clear enough, but you have to use your imagination a bit with <code>W</code> and <code>E</code>. Some symbols rely more on context. <code>S</code> and <code>5</code> are both made up of the same curved few pixels. As Moonbase detail in their blog, 3x4 is when things start getting really legible. If you were building a real font, you probably wouldn&apos;t want <code>X</code>, <code>%</code>, and <code>&#x2318;</code> to all use the same glyph. The brutalist inscrutability is the point here though, so I held off on increasing the resolution any further.</p><p>I was always planning on building one of these RevXL boards for myself. Now I&apos;ll have some visual flair for it and any other backlit RGB keyboards I make in the future. I&apos;ve gotten a few asks to try this font out, so I cobble together a TrueType font based off the .svg files I made for the keycap set. Say hello to <a href="https://flatfootfox.com/assets/fonts/Threebee.ttf">Threebee</a> everyone. Be nice.</p><h2 id="assembly">Assembly</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Assembly.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Assembly.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Assembly.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Assembly.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Assembly.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>Please do not judge my soldering. &#x1F631; I need to stop buying off-brand solder tips.</figcaption></figure><p>There&apos;s nothing too outside the ordinary on this build. The RevXL is designed for Choc v1 switches using Choc hotswap sockets. It uses surface mount 1N4148 diodes for the keyboard matrix. The SK6812 &quot;MINI-E&quot; RGB LEDs are also surface mount. Use some <a href="https://www.amazon.com/Yakamoz-Precision-Non-Conductive-Resistant-Anti-Magnetic/dp/B07V6G4V72/ref=sr_1_9?dib=eyJ2IjoiMSJ9.NLYTcuao0eBlK685LyJtvpKwfXbX6AIwUs4mzWrgak-9YJARaRuaTCpbE4Tn0dBz9bFQgHd9eKUajo_ZOjRop3xXDkiFT0jtJgRsCUWPaBZ-cVJlGL2MaAX_OVL8L92y5jfZx5UPgTWDnV2Rk98OkkGC7IzdWCsbnj6ki0QPUKIBSQQ3ZUAtzBIpxFumGrylW_DpHVIC_DeL1mxxS57EnquRjcd9nJkZGs2t1TmVAkckG8EIweJ6x3xwQt8cnrbuP3IJ2j2zQV0CqgmmHZ7PsT-1EzxIiTgk82wEielxdDWJhC5cN761yzJVrcdi5i_7Aul6fIXHYUG8-fz1DgBGrOnUyL_rBzGushvxItCENiFwVQeGRpH7pjWUtIyLr69X99s8XFz7ra9R7jERQ24H7OY3wn3xJ8Hm9C6xXkUQmf-7o3ECQ86IrTm2xMBpARzI.PcIZw1tHRJ1R-wxqHzifkE-uHm1vEdTOASB7BMZhgRM&amp;dib_tag=se&amp;keywords=reverse+tweezers">reverse action tweezers</a> on the SMD components and you should be fine. It also has a lil&apos; 2-pin 6mm x 3mm reset switch to make flashing new firmware easier. Outside of that, there&apos;s just the microcontroller stack. The RevXL takes advantage of an RP2040 in an Arduino &quot;Pro Micro&quot; form factor. Stacked on top is a typical 128x32 pixel SSD1306 OLED screen.</p><p>The RP2040 is the microcontroller featured in the <a href="https://www.raspberrypi.com/products/raspberry-pi-pico/">Raspberry Pi Pico</a>. It&apos;s designed to be a modern low cost alternative to the aging Arduino&apos;s AVR platform. The Pico is a relatively large micro controller, so the DIY community has standardized on &#xA0;repackaging the RP2040 in the old faithful Arduino Pro Micro form factor. The Pro Micro is about the size of two square keycaps, so it&apos;s a nice fit for mechanical keyboard builds. The RP2040 variant takes after the <a href="https://keeb.io/products/elite-c-low-profile-version-usb-c-pro-micro-replacement-atmega32u4?srsltid=AfmBOooS_RGIHVBB0Mf3VMz_rKyd6iO5kCsGgazUPVIipk_hMniyLofX">Elite-C</a> microcontroller and includes a few extra pins. The extra pins make wiring up the optional components a bit easier, but we&apos;re actually here for the 16mb of onboard memory. QMK&apos;s firmware starts hitting the Arduino&apos;s memory ceiling when you add a few different RGB programs, so the RP2040 gives is a nice overhead to play around with its fancier functionalities.</p><p>When working with a microcontroller, it&apos;s a good idea to &quot;socket&quot; it. Rather than soldering the microcontroller directly onto the PCB, you solder some header sockets onto the PCB, and then some header pins onto the microcontroller itself. It allows you to more easily replace the microcontroller if something goes wrong.</p><p>The mechanical keyboard community commonly likes working with &quot;machine pin headers&quot;. These sockets are unusually low profile, but I&apos;ve personally never had any luck working with them. The small pins you solder onto the microcontroller have always been a little fragile for my liking. I decided to stick with standard &quot;DuPont&quot; header pins this time around, but I at least found a set on Aliexpress that&apos;s only 3.5mm tall.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-TallStack.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-TallStack.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-TallStack.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-TallStack.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-TallStack.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>The tall stack.</figcaption></figure><p>Originally I soldered the header pins onto the microcontroller with the small black plastic protector on the bottom of the microcontroller. It made the RP2040 a little taller than usual, but it was still shorter than a Choc switch with a keycap.</p><p>Unfortunately it turns out that I had positioned the microcontroller a bit too close to the <code>3</code> key. Depending on the size of the USB-C cable you use, it can brush up against the key switch and stop it from pressing smoothly.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Pins.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Pins.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Pins.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Pins.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Pins.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>Just give &apos;em a good tug.</figcaption></figure><p>So I ended up going back to a modified machine pin header approach using the standard square pins. First I used pliers to pop off all of the pins from a set of headers.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Kapton.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Kapton.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Kapton.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Kapton.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Kapton.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>Fun Fact: They used this stuff on the Apollo space program.</figcaption></figure><p>Then I laid a row of temperature-resistant <a href="https://en.wikipedia.org/wiki/Kapton">Kapton tape</a> on top of the soldered headers. It&apos;s pretty easy to poke the individual headers through the tape. You may need to rotate them a bit since they&apos;re square shaped.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Headers.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="2000" height="672" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Headers.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Headers.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Headers.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Headers.jpg 2300w" sizes="(min-width: 720px) 720px"><figcaption>So far I&apos;ve found these a bit sturdier than machine pin headers.</figcaption></figure><p>Finally you can carefully lay your RP2040 on top. (The second time I did this I realized it was easier to lay the RP2040 down first and feed the pins through it.) Now you can solder the headers into place. The Kapton tape stops you from accidentally having solder drip down and permanently fuse your microcontroller to the headers. The end result is a slightly shorter Pro Micro. You&apos;ll need to trim the excess pins off the top of the microcontroller with some angle cutters. (Scissors that cut a bit more flush than your standard pair.)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Stack.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Stack.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Stack.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Stack.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Stack.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>The final stack!</figcaption></figure><p>The OLED screen needs to be a bit taller than the Pro Micro, so you can use the same 3.5mm headers while keeping the plastic piece in place. You&apos;ll want to solder the OLED screen&apos;s pins in place slotted into the keyboard&apos;s actual OLED header using the Kapton trick again. It barely fits over the RP2040, and there&apos;s a chance it could be angled awkwardly in the air if you soldered it on a breadboard.</p><h2 id="the-case">The Case</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Case.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="906" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Case.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Case.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Case.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Case.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>I&apos;m so glad I finally splurged for the heat set insert soldering iron tip.</figcaption></figure><p>The RevXL uses a &quot;tray&quot; style 3D printed case with heat set inserts. It&apos;s exactly the same design featured in my <a href="https://flatfootfox.com/ergogen-part4-footprints-cases/">Ergogen tutorial</a>. The parametric nature of Ergogen allowed me to copy the case code over, adjust a few variables, and pop out a finished case design with very few adjustments. Score one for reusable code!</p><p>Due to how wide this particular keyboard is, the case doesn&apos;t fit on my 3D printer as a single piece. It&apos;s been split down the middle to allow it to be printed as two parts. Hence some of the interior mounting holes on the PCB. I also used the same heat set insert trick with the screws holes as discussed in the tutorial.</p><h2 id="the-firmware">The Firmware</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-QMK.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="852" height="444" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-QMK.jpg 600w, https://flatfootfox.com/content/images/2025/02/RevXL-QMK.jpg 852w" sizes="(min-width: 720px) 720px"><figcaption>AAAAAAAAAAAAAAAAAAAA.</figcaption></figure><p>The short version of this section is that the RevXL uses the <a href="https://get.vial.today">Vial</a> fork of the <a href="https://qmk.fm">QMK</a> open source keyboard firmware project. I&apos;ve previously worked primarily with the <a href="https://zmk.dev">ZMK</a> wireless keyboard firmware, but it doesn&apos;t have as robust as support as QMK for per-key RGB lighting. Vial meanwhile is an open source fork of QMK inspired by the Via project. It adds support for using a GUI on your computer to update your keyboard&apos;s keymap and settings in real time without the need to re-flash your computer.</p><p>The long version of this section is: <em>What the heck happened to QMK?</em></p><p>QMK is the grandfather of modern open source keyboard firmwares. It&apos;s the longest running project with support for a dazzling amount of hardware features. While there are newer projects like <a href="https://zmk.dev">ZMK</a> targeting wireless keyboards and <a href="https://github.com/semickolon/fak">FAK</a> targeting keyboards based off the CH55X chip, QMK&apos;s still the gold standard when it comes to working with wired keyboards. It&apos;s the software that companies like Keychron and Drop target when they want to try and sway mechanical keyboard folks from going the DIY route.</p><p>Working with QMK has always been a little cumbersome for reasons that are largely not their fault. The project originally targeted some of the earliest <a href="https://www.arduino.cc">Arduino</a> hardware. The AVR platform runs on low-level C code, and there&apos;s only so many layers of GUI niceties you can put on top of the flashing process. Once you get your head around it though, the project&apos;s not that hard to work with.</p><p>To define a matrix, you pull up the <a href="https://docs.qmk.fm/config_options">Config Options</a> documentation, hop into <code>config.h</code> and set:</p><pre><code class="language-C">#define MATRIX_ROW_PINS { GP29, GP28, GP27, GP26, GP22, GP21, GP16, GP15, GP14, GP13 }
#define MATRIX_COL_PINS { GP10, GP0, GP1, GP4, GP5, GP6, GP9, GP12 }</code></pre><p>Then you just browse over <code>keymap.c</code> and put the right keycodes into an array. Toss together some ASCII art of your layout in the comments and you&apos;re off to the races, right?</p><p>Well... not quite.</p><p>It&apos;s been about three years since I&apos;ve used QMK. In the intervening time, the project realized that managing keyboard firmware C files written with a variety of community conventions was becoming unwieldy. They decided to move most functionality (but not all) into more structured <code>.json</code> files.</p><p>Well alright then. Let&apos;s pull up the <a href="https://docs.qmk.fm/reference_info_json">info.json Reference</a>, create an <code>info.json</code> file, and set out matrix definition there.</p><pre><code class="language-json">{
	[...]
    &quot;matrix_pins&quot;: {,
        &quot;rows&quot;: [&quot;GP29&quot;, &quot;GP28&quot;, &quot;GP27&quot;, &quot;GP26&quot;, &quot;GP22&quot;, &quot;GP21&quot;, &quot;GP16&quot;, &quot;GP15&quot;, &quot;GP14&quot;, &quot;GP13&quot;],
        &quot;cols&quot;: [&quot;GP10&quot;, &quot;GP0&quot;, &quot;GP1&quot;, &quot;GP4&quot;, &quot;GP5&quot;, &quot;GP6&quot;, &quot;GP9&quot;, &quot;GP12&quot;]
    },
    [...]
}</code></pre><p>Cool, everything&apos;s hunky dory now, right? Nope! QMK decided that <code>info.json</code> should describe common aspects of a <em>family</em> of keyboards. What you really need is a device specific <code>keyboard.json</code> file. It&apos;s a superset of <code>info.json</code> with a few more hardware fields.</p><p>The background and purpose of this <code>keyboard.json</code> file is mentioned in the <a href="https://docs.qmk.fm/ChangeLog/20240526#keyboard-json">2024 May 26 Changelog</a>, and it is referenced on the <a href="https://docs.qmk.fm/porting_your_keyboard_to_qmk">Porting Keyboards</a> page.</p><p>That&apos;s it.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/blahaj-laptop.gif" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="498" height="262"><figcaption>What I assume the common reaction to working with QMK&apos;s documentation is at this point.</figcaption></figure><p>The Porting Keyboards page tells you to go to the <a href="https://docs.qmk.fm/data_driven_config">Device Driven Configuration</a> page for more details. This page does not mention <code>keyboard.json</code> once. It outlines the background of <code>info.json</code> and links to the <a href="https://docs.qmk.fm/reference_info_json">info.json Reference</a>, but it&apos;s not immediately clear what this file&apos;s relationship is to <code>keyboard.json</code>. I guess you&apos;re supposed to know that <em>&quot;There are a lot of options that can be placed in that file, too many to list here&quot; </em>is supposed to mean, &quot;<code>keyboard.json</code> files can use <code>info.json</code> properties.&quot;</p><p>I know I&apos;ve moved onto full on kvetching at this point. Managing open source projects the size of QMK is a difficult prospect. Writing thorough and understandable documentation is a skill unto itself. QMK&apos;s not only having to deal with keyboard designers like myself, but also beginner users who have bought a prebuilt QMK keyboard and just need assistance walking through updating their keymap. I&apos;m fine dealing with spotty documentation if there&apos;s enough information available to get to your goals. Ergogen v4 for example still has some incomplete docs.</p><p>As it exists now however, QMK&apos;s documentation is a land mine field of outdated information. The <a href="https://docs.qmk.fm/getting_started_introduction#basic-qmk-structure">Basic QMK Structure</a> page is missing files. The <a href="https://docs.qmk.fm/understanding_qmk#matrix-to-physical-layout-map">Understanding QMK</a> page had a guide on how to define non-standard matrix structures, something I desperately needed for my build, but it will throw depreciation errors if you actually try and implement its suggestions in your keyboard today. If you&apos;d like to implement a rotary encoder and navigate to the <a href="https://docs.qmk.fm/features/encoders">Encoders</a> page, you have made a mistake. The actual modern documentation is on the <a href="https://docs.qmk.fm/reference_info_json">info.json Reference</a>. Just be warned that the documentation fails to mention that the configuration won&apos;t do anything unless you add <code>&quot;encoder&quot;: true</code> to the <code>&quot;features&quot;:</code> section.</p><p>As a relative outsider to the QMK scene, wrapping your head around the project as it currently exists is a bit of a mess. Maybe I missed some obvious resource or example repo and this is mostly on me? I just feel like I suddenly understand why the ZMK team is working on improving their wired keyboard support. Googling for QMK answers is unfortunately also a risky proposition given the age of the project. I don&apos;t know if bumping things up to a full new &quot;QMK 2&quot; name would have made any of this more clear, but make sure any post you&apos;re referencing is relatively recent. Your best bet is to find a recent configuration of a keyboard with similar features to yours and copy that.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Vial-1.png" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1023" height="793" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Vial-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Vial-1.png 1000w, https://flatfootfox.com/content/images/2025/02/RevXL-Vial-1.png 1023w" sizes="(min-width: 720px) 720px"><figcaption>Vial&apos;s been a breath of fresh air.</figcaption></figure><p>Once my QMK configuration was finally up and running, adding Vial support was nice and straightforward. Their site had step by step documentation, and they walk you through the most commonly requested features like rotary encoder and LED support. It is a bit humorous to have to build your keyboard layout out in <a href="http://Keyboard-Layout-Editor.com">Keyboard-Layout-Editor.com</a> after having initially designed it in Ergogen, but the process is nice and straightforward.</p><p>Once you get Vial up and running, you can use their GUI as either an offline application or a Chrome web app to re-map your keyboard&apos;s layout on the fly. It&apos;s a nice way of letting beginners dabble with QMK, and it exposes a lot of features you might not even realize are there. If I work with QMK again, I&apos;ll definitely be taking the time to add Vial support as well.</p><h2 id="build-of-materials">Build of Materials</h2><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px;">
<tr class="post-table-header">
<th style="border-top-right-radius: 0px;">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px;">Price</th>
</tr>
<tr>
<td><a href="https://github.com/ImStuBTW/revxl">Revxl PCB via PCBWay</a></td>
<td>1</td>
<td>$60.00 USD</td>
</tr>
<tr>
</tr><tr>
<td><a href="https://www.aliexpress.us/item/3256806423363289.html">RP2040 &quot;Pro Micro&quot;</a></td>
<td>1</td>
<td>$3.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256805697157410.html">Choc Switches</a></td>
<td>68</td>
<td>$40.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800498728983.html">1N4148 T4 Diodes</a></td>
<td>68</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800498728983.html">SK6812 MINI-E RGB LEDs</a></td>
<td>68</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800160725313.html">EC11 Rotary Encoder</a></td>
<td>1</td>
<td>$2.50 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2251832562966356.html">EC11 20x15mm Knob</a></td>
<td>1</td>
<td>$3.00 USD</td>
</tr>
<tr>
<td><a href="https://lowprokb.ca/collections/keycaps/products/mbk-glow-r2-keycap-sets">MBK Glow Keycaps</a></td>
<td>1</td>
<td>$55.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256801663262003.html">6mm x 3mm x 4.3mm Pushbutton</a></td>
<td>1</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256801663262003.html">Machine Pins</a></td>
<td>39</td>
<td>$6.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256801663262003.html">Machine Pin Headers</a></td>
<td>39</td>
<td>$4.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255801062616407.html">4mm M2 Screws</a></td>
<td>8</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256804349544912.html">2mm M2 Screw Inserts</a></td>
<td>8</td>
<td>$1.50 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256804119199524.html">Bumpons</a></td>
<td>1 Pack</td>
<td>$1.00 USD</td>
</tr>

</table><!--kg-card-end: html--><h2 id="conclusion">Conclusion</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2025/02/RevXL-Two.jpg" class="kg-image" alt="The RevXL Keyboard" loading="lazy" width="1613" height="1210" srcset="https://flatfootfox.com/content/images/size/w600/2025/02/RevXL-Two.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2025/02/RevXL-Two.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2025/02/RevXL-Two.jpg 1600w, https://flatfootfox.com/content/images/2025/02/RevXL-Two.jpg 1613w" sizes="(min-width: 720px) 720px"><figcaption>Two of them!</figcaption></figure><p>This was an incredibly satisfying keyboard build. Despite working with RGB LEDs and the RP2040 for the first time, I managed to design the PCB without any routing issues on my first try. (Something I&apos;ve not always been lucky within the past.) I&apos;m overall really happy how this project came together. If I had to make some adjustments for a v2 design, I would give the microcontroller a bit more space, and maybe consider adding a few more switch footprints to the arrow cluster. A few kind folks pointed out that if I fill in the 5 gaps in the current design, you would have the option of including a small numpad area in addition to an arrow cluster.</p><p>I was going to end this post with a joke about how I&apos;d post my husband&apos;s impressions as soon as he finished learning how to type on a Choc-spaced column-staggered keyboard. He&apos;s actually taken to the RevXL like a fish to water. The cozier Choc spacing takes a bit of time to get used to, but he&apos;s already been toying with lighting patterns and updating the keymaps. Mission accomplished.</p><!--kg-card-begin: html--><div><sub>*The PCB featured in this writeup were provided by PCBWay. Thanks again for their support.</sub></div>
<div style="margin-bottom: 16px"><sub>**The remainder of the keyboard parts, switches, and keycaps were purchased by the builder.</sub></div><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[65 Crimes, a CH559L FAK Keyboard]]></title><description><![CDATA[<p>This is a 65% keyboard with the heart of a 40% keyboard. Nothing here is standard. It&apos;s not ergonomic. I have to be breaking some sort of keyboard law here. Welcome to the 65 Crimes.</p><p>The 65 Crimes is my take on a small row-staggered keyboard design. I&</p>]]></description><link>https://flatfootfox.com/65-crimes-a-ch559l-fak-keyboard/</link><guid isPermaLink="false">66f305f3988db63845c04392</guid><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Tue, 24 Sep 2024 18:52:35 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2024/09/65crimes.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2024/09/65crimes.jpg" alt="65 Crimes, a CH559L FAK Keyboard"><p>This is a 65% keyboard with the heart of a 40% keyboard. Nothing here is standard. It&apos;s not ergonomic. I have to be breaking some sort of keyboard law here. Welcome to the 65 Crimes.</p><p>The 65 Crimes is my take on a small row-staggered keyboard design. I&apos;ve been getting into retro computing a bit more lately, and I wanted a non-ergonomic non-split keyboard design that didn&apos;t rely on a ton of layers. The 65 Crimes can play TiE-Fighter with the <code>F1</code>-<code>F12</code> keys being the only thing you need to hold <code>Fn</code> down for. I still wanted the keyboard to be compact and tweet however, so there&apos;s a few odd quirks going on here. The left row has been shaved down by half a key width. <code>Tab</code>, <code>Caps Lock</code>, and <code>Left Shift</code> all get downgraded from 1.5u to 1u, 1.75u to 1.25u, and 2.25u to 1.75u. Much more striking however is the number row. Rather than sticking with the popular compact 65% keyboard block design, I gave the number row a bit of breathing room. It&apos;s spaced out similar to a traditional function row. It makes it a little odd to type on, but the end result is a 65% keyboard that looks like a 75% keyboard at first glance.</p><p>I tackled a few personal firsts on this keyboard design. It&apos;s my first row-staggered keyboard, my first keyboard with spacebar stabilizers, my first keyboard with an onboard microcontroller, and my first time working with the FAK keyboard firmware. Everything worked out in the end, but there were a lot of layered learning experiences here.</p><h2 id="the-ergogen-layout">The Ergogen Layout</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/ergogen.png" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="1318" height="1568" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/ergogen.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/ergogen.png 1000w, https://flatfootfox.com/content/images/2024/09/ergogen.png 1318w" sizes="(min-width: 720px) 720px"></figure><p>This one&apos;s going to take some explaining.</p><p>Ergogen is a keyboard layout generator designed to make ergonomic keyboards. It&apos;s right there in the name! It&apos;s designed to make &quot;column staggered&quot; keyboards where all of the keys in a column (QAZ, WSX, etc.) are aligned together. This is a traditional &quot;row staggered&quot; keyboard. It&apos;s ostensibly less ergonomic. It&apos;s also something Ergogen is <em>really</em> not designed for.</p><p>To design the 65 Crimes keyboard I decided to get a little creative. The Ergogen config file for this board literally turns it on its head. Everything is rotated 90 degrees so that it just looks like an excessively tall column staggered keyboard. Rather than a 15 column, 5 row keyboard, Ergogen thinks it&apos;s designing a 5 column, 15 row keyboard.</p><p>The approach takes a bit to wrap your head around. X becomes Y, length becomes width, and straightforward becomes tedious. This is definitely a case of, &quot;When you have a hammer, everything looks like a nail&quot;. If you&apos;re familiar with Ergogen then this approach is still probably faster than learning another tool. If you&apos;re looking to learn Ergogen to make a row-staggered keyboard however, you&apos;re probably better off looking at some of the <a href="https://github.com/jeroen94704/klepcbgen">other</a> <a href="https://kb.xyz.is">tools</a> out there. There are also some <a href="https://github.com/Woovie/seven-five">Ergogen keyboards examples</a> out there which manage a row-staggered layout without this rotation approach. This is just what happened to work for me.</p><p>Update: After experimenting a bit more, the &quot;Rotate everything by 90 degreess&quot; method is probably a bit more trouble than it&apos;s worth. I&apos;ve made a few example row staggered Ergogen configs in this <a href="https://github.com/ImStuBTW/pain-rectangles">pain-rectangles</a> repo. You make every row into a dedicated point zone so the columns don&apos;t inherit the various shifts and adjustments. The catch is you&apos;ll need to be a lot more explicit when it comes to defining your nets.</p><h2 id="the-pcb">The PCB</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/pcb.png" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="2000" height="734" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/pcb.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/pcb.png 1000w, https://flatfootfox.com/content/images/size/w1600/2024/09/pcb.png 1600w, https://flatfootfox.com/content/images/size/w2400/2024/09/pcb.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>At its core, the 65 Crimes keyboard was an excuse to learn more about building keyboards with built in microcontrollers. The Arduino Pro Micro, RP2040, Nice!Nano, and XIAO boards are great, but it&apos;s hard to beat some of the minimalist designs you can build when you&apos;re not trying to hide a large postage stamp sized microcontroller somewhere. I briefly explored some of the options out there for built in microcontrollers, but they all seemed to have a level of complexity I wasn&apos;t ready to dive into. I got fairly far along looking at STM32-based designs, but the programming headers just seemed like a headache I didn&apos;t want to deal with.</p><p>Enter the CH55X line of chips. These budget microcontrollers became popular during the Covid era chip storage. They&apos;re not going to win any performance contests, but they&apos;re cheap, easy to source, and have onboard USB support. The later is naturally beneficial for keyboard builders, but there&apos;s a few other nice touches here. CH55X chips have fairly simple circuit designs. You only need two resistors, two capacitors, two buttons, an ESD protection chip, and a USB port to get these chips up and running. These chips are also completely hand-solderable if you&apos;d like to skip an expensive PCBA assembly step. Even the basic flashing is nice and straightforward. The same USB port you use for connecting to the keyboard is used for flashing the firmware. (Similar to an Arduino Pro Micro.) Instead of tapping the reset button twice, you simply need to add and hold down a dedicated &quot;Boot&quot; button.</p><p>The majority of keyboards with CH55X chips are using the smaller CH552T chip. It has a nice hand-solderable 0.65mm pitch chip package. Unfortunately, it doesn&apos;t have enough pins for the 65 Crimes large 67 key layout. Thankfully the CH559L has more than enough pins for this design. Things get a little trickier on the hand soldering front however. The CH559L has a tighter 0.5mm pitch. It&apos;s nothing a little flux can&apos;t deal with, but you may want to buy a few spares if this is your first time working with SMD soldering.</p><p>Again, this is my first time working with an onboard microcontroller or the CH55X family of chips. All of the pinouts and component choices are shamelessly copied from semickolon&apos;s <a href="https://oshwlab.com/kkpjfobj/partycrasher-micro">Partycrasher Micro</a> microcontroller design.</p><h2 id="the-firmware">The Firmware</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/65crimesch559l.jpg" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="1464" height="1098" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/65crimesch559l.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/65crimesch559l.jpg 1000w, https://flatfootfox.com/content/images/2024/09/65crimesch559l.jpg 1464w" sizes="(min-width: 720px) 720px"></figure><p>One slight catch with the CH55X chips is that they can&apos;t run most of the popular keyboard firmwares. QMK and ZMK won&apos;t run on this particular microcontroller. Instead, the 65 Crimes leverages the relatively new <a href="https://github.com/semickolon/fak">FAK keyboard</a> firmware.</p><p>I didn&apos;t dive deep into its capabilities, but my first impression of FAK has been great. It&apos;s a declarative keyboard firmware that should be familiar for anyone who&apos;s worked with ZMK. It&apos;s nice having a purely functional firmware which throws errors at compile time if you&apos;ve accidentally made an issue with your keyboard config.</p><p>FAK can be built locally on your computer, but they also offer a preconfigured Github Codespace as a build environment. It makes things nice and simple to get your first firmware up and running. The only package you need to run locally is the flashing utility <code>wchisp</code>, which offers precompiled binaries for Windows, Mac, and Linux.</p><p>The keymap for 65 Crimes can be found in this repository&apos;s <code>/fak-config</code> folder. I haven&apos;t used any FAK features other than layers to enable a basic <code>Fn</code> key. For more advanced ergo keyboards however, FAK supports all the usual macros, combos, encoders, split keyboards, mouse keys, sticky layers, and tap dancing you&apos;re accustomed to. Their <a href="https://discord.gg/4Ev8GFZNR2">Discord</a> was incredibly welcoming and patient with all my questions.</p><h2 id="the-switch-plates">The Switch Plates</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/switchplate-1.png" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="2000" height="708" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/switchplate-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/switchplate-1.png 1000w, https://flatfootfox.com/content/images/size/w1600/2024/09/switchplate-1.png 1600w, https://flatfootfox.com/content/images/size/w2400/2024/09/switchplate-1.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>The 65 Crimes keyboard is also the first time I&apos;ve designed a keyboard layout that uses stabilizers. These are those small metal bars which help wide keys press down evenly without any wobble. They&apos;re ubiquitous in the world of row staggered MX keyboards, but a bit less common in the Choc space.</p><p>Choc stabilizers require a switch plate. The plastic anchors need to be sandwiched between two layers of PCB (or other stiff material) to seat correctly. Thankfully Ergogen makes it pretty straightforward to make a switch plate. Fire up your PCB&apos;s outline, cut out a 14mm hole on each switch, add the stabilizer cutouts, drop in some mounting holes, and bam you&apos;re done. Unfortunately the 65 Crimes is a somewhat large keybaord by split ergonomic standards. JLCPCB wanted another $15 USD for the full switch plate.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/shim-1.png" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="2000" height="299" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/shim-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/shim-1.png 1000w, https://flatfootfox.com/content/images/size/w1600/2024/09/shim-1.png 1600w, https://flatfootfox.com/content/images/2024/09/shim-1.png 2330w" sizes="(min-width: 720px) 720px"></figure><p>I experimented with making a cheaper stabilizer &quot;shim&quot;. This was a smaller piece of PCB material that only covered the spacebar keys and the left and right modifiers next to them. The idea was that you could print off this smaller piece and save a few bucks during your prototyping.</p><p>The actual stabilizer footprints come from a design put together by <a href="https://github.com/FKcaps/mbk-footprints/tree/main">FKCaps</a>. The cutout isn&apos;t symmetrical with the key switch and is aligned closer to the top edge. This resulted in the shim having a relatively thin piece of PCB material. JLCPCB wanted an extra $7 USD to make sure the hole was routed properly. Rather than iterating on this design further, I went ahead and just printed out the full switch plate. The switch plate worked great the first time thankfully, but I&apos;m leaving the shim designs in here for anyone who&apos;s interested.</p><p>For this particular build I went with <a href="https://chosfox.com/collections/low-profile-keycaps/products/chocfox-wob">Chosfox&apos;s CFX WoB Keycap Set</a>. I wanted a keycap set with legends, and this layout used a few odd sized 1.25u and 1.75u keycaps for the modifiers, tab, and enter key. This left Chosfox as pretty much the only game in town. The keycap set is split into an Alpha, Ergo, and Extras kit. I was <em>barely</em> able to squeak by with just the Alpha and Ergo kits.</p><p>The Ergo CFX kit comes with two 2u spacebar keys. It also comes with a 2u key labeled &quot;Shift&quot;. There are also two bright orange 3u spacebar keys. I asked around online and didn&apos;t get many strong opinions when it came to using three 2u spacebars or two 3u spacebars.</p><p>My final design went with three 2u spacebars. This mostly came down to parts sourcing. It turns out the 3u Choc stabilizers are <em>really</em> hard to source right now. I ended up getting five 2u Choc stabilizers from <a href="https://lowprokb.ca/collections/parts/products/kailh-choc-stabilizers">LowProKB.ca</a> for about $5 USD plus $7 USD shipping. I could have purchased 3u stabilizer wires from <a href="https://cannonkeys.com/products/stabilizer-wires?variant=40921516540015">CannonKeys</a> for $4 USD plus $4 USD shipping if I really wanted to use the larger 3u CFX keycaps. Instead, I just ended up purchasing three <a href="https://lowprokb.ca/products/mbk-low-profile-pbt-blank-keycaps?variant=44794533707940">MBK 2u convex spacebars</a> from LowProKB for an extra $3 USD. It sounds a little silly to say I went with three 2u spacebars to save $5 USD, but I already happened to have a matching purple Esc key from an earlier FK Custom order.</p><p>It&apos;s worth noting that these Chosfox keycaps use their &quot;CFX&quot; spacing <em>only on their 1u keycaps</em>. These CFX keycaps have become popular for minimally spaced keyboards. Standard MBK keycaps are 18mm x 17mm, while the CFX keycaps are a square 17mm x 17mm. That&apos;s a free 14mm of saved width on a keyboard like this. Unfortunately the other 1.25u, 1.5u, 1.75u, and 2u keycaps stick to their standard MBK spacing. (That is to say the 1.5u keycap is 18mm * 1.5 = 27mm wide.) For that reason this keyboard sticks to standard Choc spacing.</p><p>The <code>footprints</code> folder contains several custom footprints. Getting the spacing right on this was tricky, so I created a full line of <code>choc-Xu</code> footprints to show their exact spacing on the PCB. The <code>choc-stab-2u</code> and <code>choc-stab-2u-cutout</code> footprints are based on footprint designs by <a href="https://github.com/FKcaps/mbk-footprints/tree/main">FKCaps</a>.</p><h2 id="the-case">The Case</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/65crimescase.jpg" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="1613" height="1019" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/65crimescase.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/65crimescase.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2024/09/65crimescase.jpg 1600w, https://flatfootfox.com/content/images/2024/09/65crimescase.jpg 1613w" sizes="(min-width: 720px) 720px"></figure><p>After all the other experimentation with this keyboard, I stuck with what has worked for me in the past with the 65 Crimes case design. It uses my standard &quot;Tray&quot; design. The PCB and switch plate have mounting holes, and the case has standoff legs with heat set inserts. The only thing I did different this time was splitting the case in half to fit on my printer, and making the sides of the case a bit taller on the top and sides for aesthetic purposes. I also decided to fire up Cura&apos;s &quot;Fuzzy Skin&quot; setting.</p><h2 id="the-build-and-lessons-learned">The Build (and Lessons Learned)</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2024/09/65crimesalt.jpg" class="kg-image" alt="65 Crimes, a CH559L FAK Keyboard" loading="lazy" width="2000" height="1125" srcset="https://flatfootfox.com/content/images/size/w600/2024/09/65crimesalt.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/09/65crimesalt.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2024/09/65crimesalt.jpg 1600w, https://flatfootfox.com/content/images/2024/09/65crimesalt.jpg 2285w" sizes="(min-width: 720px) 720px"></figure><p>No long build guide this time unfortunately. There were a few false starts and fiddling with this keyboard, so I don&apos;t have step-by-step pictures to share. Overall the build went smoothly. The CH559L was the trickiest piece to solder. You need to line it up precisely, apply a bit of solder flux to one side, then quickly apply a bit of solder while the chip is still aligned. Once one of the legs is soldered properly, you can drag-solder the rest as you would with any other SMD component. The same approach goes for the USB-C port. The ESD protection chip, two capacitors, and two resistors should be a bit more straightforward.</p><p>This wasn&apos;t my first rodeo when it came to working with SMD parts. Thankfully the TypePak has similar sized components with just as tiny pitches. One slightly embarrassing learning experience was to <em>not trust the orientation of text on SMD packages</em>. I totally fried some of the ESD and CH559L chips by having things oriented the wrong way.</p><p>The &quot;rotate everything 90 degrees in Ergogen&quot; trick also nearly came back to bite me. It turns out swapping the col and row pinout definitions wasn&apos;t enough to compensate for its rotated definition. All of the diodes on this keyboard are technically &quot;backwards&quot; from how I typically build them. Thankfully it didn&apos;t lead to anything more complicated than needing to swap the &quot;ColToRow&quot; variable in the FAK firmware to &quot;RowToCol&quot;.</p><p>Overall the 65 Crimes was a great learning experience. Row staggering with Choc spacing has taken me a bit more getting used to than I expected. The function row styled number keys have been a fun novelty, but they&apos;re a little tricky to use in practice. The keys one would use from gaming on the left side of the keyboard aren&apos;t too hard to build some muscle memory for, but I almost always tap the wrong number when dealing with 7, 8, or 9. I&apos;ve still got a few CH559L chips I managed not to try, so I&apos;m looking forward to doing a bit more experimenting with FAK in the future!</p><h2 id="build-of-materials">Build of Materials</h2><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px;">
<tr class="post-table-header">
<th style="border-top-right-radius: 0px;">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px;">Price</th>
</tr>
<tr>
<td><a href="https://github.com/ImStuBTW/65crimes">65 Crimes PCB via JLCPCB</a></td>
<td>1</td>
<td>$35 USD Shipped (Shim), $50 USD Shipped (Switchplate)</td>
</tr>
<tr>
</tr><tr>
<td><a href="https://www.aliexpress.us/item/3256804321719097.html">CH559L</a></td>
<td>1</td>
<td>$8 USD (For 5)</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256805368744698.html">Mid-Mount USB</a></td>
<td>1</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256806698117192.html">5.1K Resistors</a></td>
<td>2</td>
<td>$3.50 USD (Multi-Pack)</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256806243569846.html">3.3uf Cap</a></td>
<td>1</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256805970706203.html">100nf Cap</a></td>
<td>1</td>
<td>$2.00 USD (Multi-Pack)</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2251832337465783.html">USBLC6-2SC6 ESD Protection</a></td>
<td>1</td>
<td>$1.50 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800498728983.html">1N4148 T4 Diodes</a></td>
<td>67</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://lowprokb.ca/collections/switches/products/kailh-choc-low-profile-switches">Choc Switches</a></td>
<td>67</td>
<td>$45.00 USD</td>
</tr>
<tr>
<td><a href="https://chosfox.com/collections/low-profile-keycaps/products/chocfox-wob?variant=42753190461634">Chosfox CFX Keycaps</a></td>
<td>Alphas + Mods</td>
<td>$60.00 USD</td>
</tr>
<tr>
<td><a href="https://lowprokb.ca/collections/keycaps/products/mbk-low-profile-pbt-blank-keycaps?variant=44794533511332">MBK Spacebars (Optional)</a></td>
<td>3</td>
<td>$3.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255801062616407.html">4mm M2 Screws</a></td>
<td>8</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256804349544912.html">M2 Screw Inserts</a></td>
<td>8</td>
<td>$1.50 USD</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/Adhesive-Bumper-106-PC-Spherical-Square/dp/B06XPCLN23/">Bumpons</a></td>
<td>1 Pack</td>
<td>$10.00 USD</td>
</tr>

</table><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[A Three Month Review of Kagi Search & The Orion Web Browser]]></title><description><![CDATA[There's a new web search in town! I spent the start of 2024 kicking the tires on Kagi's paid search and their Orion web browser.]]></description><link>https://flatfootfox.com/a-three-month-review-of-kagi-search-the-orion-web-browser/</link><guid isPermaLink="false">660b5a15988db63845c04062</guid><category><![CDATA[Review]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sat, 06 Apr 2024 20:41:09 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2024/04/Screenshot-2024-02-04-at-8.21.08-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2024/04/Screenshot-2024-02-04-at-8.21.08-AM.png" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser"><p>There&#x2019;s a new web search in town. No, it&#x2019;s not a re-skin of Bing results. No, it&#x2019;s not an AI powered tool chasing this particular moment of Large Language Model (LLM) hype. <a href="https://kagi.com">Kagi</a> is an honest to goodness general purpose search engine with a simple proposal:</p><p><em>Pay us $10 USD a month and we&#x2019;ll provide you with good search results.</em></p><p>A few of you just got very excited, and some others just closed this tab. Kagi is a very unusual product in 2024. The tool isn&#x2019;t without its quirks, but it&#x2019;s the sort of service you can easily write a few thousand words discussing. If you&#x2019;re interested in technology and the web, it&#x2019;s worth signing up and kicking their tires.</p><p>Kagi&#x2019;s been building buzz for the last year, but I&#x2019;d been dragging my heels on making the switch. It turns out the way to keep New Year&#x2019;s tech resolutions is to replace your app defaults. Here&#x2019;s my assorted thoughts after a January, February, and March without Google and Safari.</p><h2 id="paying-for-search">Paying For Search</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiPricing.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1256" height="655" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiPricing.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiPricing.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiPricing.png 1256w" sizes="(min-width: 720px) 720px"><figcaption>Kagi&apos;s trial isn&apos;t time bound. You can start whenever you&apos;d like without any extra pressure.</figcaption></figure><p>It&#x2019;s hard not to talk about the state of the web as a whole when discussing search engines. The internet&#x2019;s having a bit of a moment. Longstanding websites like Twitter and Reddit are making antagonistic moves against their user bases. Google and Amazon are dealing with a floor of affiliate links and search engine optimized sludge. Looming on the horizon, LLM outputs threatens to swallow the web whole.</p><p>Out of all of this comes Kagi. On the face of it, they&#x2019;re <em>yet another</em> subscription looking to monetize some small silver of your daily life. If you take a step back however, some interesting things happen when you pay for search.</p><p>Kagi describes themselves as &#x201C;user-centric search&#x201D;. You&#x2019;re paying them directly for the service they&#x2019;re rendering. This has two significant and immediate effects: Kagi doesn&#x2019;t need to show you ads, and their search has to be good.</p><p>Not having ads always makes for an enjoyable browsing experience. As cable TV has proven time and time again, paid services and advertising aren&#x2019;t completely incompatible which one another. For the time being however Kagi is happy to be one of the increasingly few internet oases that isn&#x2019;t actively trying to sell you something every time you interact with it.</p><p>This has substantial benefits on the privacy side of things. Since you&#x2019;re the customer and not the product, Kagi doesn&#x2019;t need to integrate extensive surveillance and tracking technologies into their tool. They don&apos;t log searches, associate searches with your accounts, and they even spell out, in plain English, the intent of the <a href="https://kagi.com/privacy">5 cookies</a> they use.</p><p>The privacy angle is nice, but <a href="https://duckduckgo.com">Duck Duck Go</a> has also been around for a bit. They offer an anonymized ad-supported privacy-focused search. Building a successful web service at scale purely off of ad revenue has become increasingly tricky however, so Duck Duck Go&#x2019;s search results are largely a proxy for Microsoft&#x2019;s middling <a href="https://www.bing.com">Bing</a> search. (Sorry Bing.)</p><p>The exciting thing about Kagi is that <em>you&#x2019;re paying them for search</em>. If it&#x2019;s not good, no one&#x2019;s going to subscribe for a second month. The company actively pitches the aligned incentives that come from being an ad-free, paid search tool. They get their money from building a good search engine. They don&#x2019;t benefit from driving traffic to sponsored links, affiliate vendors, or vertically integrated products. Kagi&#x2019;s search is pretty good as a result.</p><h2 id="kagi-search">Kagi Search</h2><!--kg-card-begin: html--><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiSearchResults.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiSearchResults.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1156" height="1112" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiSearchResults.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiSearchResults.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiSearchResults.png 1156w" sizes="(min-width: 720px) 720px"><figcaption>Kagi&apos;s search results don&apos;t take much getting used to.</figcaption></figure><!--kg-card-begin: html--></a><!--kg-card-end: html--><p>It&#x2019;s tricky to objectively judge something like the quality of search results. (Although there are some <a href="https://danluu.com/seo-spam/">good attempts to do so</a>.) When search results are good, you hardly notice them. When they&#x2019;re off, it&#x2019;s immediate and apparent. Not to harp on Bing again, but everyone&#x2019;s had that experience of searching on a new work computer or public terminal and struggling to find what they&#x2019;re looking for before realizing they&#x2019;re not using Google.</p><p>Web search quality is vibes based. And the vibes are off. People have been whinging for a while now about whether or not <a href="https://www.theatlantic.com/technology/archive/2023/09/google-search-size-usefulness-decline/675409/">Google Search results are getting worse</a>. While drafting this blog post, Google themselves admitted they need to make some <a href="https://www.theverge.com/2024/3/5/24091099/google-search-high-quality-results-spam-ai-content">significant changes</a> to their search results to filter out AI generated spam and SEO reputation laundering.</p><p>All of this is to say that I&#x2019;ve been satisfied with the search results Kagi provides. They &#x201C;pass the vibe check&#x201D; so to speak. While testing Kagi I rarely (if ever) experienced that mental whiplash of viewing &#x201C;off&#x201D; search results only to realize I&#x2019;m &#x201C;that other search engine&#x201D;. Kagi&#x2019;s search is good. It&#x2019;s not a party trick. It&#x2019;s not situational. It&#x2019;s good search. You should <a href="https://kagi.com/pricing">give it a try</a>.</p><!--kg-card-begin: html--><div class="post-pull-right"><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiFlatFootFox.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiFlatFootFox.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1157" height="1313" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiFlatFootFox.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiFlatFootFox.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiFlatFootFox.png 1157w" sizes="(min-width: 720px) 720px"><figcaption>Oh hey, that&apos;s me!</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>When searching for a question online, Kagi does a good job of surfacing results from human-centric discussion sites like Reddit or Stack Overflow. When searching for cooking recipes, I notice a slightly more diverse set of food blogs then with Google Search. Comparison shopping or searching for information about a mainstream product does seem to fall down some of the same SEO pitfalls that Google has. This feels more like an artifact of the current state of the web then a particular search engine deficiency however.</p><p>The actual browsing experience with Kagi is pleasant. It sticks with the established Google-style search results page. It delivers links with blurbs, sub-links, and embedded rich content. If you search for something with significant video or image results, Kagi has a familiar strip of thumbnails inviting you to pivot over to one of those dedicated search views. It&#x2019;s a very familiar search experience you can transition into easily. Kagi&#x2019;s focus is on the search engine itself, and they&#x2019;re not trying to be cute with unusual user interface innovations.</p><!--kg-card-begin: html--><div class="post-pull-left"><a href="https://flatfootfox.com/content/images/2024/04/KagiBlocklist.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiBlocklist.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="862" height="743" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiBlocklist.png 600w, https://flatfootfox.com/content/images/2024/04/KagiBlocklist.png 862w" sizes="(min-width: 720px) 720px"><figcaption>Nine of the top ten blocked domains on Kagi&apos;s naughty list are Pintrest.</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>That&#x2019;s not to say Kagi doesn&#x2019;t have some unique touches of its own however. Once you&#x2019;ve gotten familiar with the initial search experience, there&#x2019;s a lot of additional functionality you can start taking advantage of within Kagi.</p><p>On the search side, Kagi lets you adjust the ranking of pages within your personal search results. If your recipe searches are anything like mine, that might involve bumping up <a href="https://www.seriouseats.com">SeriousEats.com</a> links. If you&#x2019;ve been burned by one too many <a href="https://www.allrecipes.com">AllRecipes.com</a> recipes, you can even go as far as hiding all pages in that domain from your search results.</p><!--kg-card-begin: html--><div class="post-pull-right"><a href="https://flatfootfox.com/content/images/2024/04/KagiLenses-2.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiLenses-2.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="403" height="361"><figcaption>Kagi&apos;s lenses can even limit search results to Fediverse instances.</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>If you&#x2019;re a web search power user, Kagi&#x2019;s <a href="https://help.kagi.com/kagi/features/lenses.html">Lens</a> functionality may be of particular note to you. If you find yourself frequently searching for programming support for example, you can narrow down Kagi&#x2019;s view of the web to just the handful of official documentation sites and support forums for the language you&#x2019;re working with. It&#x2019;s a bit of a brute force approach to cutting out blog spam, but you were probably scrolling down to the <a href="https://stackoverflow.com">StackOverflow.com</a> or <a href="https://dev.to">Dev.to</a> links anyways, right? This tool&#x2019;s a bit more situational, but it&#x2019;s nice seeing some thought put into how to push the search experience forward.</p><!--kg-card-begin: html--><div class="post-pull-left"><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiImageSearch.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiImageSearch.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1278" height="866" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiImageSearch.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiImageSearch.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiImageSearch.png 1278w" sizes="(min-width: 720px) 720px"><figcaption>Kagi&apos;s image search is no slouch either.</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>There&#x2019;s just something comforting about using opinionated software that doesn&apos;t feel like it has gone through eight code reviews and six departmental presentations. Kagi&#x2019;s clearly built by a team who cares about search. When searching for an image, Kagi provides you with links to go to the page the image is on <em>and</em> a direct link to the image itself. No more having to right click and fiddling around for the &#x201C;Open Image In New Tab&#x201D; option! Fancy that. These nice touches range from quick shortcuts all the way to letting users upload a <a href="https://help.kagi.com/kagi/features/custom-css.html">custom CSS user theme</a> for the site.</p><p>If you&#x2019;re hesitant to make the full time switch to Kagi, the &#x201C;Bang&#x201D; functionality they borrowed from Duck Duck Go is of particular note. If you prefix a search with <code>!g</code>, Kagi will instead forward that search query over to Google. <code>!r</code> sends you to Reddit&#x2019;s internal search instead. <code>!yt</code> is a direct link to YouTube search, etc. Duck Duck Go has cataloged <a href="https://duckduckgo.com/bangs">thousands</a> of these integrations.</p><p>I didn&#x2019;t find myself needing a Google escape hatch that often. When I did, it was mostly when searching for local businesses. Kagi has integration with Apple Maps and Yelp for finding nearby restaurants, but Google Maps remain notably strong in that one area. I use the <code>!g</code> shortcut maybe once a week on the unlimited plan, but they&#x2019;re instrumental when working with Kagi&#x2019;s lower priced tiers. Speaking of which;</p><h2 id="don%E2%80%99t-bother-with-kagi%E2%80%99s-5month-search-tier">Don&#x2019;t Bother With Kagi&#x2019;s $5/Month Search Tier</h2><!--kg-card-begin: html--><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiSearches.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiSearches.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1060" height="677" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiSearches.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiSearches.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiSearches.png 1060w" sizes="(min-width: 720px) 720px"><figcaption>If you&apos;re reading this, you use way more than 300 searches a month.</figcaption></figure><!--kg-card-begin: html--></a><!--kg-card-end: html--><p>Kagi&#x2019;s updated their pricing a few times throughout the life of the product, so go <a href="https://kagi.com/pricing">check</a> and make sure this section is still relevant. Their initial offerings were focused on providing a few different metered tiers. Deciding between 300, 500, and 700 search queries a month harkened back to the days of paying for individual SMS messages. And not in a good way.</p><p>Luckily Kagi&#x2019;s prices have been coming down. They now offer two main tiers: $5 USD per month for 300 searches, and $10 USD per month for unlimited searches. (There&#x2019;s also a $25 USD per month tier with early access to upcoming features for super-fans.) Kagi will give you 100 free searches when you sign up that are time unconstrained. If you&#x2019;re interested in seeing just a few sample search queries, feel free to open a new tab and run some test searches now. You don&#x2019;t need to set aside a week to give the tool a proper test the moment you sign up.</p><p>Ten dollars per month is a <em>lot</em> to ask for search when an several ad-supported alternative exists. The five dollar tier sounds like a good compromise on paper, but I found it not worth the effort after having used it throughout January.</p><p>It&#x2019;s hard to overstate just how often technology-minded folks search throughout the day. I apparently do about 45 Kagi searches a day on average. In reality this shakes out to about 30 searches on a weekday, and 60 searches on the weekend when I&#x2019;m deep diving into side projects. This doesn&#x2019;t include the Google searches I still perform during the day on my work computer. Just to drive this point home, I managed to perform over 600 searches on an unlimited plan during the month of March while out of the country and completely disconnected from the internet for a week.</p><p>Limiting myself to ten high quality Kagi searches a day in January actually wasn&#x2019;t <em>too</em> difficult. The <code>!g</code> <a href="https://help.kagi.com/kagi/features/bangs.html">Google shortcut</a> doesn&#x2019;t count against your Kagi search total. However, there&#x2019;s a lot of mental overhead in deciding which search engine to use. Looking for programming help? That&#x2019;s a job for Kagi. Just looking for <code>Local Pizza Brewpub Menu</code>? That&#x2019;s a job for Google.</p><p>You can <em>technically </em>get through a month on the $5 plan. I ran out of searches a day and a half before next month&#x2019;s auto-renewed batch of 300 searches. (Kagi doesn&#x2019;t start billing you per-search. You just get an upsell notice and an option to go back to Google or Bing.) The 300 search plan unfortunately just isn&#x2019;t a very pleasant experience. I&#x2019;d find myself wincing any time I accidentally typed a query I already knew the result of &#xA0;like <code>Serious Eats Channa Masala</code> into Kagi&#x2019;s search during my metered month.</p><p>If you want to experiment with Kagi after your 100 free searches, do yourself a favor and jump straight into the $10 USD per month plan. You&#x2019;ll get a better feel for Kagi&#x2019;s search results by the end of your experimentation month if you&#x2019;re not frequently trying to remember to use the <code>!g</code> shortcut for menial searches throughout the day.</p><p>That&#x2019;s my big takeaway for this blog post. Hopefully Kagi&#x2019;s prices continue to come down to the point where they don&#x2019;t need to offer a metered plan period. This critique may not be accurate anymore by the time you read it. If your spouse is also into tech, the cost may work out a bit better for you on their $14 USD per month two seat &#x201C;Duo&#x201D; plan.</p><h2 id="kagi-ai">Kagi &amp; AI</h2><!--kg-card-begin: html--><a href="https://flatfootfox.com/content/images/2024/04/KagiFastGPT.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiFastGPT.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="838" height="1029" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiFastGPT.png 600w, https://flatfootfox.com/content/images/2024/04/KagiFastGPT.png 838w" sizes="(min-width: 720px) 720px"><figcaption>It&apos;s still surreal seeing myself paraphrased by an AI. For what it&apos;s worth, there&apos;s a sneaky hallucination in #5. Ergogen doesn&apos;t create finalized PCB files, and KiCAD&apos;s needed to generate the Gerber files.</figcaption></figure><!--kg-card-begin: html--></a><!--kg-card-end: html--><p>Kagi has been exploring the Large Language Model and AI tools space along with most of Silicon Valley. Their core offering is a model known as FastGPT. It&#x2019;s a ChatGPT 3.5-style LLM with the ability to perform web searches. The answers it provides are citation-heavy, similar to <a href="https://copilot.microsoft.com">Microsoft&#x2019;s Bing Chat / Copilot</a>.</p><p>FastGPT is available as a standard interactive chat experience, but Kagi also exposes it a few other ways. They have a &#x201C;Summarizer&#x201D; web app which takes web page URLs and can provide short summaries or a bullet point list of key moments. The Summerizer tool also provides a conversational interface to further interrogate the context of a particular web page.</p><p>Finally, Kagi&#x2019;s most prominent FastGPT integration is its &#x201C;Quick Answers&#x201D; functionality. At the top of every search result page is a &#x201C;Quick Answers&#x201D; button you can tap to get a brief 2-3 sentence answer to your query. The response appears inline in a new panel at the top of the search results page. As its name implies, FastGPT is designed to begin typing its response nearly instantaneously.</p><p>Quick Answers is a nice way to begin dabbling in large language models. You don&#x2019;t need to remember, &#x201C;Oh right, I can have a conversation with a chatbot about this question.&#x201D; It&#x2019;s just always right there at the top of the page if your query seems like one of those things that should be trivial for &#x201C;the internet&#x201D; to answer. Kagi will also save you the tap and automatically generate a Quick Answer response for some queries that it detects are in the form of a question.</p><p>Overall FastGPT responds about as well as other consumer LLMs. It does unfortunately produce occasional hallucinations depending on the query. Kagi as a company has a <a href="https://blog.kagi.com/kagi-ai-search">history</a> with AI technology, so these experiments most likely will not be flashes in the pan. Overall the company seems to be taking a balanced approach when using these tools to help users search and interrogate documents further, rather than just using them as search engine replacements. These LLM experiments aren&#x2019;t as core to the product as, say, the <a href="https://arc.net">Arc browser</a> or <a href="https://search.brave.com">Brave Search</a>. All of the AI functionality can be disabled if you don&#x2019;t want to use LLM-based tools. An unlimited number of interactions are included with Kagi&#x2019;s $10 USD per month unlimited search plan, so you can think of it as a bonus functionality if you&#x2019;re still in the experimental phase with AI tools and don&#x2019;t want to spring for an OpenAI or Microsoft Copilot premium offering.</p><h2 id="the-orion-browser">The Orion Browser</h2><!--kg-card-begin: html--><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/Screenshot-2024-04-01-at-10.32.02-PM.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/Screenshot-2024-04-01-at-10.32.02-PM.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1754" height="893" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/Screenshot-2024-04-01-at-10.32.02-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/Screenshot-2024-04-01-at-10.32.02-PM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2024/04/Screenshot-2024-04-01-at-10.32.02-PM.png 1600w, https://flatfootfox.com/content/images/2024/04/Screenshot-2024-04-01-at-10.32.02-PM.png 1754w" sizes="(min-width: 720px) 720px"><figcaption>Kagi <em>may</em> have gotten a glance at Apple&apos;s homework.</figcaption></figure><!--kg-card-begin: html--></a><!--kg-card-end: html--><p>Speaking of browsers, Kagi has one! Wait wait, don&#x2019;t close the tab yet! Orion&#x2019;s not Chromium based!</p><p>All kidding aside, there&#x2019;s been a trend as of late of companies announcing a &#x201C;new&#x201D; browser which is essentially a re-skin of Google Chrome leveraging the same underlying Chromium rendering engine. They&#x2019;ll sometimes have new functionality which couldn&#x2019;t fit within the framework of a traditional browser extension, or some novel UI layer justifying the separate product. The core experience is largely still dictated by Chromium&#x2019;s foundation however.</p><p>The consolidation of rendering technologies and the risk browser monopolies propose to the open web is a bit outside of the scope of this blog post. Rest assured though, Orion&#x2019;s not Chromium based.</p><p>It&#x2019;s <a href="https://webkit.org">Webkit</a> based!</p><p>Orion uses the same rendering engine Apple uses for its Safari web browser. (Incidentally, Orion is only available on macOS and iOS.) Webkit was the basis for Chromium, so this may be splitting hairs a bit. They&#x2019;re important hairs though.</p><p>For those not familiar with the current state of the browser scene on macOS, there&apos;s generally two paths you can take. You can go with Apple&apos;s relatively basic but power efficient Safari web browser, or you can use a more feature rich but battery hungry web browser like <a href="https://www.google.com/chrome/">Google&apos;s Chrome</a> or <a href="https://www.mozilla.org/en-US/firefox/new/">Mozilla&apos;s Firefox</a>. (This isn&#x2019;t a perfect characterization in all contexts, but it&#x2019;s a good enough rubric.) I was personally a happy Safari user, but Chrome is useful for a few resource intensive web applications like Google Docs or browser-based video conferencing.</p><!--kg-card-begin: html--><div class="post-pull-right"><a href="https://flatfootfox.com/content/images/2024/04/KagiExtensions.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiExtensions.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="948" height="632" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiExtensions.png 600w, https://flatfootfox.com/content/images/2024/04/KagiExtensions.png 948w" sizes="(min-width: 720px) 720px"><figcaption>FireFox&apos;s Bitwarden has been working flawlessly in Orion.</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>One of Chrome&#x2019;s largest selling points over Safari is its extensive 3rd party extension support. Safari technically has 3rd party extensions as well, but they&#x2019;ve never quite caught on as much as the Chrome or Firefox ecosystems. Safari&#x2019;s APIs aren&#x2019;t as robust, and unlike its open source peers you need a paid Apple developer account to publish Safari extensions.</p><p>Put simply, Orion is Safari&#x2019;s browser technology with Chrome and Firefox&#x2019;s extension support grafted onto it. That&#x2019;s not a metaphor. Orion&#x2019;s developers have added support for approximately 70% of the WebExtensions API onto Orion. The end result is that you can use Chrome or Firefox&apos;s UBlock Origin, Bitwarden, and LastPass extensions on a Webkit-based browser. It&apos;s an impressive technical feat and it works surprisingly well.</p><!--kg-card-begin: html--><div class="post-pull-left"><a href="https://flatfootfox.com/content/images/2024/04/OrioniOS-1.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/OrioniOS-1.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="289" height="563"><figcaption>Honestly the biggest thing to get used to in this whole Kagi &amp; Orion experiment was the placement of the menu icon in the iOS app.</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>The rest of Orion is largely what you&#x2019;d expect. There&#x2019;s a few UI flourishes such as the option for vertical tabs, but they&#x2019;ve largely stuck with what worked in Safari. It&#x2019;s a fast snappy browser that&#x2019;s not going to drain your battery life. It has all the usual password management, tab syncing, focus reading modes, and other modern touches you&#x2019;d expect.</p><p>Speaking of syncing, Orion also has a mobile version for iOS. Its development started after the macOS version, and it can occasionally feel like it had less time in the oven so to speak. (It&#x2019;s the only app in recent memory I&#x2019;ve had actually crash the iOS Springboard.) It&#x2019;s still probably the best Safari alternative I&#x2019;ve tried on iOS... but Safari on iOS is the platonic ideal of mobile web browsing. Any rough edges are going to stick out like a sore thumb.</p><p>The biggest benefit of using both the macOS and iOS versions of Orion is tab syncing and Apple&#x2019;s Continuity functionality. Using only the desktop app can feel a bit disjointed when suddenly your phone&#x2019;s trying to open Hand Off links in Safari. Dealing with the occasional rough edge on your phone helps keep the overall experience a bit more seamless. That alone may be a hard sell, but there&#x2019;s one other piece of functionality both the desktop and mobile apps have which may keep you around.</p><!--kg-card-begin: html--><div class="post-pull-right"><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiYouTube.jpg"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiYouTube.jpg" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1179" height="1283" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiYouTube.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiYouTube.jpg 1000w, https://flatfootfox.com/content/images/2024/04/KagiYouTube.jpg 1179w" sizes="(min-width: 720px) 720px"><figcaption><a href="https://blog.kagi.com/orion-features">Huh</a>.</figcaption></figure><!--kg-card-begin: html--></a></div><!--kg-card-end: html--><p>Despite supporting the well regarded UBlock Origin, Orion also has ad blocking built in by default. This is mostly pitched from a privacy and performance perspective. Browser ads <em>do</em> have a measurable impact on battery life while on the go, and there are an absurd amount of advertisers looking to track you around the web.</p><p>Online advertising pays for the news sites you read, the social media you browse, and the videos you watch. Still, they&#x2019;re obtrusive and dangerous enough that <a href="https://techcrunch.com/2022/12/22/fbi-ad-blocker/">even the US&#x2019;s FBI is recommending ad blockers for your own safety</a>. If you&#x2019;re part of the one third of all web citizens who use an ad blocker, Orion&#x2019;s got you covered out of the box. It&#x2019;s just a little odd to see a company openly brag about blocking YouTube ads and supporting Picture-In-Picture and background audio without a YouTube Red subscription.</p><p>Interestingly for a modern browser, <a href="https://orionfeedback.org/d/3882-open-source-the-browser">Orion isn&#x2019;t open source</a>. This logistically makes sense given the size of the development team. There are still ways of checking some of their privacy-oriented claims (a packet sniffer can verify that it&#x2019;s zero telemetry for example), but it&#x2019;s worth pointing out given their otherwise privacy-focused posture. Safari isn&#x2019;t fully open source either, so that may not be a sticking point for most macOS and iOS users.</p><h2 id="kagi-other-browsers">Kagi &amp; Other Browsers</h2><!--kg-card-begin: html--><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiSafari.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiSafari.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1176" height="726" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiSafari.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiSafari.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiSafari.png 1176w" sizes="(min-width: 720px) 720px"><figcaption>Orion isn&apos;t strictly necessary to jump ship to Kagi.</figcaption></figure><!--kg-card-begin: html--></a><!--kg-card-end: html--><p>If you decide to skip Orion, you can still use <a href="https://help.kagi.com/kagi/getting-started/setting-default.html">Kagi as your default search engine</a> in other browsers. In most cases, you just need to dig into the search preferences and set <code>https://kagi.com/search?q=%s</code> as your default search provider. Chrome or Firefox will insert your query in the place of the <code>%s</code> when you enter search terms into your address bar and you&#x2019;ll be all set from there.</p><p>Frustratingly, Apple didn&#x2019;t get the memo on user-definable search providers. Safari is hardcoded to Google, Bing, Yahoo (Bing-powered), Duck Duck Go (powered by a variety of search sources including Bing), and Ecosia (a Bing-powered search that uses its ad revenue to plant trees). Hopefully Kagi will get added to Safari&#x2019;s search engine list if it gets popular enough. Google&apos;s currently paying Apple <a href="https://www.theverge.com/2023/10/26/23933206/google-apple-search-deal-safari-18-billion">$18 billion dollars</a> to remain the default search engine in iOS, so we&apos;ll see what happens.</p><p>In the meantime, Kagi has a Safari browser extension for both the desktop and mobile clients which allow you to fake Kagi as your default search provider. The extension sees a search sent to one of the Safari default providers, parses the URL, grabs your search term, and then instantly redirects you to the Kagi search page for that term. In my limited testing it appears to perform the redirect imperceptibly fast. The extension doesn&#x2019;t prevent you from visiting Google if you need to either. You can still use the <code>!g</code> override to get back to Google Search. If you do encounter flakey behavior, you can set the extension to only work on a specific search engine like Duck Duck Go or Ecosia if you run into trouble with accidental redirects. Apparently it was buggier in earlier versions, but it appears to have worked out the issues.</p><h2 id="doing-the-mental-calculus">Doing The Mental Calculus</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/StarTrekHmpf.gif" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="245" height="175"><figcaption>Hmpf.</figcaption></figure><p>I&#x2019;m not quite sure what to make of Kagi after my first three months with it. It&#x2019;s <em>really</em> good search. Is it $10 USD monthly search? That&#x2019;s the tougher question.</p><p>There&#x2019;s some amount of mental calculus involved when deciding to make the switch to a paid service like Kagi. I&#x2019;m not personally looking for a zero tracking search service or seeking to completely de-Google my life. I care about privacy, but I still own a smart speaker or two. I&#x2019;ve got an iPhone, but Google still manages my email.</p><p>I&#x2019;m on the fence about spending a bit more time with Kagi as my default search engine. The gaps in local search aren&#x2019;t that egregious, but in its current state it still feels like a $50 USD per year indulgence rather than a $100 USD per year splurge. Maybe try to find a friend to go halfsies on with a Duo plan?</p><p>One last factor to consider is Kagi&#x2019;s recent partnership with Brave Search for use of their search index. Brave is a relatively new browser company helmed by Mozilla&#x2019;s ousted CEO Brendan Eich. Since his departure from Mozilla, Eich has continued to defend his <a href="https://en.wikipedia.org/wiki/Brendan_Eich#Appointment_to_CEO_and_resignation">homophobia</a>, <a href="https://www.nytimes.com/2020/12/22/business/brave-brendan-eich-covid-19.html">spread Covid misinformation</a>, and generally introduced a slew of scammy crypto functionality within Brave.</p><p>After <a href="https://kagifeedback.org/d/2808-reconsider-your-partnership-with-brave">pushback from their userbase</a> about this partnership, Kagi&#x2019;s CEO responded that the company is not yet in a position to be able to take moral stands.</p><blockquote>I understand that this has affected many of you in a negative way, creating a sense of betrayal that&apos;s against the very ethos of Kagi. I want to address this and be crystal-clear: any semblance of support for discrimination is completely against our principles. The rationale behind our choice was purely based on technological merits and business strategy, including the quality and cost-effectiveness of the service, as well as a critical need for redundancy and diversification in our data sources. The decision was treated the same as getting results from Google or Yandex (to which different groups of users in our userbase object to for various different reasons).</blockquote><blockquote>Kagi is currently not in the position to be fully independent. Searching the web is incredibly hard and Microsoft spent 20 years and billions of dollars building Bing, and it is still, let&apos;s say, suboptimal. Definitely not at the level people would pay for it. It is very hard for a small startup with many orders of magnitude less resources to crawl/index/rank the entire web and for it to be so good that people would pay for.</blockquote><blockquote>...</blockquote><blockquote>Choosing to focus on our mission to provide the best search results in the world is the only practical position we can have. This is not because we are ignorant to issues impacting societies across the globe, but because it is impractical for us to deal with them all. We cannot solve all of the world&#x2019;s problems, human rights issues, conflicts and wars, but we have instead devoted our passion and energy to solving one problem that we believe is within our grasp, and that is the problem of web search, which is what Kagi is known and loved for. We intend to do that to the best of our ability.</blockquote><p>Man, this sucks.</p><p><a href="https://www.404media.co/friendship-ended-with-google-now-kagi-is-my-best-friend/">404 Media</a> also recently reported on Kagi&apos;s stance when it comes to manually manipulating search results in their service. The hypothetical discussed in the Kagi forums was whether or not the search engine should present suicide hotline information when someone searches for self harm-related topics. The company pushed back on this proposal saying they do not have any &quot;moral, political, religious, social or any similar kind of bias&quot; they want to explicitly code into their algorithms.</p><p>Arguing that Kagi &quot;does not have any implicit bias built by us that is not search quality based&quot; is a remarkable comment to hear from a CEO in 2023. Particularly when the company is eager to explore the burgeoning AI space. Everyone brings their own biases to the table when building a product. The best anyone can do is be aware of their blindspots and be open and honest about where they&apos;re coming from.</p><p>Kagi as a company likes to discuss their moral stances when there&apos;s only an upside. They frequently advertise their aligned incentives, and they bragged about going <a href="https://blog.kagi.com/celebrating-20k">&quot;hard mode on&quot;</a> when searching for an ethical t-shirt vendor. When it comes to more nuanced or messy topics however, Kagi&apos;s default approach appears to be hoping that not engaging with a topic is the same as not having a stance on the topic. I can&apos;t see this position being tenable forever.</p><h2 id="closing-thoughts">Closing Thoughts</h2><!--kg-card-begin: html--><a href="https://flatfootfox.com/content/images/size/w1000/2024/04/KagiHomepage.png"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/04/KagiHomepage.png" class="kg-image" alt="A Three Month Review of Kagi Search &amp; The Orion Web Browser" loading="lazy" width="1293" height="878" srcset="https://flatfootfox.com/content/images/size/w600/2024/04/KagiHomepage.png 600w, https://flatfootfox.com/content/images/size/w1000/2024/04/KagiHomepage.png 1000w, https://flatfootfox.com/content/images/2024/04/KagiHomepage.png 1293w" sizes="(min-width: 720px) 720px"><figcaption>Everything else aside, Kagi&apos;s mascot is adorable.</figcaption></figure><!--kg-card-begin: html--></a><!--kg-card-end: html--><p>I&#x2019;ve been dragging my heels wrapping up this blog post. Originally this was supposed to be a <em>two month</em> evaluation of Kagi. I needed a bit more time to get screenshots for this blog post though, so I decided to give myself an extra month to gather my thoughts on the tool. </p><p>I continue to be impressed by the search experience on Kagi. The results are solid, and the search page is pleasant to browse. Throughout the month I kept stumbling on nice touches. I recently discovered a website I was searching for was down, only to be delighted to find an <a href="https://archive.org">Archive.org</a> link in the result&#x2019;s kebab menu. These folks know how people interact with the web and want to make a great search experience.</p><p>The one thing I struggle with Kagi is to identify who its core user base is. For all the talk of Kagi&#x2019;s aligned incentives with their customers, I can&#x2019;t shake the feeling that I don&#x2019;t know who they&#x2019;re targeting. Duck Duck Go currently handles some amount of general privacy or Google-specific search concerns. So... Tech enthusiasts who would pay for a premium search experience, but aren&#x2019;t turned off by LLM integrations? Orion is a privacy focused browser for people with strong opinions about Chrome&#x2019;s Manifest v3 API transition who also don&#x2019;t mind closed sourced tools?</p><p>There&#x2019;s an unusual tension running throughout Kagi. They&#x2019;ve had to hedge their bets throughout the development of the product. Maybe we&#x2019;re just in a particularly compromising moment in tech. But that pragmatism can cut both ways.</p><p>After this three month experiment, I&apos;m pausing my Kagi subscription. I might hang on to the Orion browser for a little bit longer. $10 USD is a lot to pay per month for search. That&apos;s more than the entry tier for most streaming services. I could see myself hopping back onboard once Kagi gets their prices down to $5 USD per month.</p><p>It&apos;ll be a pragmatic technology decision though. Tool X has a better experience than Tool Y justifying Z Cost.</p><p>Kagi is the type of service that would really benefit from a clearly defined user base who pays for the service not just because of the functionality of the tool, but because it&apos;s the type of search they&apos;d like to see in the world. I&apos;m a sucker for that type of narrative. I&#x2019;m interested in any company that foregoes traditional venture capital funding and attempts to align their incentives with their customers. Kagi truly does appear to be trying their best, but I feel they&apos;ve already had a few moments that peel back that early adoptor zeal.</p><p>Maybe it&apos;ll resonate more with you. Kagi&apos;s technology is good enough that it should be on your radar. So my final takeaway is: <a href="https://kagi.com">Try it!</a> Kagi gives you a hundred free searches to kick its tires. See how things go. If you do want to give it a proper try after that, please just do yourself a favor and jump straight into the unlimited plan.</p>]]></content:encoded></item><item><title><![CDATA[The TypeBoy Mk II]]></title><description><![CDATA[The Mark II is a revision to the original TypeBoy split ergonomic keyboard. It once again uses a TypePak cartridge to house all the primary keyboard components.]]></description><link>https://flatfootfox.com/the-typeboy-mk-ii/</link><guid isPermaLink="false">65b1b999988db63845c03ecc</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sat, 27 Jan 2024 20:16:43 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2024/01/TypeBoy_MkII.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_MkII.jpg" alt="The TypeBoy Mk II"><p></p><p>Huh. So it&#x2019;s been an interesting few months.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Ars.png" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="775" height="740" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_Ars.png 600w, https://flatfootfox.com/content/images/2024/01/TypeBoy_Ars.png 775w" sizes="(min-width: 720px) 720px"><figcaption>Oh dang.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>Last Fall I published my writeup on the <a href="https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/">TypeBoy Keyboard &amp; The TypePak Cartridge</a>. It&#x2019;s a split ergonomic keyboard with a twist: The keyboard&#x2019;s microcontroller and battery are housed on a daughterboard built into a Game Boy Advance cartridge. It was a fun nostalgic indulgence, and I was happy to see it featured on the always delightful <a href="https://kbd.news/TypeBoy-TypePak-2103.html">Keyboard Builder&#x2019;s Digest</a>. The next thing I knew, it was popping up on <a href="https://www.theverge.com/2023/8/29/23851443/simply-slot-the-typepak-into-a-keyboard-with-a-compatible-game-boy-cartridge-slot-flip-the-power-swi">The Verge&#x2019;s storystream</a> and <a href="https://arstechnica.com/gadgets/2023/08/the-mechanical-keyboard-that-runs-on-game-boy-cartridge-shells/">Ars Technica</a> was reaching out for a comment. I&#x2019;m still floored with all of the positive coverage and feedback.</p><p>Getting featured in two of my favorite tech blogs probably would have been the highlight of my 2023 had I not been getting married a few weeks later. Needless to say I&#x2019;ve been a little busy.</p><p>But I&#x2019;m back with a new keyboard design! It&#x2019;s... very similar to my previous keyboard design. That&#x2019;s right folks, I&#x2019;ve achieved one of the elusive milestones of hobbyist electronics: I created a cost saving reusable design and actually reused it in a followup project.</p><h2 id="introducing-the-mark-ii">Introducing the Mark II</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Comparison.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_Comparison.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy_Comparison.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy_Comparison.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The original TypeBoy and the new Mark II.</figcaption></figure><p>The TypeBoy MkII is another TypePak-compatible 58-key split ergonomic keyboard. If you didn&#x2019;t get a chance to read my <a href="https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/">initial writeup</a>, the TypePak is a small cartridge containing all of the electronics needed to drive a mechanical keyboard. It houses a Bluetooth XIAO microcontroller, a LiPo battery, a shift register, and a Sharp Memory Display. (If you manage not to accidentally crack it while assembling things.) The TypePak allows you to quickly move a microcontroller between keyboards, but a large part of its appeal is just the aesthetics. The TypePak cartridge slot takes up a bit more space than a typical Pro Micro header stack, but it&#x2019;s certainly a head turner.</p><p>While I was overall incredibly happy with how the initial TypeBoy design turned out, there were a few small issues that needed addressing. The largest impetus for making a new keyboard was a mistake in the routing of the original TypeBoy&apos;s power switch. The oversight left the right half permanently stuck in the &quot;on&quot; position. It worked fine in day to day usage, but I logged in on one too many Mondays to discover my keyboard&#x2019;s battery had died over the weekend.</p><p>Rather than doing a straight revision on the initial design, the Mark II experiments in a few areas. The largest deviation from the original TypeBoy is the case design. The original TypeBoy used a 3D printed case loosely inspired by the <a href="https://github.com/GEIGEIGEIST/TOTEM">GEIST Totem</a>. It was <em>fine</em>, but my aging printer gave me a surprising amount of trouble for that build. A bit more tinkering probably would have solved the rough spots I was having with it, but I decided to try a different approach.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Sandwich.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_Sandwich.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy_Sandwich.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy_Sandwich.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The layers of the TypeBoy Mk II and its cartridge slot.</figcaption></figure><p>The TypeBoy MkII instead uses a take on the &#x201C;PCB Sandwich&#x201D; design. The keyboard&#x2019;s switches, cartridge connector, and other hardware are all attached to the main PCB. If you&#x2019;d like to make this keyboard, you technically only need to fabricate the main PCB. Underneath the main board however are 2mm worth of hotswap sockets and exposed key switch pins. It&#x2019;s not strictly necessary to cover these up, but most people like having a flat protective bottom for their keyboard.</p><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/tumblr_mj91rdaMDx1s1na2eo1_500.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="500" height="547"><figcaption>Japan&apos;s original Game Boy box.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>To protect the underside of the Mark II, I skipped my usual 3D printed route and instead had a pair of inert PCBs made to completely cover the bottom. They feature silkscreen line art inspired by the Game Boy and Game Boy Advance. They&#x2019;re a little minimalist as far as PCB art goes, but it was something I didn&#x2019;t have too much trouble whipping together in Figma in an afternoon. To keep the nostalgia trend going, they&#x2019;re loosely based on the line art design of the original Japanese Game Boy box.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Bottom_Front-1.png" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="400" height="600"><figcaption>Great artists borrow, right? I&apos;m <em>pretty</em> sure that&apos;s not a standard Tetris board.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>I could have stopped there, but this is a sandwich, right? I wanted to include a top piece as well. The TypeBoy Mark II is still using the bright red Choc Red Pro switches from my old <a href="https://flatfootfox.com/the-chonkv-keyboard/">ChonkV</a> build, and I wanted something purple to cover them up.</p><p>Many traditional keyboard builds will use what&#x2019;s known as a &#x201C;Switch Plate&#x201D;. This is a layer of the case which as a square cutout for every key that the switch is designed to snap into. It provides a lot of extra stability to keyboard builds using MX switches, but it&#x2019;s less necessary for Choc switch keyboards. They rest fairly sturdily in their hotswap sockets already, and the switch plate only sits 0.5mm above the main PCB.</p><p>The TypeBoy Mk II eschews a full switch plate and instead just has a small PCB running around the border of the keys. This not only obscures the bright red housing of the switches, but it also covers the right angle power switch, reset button, and rotary encoder. It rests a full 4.5mm above the main PCB.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_PCBs.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_PCBs.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy_PCBs.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy_PCBs.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The bottom, middle, and top pieces. The bottom piece has two different designs.</figcaption></figure><p>All three parts of this PCB sandwich are held together by a 12mm long M2 screw and matching nut. A set of spacers go between each layer to provide a bit more rigidity to the build.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy-Carts.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy-Carts.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy-Carts.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy-Carts.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>Ah, that&apos;s better.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>As silly as it sounds, one of my priorities for the TypeBoy MkII was to make the cartridge slot more symmetrical. It was aligned nicely with the keys on the initial TypeBoy PCB, but I hadn&#x2019;t considered how things would look once I added the case. The Mark II has a nice balanced design, in part to the keyboards new layout.</p><p>The original TypeBoy used a modified <a href="https://josefadamcik.github.io/SofleKeyboard/build_guide_choc.html">Sofle</a> layout. I&#x2019;m still a sucker for 58-key boards, and I was curious to try out a Choc-spaced Sofle configuration. Somehow the tweaked layout never fully clicked for me. I still use my original Sofle on a daily basis, and my hands just never managed to get used to the more compact layout on the TypeBoy. I did experiment with a bit of pinky splay on it, so maybe I&#x2019;ll chalk it up to that.</p><p>In the end I decided to go back to a straitlaced ortholinear layout. I couldn&#x2019;t resist adding a bit of row stagger to the modifiers, if only to make the spacebars frame the cartridges a bit more pleasantly. My thumbs still occasionally get confused between the layer key and the command key, but overall it&#x2019;s been a much more pleasant typing experience. I&#x2019;m certainly up for trying some gentle column stagger in the future, but for now I&#x2019;m happy being one of those row and column aligned ortholinear weirdos.</p><p>Between the new case design and the updated layout, the TypeBoy MkII&#x2019;s already checked one of my biggest boxes for this refresh. The ergonomically shaped plastic design of the initial keyboard was a little awkward to travel to and from the office with. This new PCB sandwich approach resulted in a keyboard that&#x2019;s surprisingly solid. There&#x2019;s very little flex or give to it, and it seems to do a better job handling a ride in my backpack.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Encoder.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="2000" height="1125" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_Encoder.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy_Encoder.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2024/01/TypeBoy_Encoder.jpg 1600w, https://flatfootfox.com/content/images/size/w2400/2024/01/TypeBoy_Encoder.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>Look who&apos;s back! The SIQ-02FVS3 thumb wheel is great... when it works.</figcaption></figure><p>The rest of the TypeBoy Mark II&#x2019;s hardware is pretty straightforward. I&#x2019;m still a &#xA0;fan of right angle power switches and pushbuttons for these types of mechanical keyboards. Originally I had the reset button and power switch together on the top of the long edge of the keyboard. It wasn&#x2019;t until about halfway through the routing of this board that I realized there was plenty of room for the power switch next to the cartridge on the short edge of the keyboard. The new placement really helps lean into the Game Boy vibes, and I&#x2019;m glad I caught it before I sent this design off to the fab.</p><p>The final piece of hardware is the low profile rotary encoder. The SIQ-02FVS3 is back! I&#x2019;m frankly a little obsessed with the idea of using a volume-style encoder wheel on keyboards. It&#x2019;s always struck me as a little silly to put so much effort into having the lowest profile possible on a mechanical keyboard, only to add a knob that sticks out 5mm on top of everything else. The SIQ-02FVS3 even has a push button action like most knob-style rotary encoders!</p><p>Of course, if you read the original <a href="https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/">TypeBoy</a> writeup, you know I have a love hate relationship with this particular encoder. Now seems as good a time as ever to get into the Mark II&#x2019;s flaws.</p><h2 id="room-for-improvement">Room for Improvement</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy-Sockets.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy-Sockets.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy-Sockets.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy-Sockets.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>My 3D printer can&apos;t help but crash the party.</figcaption></figure><p>I still can&#x2019;t get the dang SIQ-02FVS3 encoder to work consistently! On the original TypeBoy I eventually gave up and tried using the SLLB510100 slide wheel. I had a few SIQ-02FVS3 wheels leftover after the build however, and some original TypeBoy PCBs with compatible footprints. After a bit of trial and error, I eventually managed to get one of the encoders working with the TypeBoy&#x2019;s ZMK firmware.</p><p>The design of the rotary encoder is nice enough that I gave the SIQ-02FVS3 one more chance in the Mark II. The end result is that it works fine on the left half of the keyboard, but it refuses to send any signals on the right half. I&#x2019;m <em>pretty</em> sure I have the right side / back half of the PCB routed correctly. The best I can tell, these parts just have a shockingly high failure rate. They&#x2019;re unfortunately surface mount components, so the encoders are not exactly easy to breadboard and test before you solder them.</p><p>The one encoder I got working feels <em>really</em> nice to use. It&#x2019;s poking out from the PCB a perfect amount, and it&#x2019;s easy to just casually run your thumb across. Still, given my experience with this part on my last two builds, I may have to eventually give up my dream of using these little wheels for future keyboards. Hopefully I can find a similar part out there.</p><p>The last few goofs are thankfully smaller in nature. The TypeBoy Mk II has a very particular 150mm x 100mm shape. While I was considering updating the TypeBoy, the fine folks over at <a href="https://splitkb.com">SplitKB.com</a> started experimenting with the idea of offering a generic machine milled aluminum keyboard case with DIY Ergogen projects in mind. Typically premium keyboard cases are molded to fit a specific keyboard, but their upcoming <a href="https://github.com/splitkb/Zenestra">Zenestra</a> concept just provides you with a 150mm x 100mm blank slate to design around. The Zenestra&#x2019;s rounded rectangle was a fun design constraint to work within, and my intention was to have the Mark II be compatible with it if the case does eventually go up for sale.</p><p>Unfortunately, somewhere in my design process I got some wires crossed and accidentally used M2 screw holes instead of M3 screw holes. This is fine for my current PCB sandwich TypeBoy Mark II build, but it does mean that I&#x2019;ll need to run another revision whenever the Zenestra comes out if I decide to try out their case. Whoops.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Whoops.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_Whoops.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy_Whoops.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy_Whoops.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>I still can&apos;t believe this got through. &#x1F62C;</figcaption></figure><p>My original plan in the meantime was to use some nice purple M3 washes in-between the PCB layers. I would have left the gaps of the keyboard exposed as an aesthetic choice. Unfortunately I honestly ended up scrambling to find some M2 screws of the proper size I could get shipped out quickly to wrap this project up. I ditched the washer idea and created a simple quick 3D printed insert for the two layers. It doesn&#x2019;t have quite the same industrial look I had originally planned, but it did make the overall build a bit more sturdy. Every time I try to get out of 3D printing, they pull me back in.</p><p>The last flub&#x2019;s a minor one. I swear I measured-twice and then measured-twice again before <s>cutting</s> fabricating these PCBs. Somehow the silkscreen for the Game Boy Advance inspired bottom piece has the button callouts place on the opposite side of the board. Arg! I also was experimenting for the fist time with specifying a placement of JLCPCB&#x2019;s order number watermark and hiding the info off somewhere tasteful on the silkscreen. Unfortunately I forgot to check the box to actually enable that option on my order. Ah well.</p><p>If you&apos;re interested in creating your own TypeBoy Mk II, the M3 screw size and silkscreen issues have been updated in the <a href="https://github.com/ImStuBTW/typeboy_mkii">GitHub</a> repository.</p><h2 id="build-of-materials">Build of Materials</h2><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px;">
<tr class="post-table-header">
<th style="border-top-right-radius: 0px;">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px;">Price</th>
</tr>
<tr>
<td><a href="https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/">TypePak Cartridge</a></td>
<td>2</td>
<td>$20 USD</td>
</tr>
<tr>
</tr><tr>
<td><a href="https://jlcpcb.com">TypeBoy PCB Via JLCPCB</a></td>
<td>3 Fives Pack</td>
<td>$45 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800103876564.html">Game Boy Cartridge Slot</a></td>
<td>2</td>
<td>$5.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800103876564.html">SIQ-02FVS3 Thumb Wheel</a></td>
<td>2</td>
<td>$6 USD</td>
</tr>
<tr>
<td><a href="https://www.mouser.com/ProductDetail/642-MJTP1117">Right Angle Pushbutton</a></td>
<td>2</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.mouser.com/ProductDetail/612-EG1213">Right Angle Switch</a></td>
<td>2</td>
<td>$1.50 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256803687338432.html">Choc Hotswap Sockets</a></td>
<td>58</td>
<td>$12.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800498728983.html">1N4148 T4 Diodes</a></td>
<td>58</td>
<td>$3.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256805260407528.html">Choc Switches</a></td>
<td>58</td>
<td>$28.00 USD</td>
</tr>
<tr>
<td><a href="https://mkultra.click/mbk-legend-keycaps/">Choc Keycaps</a></td>
<td>Alphas + Mods</td>
<td>$60.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256803547633472.html">12mm M3 Screws</a></td>
<td>18</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256804700714045.html">M3 Washers</a></td>
<td>54</td>
<td>$10.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800148575548.html">M3 Nuts</a></td>
<td>18</td>
<td>$5.00 USD</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/Adhesive-Bumper-106-PC-Spherical-Square/dp/B06XPCLN23/">Bumpons</a></td>
<td>1 Pack</td>
<td>$10.00 USD</td>
</tr>

</table><!--kg-card-end: html--><p>The triple-PCB setup was a bit of a splurge for this build. The shipping ramps up after the first PCB, so it&apos;s only about $20 USD if you want to skip the PCB sandwich. It seems silly to own two sets of completely insert PCBs, but I really do feel they helped improve this design. I&#x2019;m not sure if I&#x2019;ll be able to justify the extra cost in the future, but they were a nice Christmas gift last year.</p><p>Overall I&#x2019;m really happy to see the TypePak design philosophy pay off. Once you have the microcontroller situation squared away, a set of keycaps you like, and some key switches on hand, creating another keyboard variant is a relatively cheap affair. You just need to buy a new set of hotswap sockets, fabricate a few PCBs, and order a new pair of Game Boy cartridge slots.</p><h2 id="conclusion">Conclusion</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2024/01/TypeBoy_Bottom-1.jpg" class="kg-image" alt="The TypeBoy Mk II" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2024/01/TypeBoy_Bottom-1.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2024/01/TypeBoy_Bottom-1.jpg 1000w, https://flatfootfox.com/content/images/2024/01/TypeBoy_Bottom-1.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>This revision of the TypeBoy should be sticking around for a good while.</figcaption></figure><p>I&#x2019;m trying to keep this writeup short and sweet. Despite the 2,500+ words at this point, the Mark II really is an iterative update. I didn&#x2019;t touch on the firmware much in this writeup, but that&#x2019;s because I hardly needed to touch my original <a href="https://zmk.dev">ZMK</a> configuration. Even the key matrix definition stayed the same between these two updates.</p><p>If you&apos;re interested in learning more about the TypePak, I&apos;ve got all the details and some build photos in the <a href="https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/">original post</a> about it. It shouldn&#x2019;t go unsaid that the Mark II is another keyboard created with the <a href="https://github.com/ergogen/ergogen">Ergogen</a> keyboard layout generator. My <a href="https://flatfootfox.com/ergogen-introduction/">guide</a> of Ergogen is miraculously still up to date and relevant if you&#x2019;re curious what goes into building a keyboard like these. If you&#x2019;re interested in the purple Game Boy inspired keycaps, I did a whole writeup about <a href="https://flatfootfox.com/design-your-own-low-profile-keycaps-with-fk-custom/">FK Caps&#x2019; custom key printing service</a> last year as well.</p><p>That&#x2019;s all for now. The TypeBoy MkII&#x2019;s Ergogen config files, KiCAD PCBs, and ZMK config are all up on <a href="https://github.com/ImStuBTW/typeboy_mkii">GitHub</a>. Likewise, the TypePak has its <a href="https://github.com/ImStuBTW/typeboy_and_typepak">own repository</a>. If you&#x2019;ve got any questions, comments, or general shout outs, feel free to hit me up on <a href="https://tech.lgbt/@flatfootfox">Mastodon</a>.</p>]]></content:encoded></item><item><title><![CDATA[The TypeBoy Keyboard & The TypePak Cartridge]]></title><description><![CDATA[A split ergonomic keyboard that houses its microcontroller inside of a Game Boy Advance cartridge.]]></description><link>https://flatfootfox.com/typeboy-keyboard-typepak-cartridge/</link><guid isPermaLink="false">64b19ad6988db63845c03670</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sat, 19 Aug 2023 16:03:03 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/08/TypeBoy-Hero.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Hero.jpg" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge"><p>Welcome to my latest keyboard design! The TypeBoy is a fairly standard split ergonomic keyboard with a very non-standard microcontroller setup. Your eyes don&apos;t deceive you: This is a keyboard that needs a Game Boy Advance cartridge to function.</p><p>More specifically, it needs a TypePak! I&apos;ve been spending a lot of time in the <a href="https://flatfootfox.com/ergogen-introduction/">Ergogen</a> keyboard layout generator lately, and I recently finished building a <a href="https://github.com/sanni/cartreader">Sanni Open Source Cartridge Reader</a>. These two worlds collided in my head and it dawned on me that a keyboard&apos;s microcontroller stack could <em>probably</em> fit in the shell of a Game Boy cartridge. A bit of tinkering in KiCAD later, and suddenly <s>this monstrosity</s> the TypePak was born.</p><h2 id="the-typepak">The TypePak</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Hero.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Hero.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Hero.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Hero.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The TypePak and its cartridge slot.</figcaption></figure><p>The TypePak is a custom keyboard controller PCB housed inside of an aftermarket Game Boy Advance cartridge shell. It features Bluetooth connectivity, ZMK support, a low-power monochrome display, a built in LiPo battery, 9 GPIO pins, and 8 dedicated output pins. Simply slot the TypePak into a keyboard with a compatible Game Boy cartridge slot, flip the power switch, and you&apos;ve got yourself a working wireless keyboard. (After flashing the appropriate firmware and keymap, naturally.)</p><p>To little surprise, this is all pulled off thanks to the nRF52840 system on a chip. The nRF52840 is the heart of the popular <a href="https://nicekeyboards.com/nice-nano/">Nice!Nano</a> microcontroller, and boasts support for the wireless keyboard firmware ZMK. While the TypePak technically could have used a bare nRF52840 module, that would have required building out a decent amount of support hardware such as a USB-C port and battery charging circuitry. Instead, I opted to leverage the petite <a href="https://www.seeedstudio.com/Seeed-XIAO-BLE-nRF52840-p-5201.html">Seeedstudio XIAO nRF52840</a> microcontroller. (Affectionally called the &quot;XIAO BLE&quot; by folks who don&apos;t feel like memorizing a random five digit number.) This compact microcontroller has everything you need for a keyboard built into one small package, and it <em>almost</em> fits inside of a Game Boy Advance cartridge.</p><p>One of the downsides of the XIAO nRF52840 over the Nice!Nano is its relatively small number of exposed GPIO pins. The XIAO has just enough pins to power a small split keyboard, but the TypePak would be limited in the context of larger split boards or unibody builds. To rectify this, the TypePak also includes a <a href="https://www.digikey.com/en/products/detail/texas-instruments/SN74HC595DT/1571266">74HC595 shift register</a>. This provides the TypePak with 8 dedicated output pins to use for columns in a keyboard matrix. Pair that with 9 free GPIO pins on the XIAO BLE, and you&apos;ve got plenty of room for rows, columns, and other ancillary hardware.</p><p>The other prominent component on the TypePak is a <a href="https://github.com/karnadii/sharp_memory_display_breakout">LS011B7DH03</a> Sharp Memory Display. This is the same 160x68 monochrome &quot;transflective LCD&quot; used on the <a href="https://nicekeyboards.com/nice-view">Nice!View</a>. There&apos;s not quite enough space in the cartridge for a proper Nice!View module, so the TypePak instead provides a ribbon cable connector and acts as a breakout board for a raw LS011B7DH03 display.</p><p>Finally, the TypePak has a <a href="https://www.amazon.com/gp/product/B09FLX9VZD/">401020 LiPo</a> battery soldered directly underneath the PCB. (Fun fact, the model number of these batteries tells you the dimensions. The 401020 is 40mm x 10mm x 20mm.) This battery is slightly smaller than the batteries you usually find tucked underneath an Arduino Pro Micro. It has 80 mAH of power compared to the typical 110 mAh LiPos. Thankfully these smaller batteries still have enough power to be reasonably useful. The main half of the TypeBoy gets about a week of battery life, while the secondary side of the keyboard should last you about two months. Just plug the left side in on Sunday nights and you should be fine.</p><p>All of these components are held together by a small custom PCB. The Game Boy cartridge slot expects PCBs to be between 0.8mm and 1mm thick. Building a 0.8mm thick PCB gives you a tiny sliver more room when building your keyboard, but some PCB manufacturers charge extra for non-standard colors on thin boards. Thankfully 1mm boards work just as well if you&apos;re going for a particular aesthetic. The 1mm PCBs also help provide a bit more friction to keep the cartridge in the slot a little better than the 0.8mm PCBs if you&apos;re planning on doing a lot of traveling with the TypeBoy.</p><h2 id="the-typepak-pinout">The TypePak Pinout</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Diagram.png" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1394" height="863" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Diagram.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Diagram.png 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Diagram.png 1394w" sizes="(min-width: 720px) 720px"><figcaption>The TypePak&apos;s PCB has a noticeable cutout to give the LiPo battery an extra 1mm of space.</figcaption></figure><p>A Game Boy cartridge has 32 pins on its edge connector. The XIAO nRF52840 and the shift register have a total of 26 pins. (This includes the reset and NFC pins on the underside of the XIAO nRF52840.) Rather than leave twenty precent of the TypePak&apos;s cartridge pins unused, several of the important pins are exposed on both ends of the cartridge&apos;s edge connector. The battery output, power pins, reset pins, and a few others are duplicated so that you can more easily route some of the support hardware on your keyboard PCB.</p><p>Speaking of which, the TypePak does not have a built in power switch or reset button of its own. (Technically the XIAO does have a reset button, but it&apos;s underneath the cartridge&apos;s plastic casing.) You&apos;ll need to create out these components on the keyboard itself. The whole idea of this setup is to evoke the stylings of a classic Game Boy, so a large chunky power switch is honestly a welcome addition.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Switch.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Switch.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Switch.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Switch.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The power switch and reset buttons need to be exposed outside of the TypePak.</figcaption></figure><p>This does give the TypePak a slight quirk. The battery isn&apos;t physically attached to the microcontroller unless the cartridge is plugged into a keyboard and its power switch is set to the on position. If you&apos;d like to charge the keyboard, you can&apos;t just dangle the TypePak off of a USB outlet.</p><p>Every pin on the microcontroller is broken out onto the TypePak&apos;s edge connector. This includes pins that are used for components such as the Sharp Memory Display. If you decide not to include the display, or want to try adding on additional SPI devices, you shouldn&apos;t have any trouble getting to MISO, MOSI, SCK, and the LCB&apos;s CS pin.</p><p>The cartridge slot is easy enough to add to a keyboard design. Rather than adding two rows of through hole pins, you add one row of surface mount pads. The only quirk is on reversible PCB layouts. On the left keyboard the cartridge will be inserted with the first pin oriented towards the top of the PCB. On the right side of the keyboard, the last pin will be oriented towards the top of the PCB. The solution to this is to create a rainbow of via traces connecting the front pads to their mirrored counterpart on the back side. Thankfully the cartridge slot&apos;s width gives you a good amount of otherwise unused board space to trace these routes.</p><h2 id="building-a-typepak">Building A TypePak</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-PCB.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-PCB.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-PCB.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-PCB.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The TypePak is essentially a fancy breakout board.</figcaption></figure><p>Assembling the TypePak PCB is a bit of an interesting challenge. The PCB needs to sit flush on the bottom cartridge shell, so this was my first PCB design to fully use surface mount components. I had experience with small surface mount diodes in the past, so the microcontroller and display capacitors weren&apos;t too much of an issue. Even the shift register isn&apos;t too tricky if you have steady hands. The display connector however...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Connector.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Connector.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Connector.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Connector.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The display connector makes the shift register&apos;s pin look absolutely spacious.</figcaption></figure><p>This component is not a beginner-friendly soldering job. It has 0.5mm wide pins with a 0.5mm gap between them. If you haven&apos;t used solder flux and solder wick in the past, this project will teach you their usefulness.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Flux.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Flux.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Flux.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Flux.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>You&apos;ll need more than just a steady hand here.</figcaption></figure><p>Solder flux helps promote bonding between wires and pads. It prevents solder from clumping up, and lets you move excess solder around more easily. Even then, you&apos;re likely to get some bridging between pads.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Wick.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Wick.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Wick.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Wick.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>Solder wick to the rescue!</figcaption></figure><p>That&apos;s where solder wicks come in. They can help remove excess solder from a board and clean up uncooperative shorts.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Display.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Display.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Display.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Display.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The finished display connector.</figcaption></figure><p>After some patient soldering, wicking, re-soldering, and additional wicking, you should be able to get the display connector situated cleanly. Honestly, I&apos;m a little upset with myself for not getting on board with solder wicks sooner. </p><p>Besides taking it slow, the most important part of soldering the display connector is making sure all of it&apos;s pins are aligned. It has two mounting pads on the side, so you can solder one of those pads into place before tackling the actual data pins. JLCPCB and some other PCB fabs also have the display connector in their <a href="https://jlcpcb.com/partdetail/HRS_Hirose-FH12_10S_0_5SH_55/C506791">parts library</a>. If it&apos;s not prohibitively expensive, I may look to just have my PCB fab deal with these connectors in the future. Once you&apos;ve got everything soldered, make sure you use a continuity tester to make sure the pins aren&apos;t bridged anywhere.</p><p>After dealing with the display connector, the XIAO, capacitors, and shift register shouldn&apos;t be any issue. A bit of solder flux can help the shift register as well. Just solder one of the pins to anchor the rest into their properly aligned position. Everything else is just standard smd soldering. Maybe invest in some <a href="https://www.amazon.com/gp/product/B07V6G4V72/">reverse action tweezers</a> along with the flux and solder sick.</p><p>One you have everything but the battery soldered into place, you can start contemplating the cartridge shell. The side of the plastic shell will need a cutout for the TypePak&apos;s USB-C port, but we actually need to go a bit further than that. When I first mentioned the XIAO nRF52840, I said it <em>almost</em> fit in a GBA cartridge. Between the TypePak cartridge and the XIAO&apos;s PCB, the USB-C port is just a millimeter or so too tall. We&apos;ll also need to carve out some additional headroom for the USB-C port while creating a cutout for it.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Dremel.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Dremel.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Dremel.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Dremel.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>BUZZZZZZZZZZZ!!!</figcaption></figure><p>That&apos;s right, this is a project requiring some power tools.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Knife.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Knife.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Knife.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Knife.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>Knife to meet you.</figcaption></figure><p>There&apos;s probably a few different ways of tackling this sort of cutout, but I personally opted for a Dremel and a clamp. Grab a face mask and protective eyewear for good measure. You&apos;re going to be kicking up a lot of plastic dust. The easiest way to keep track of what parts you need to remove is to make small scoring marks with a hobby knife while the PCB&apos;s in the case.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Clamp.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="2000" height="1500" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Clamp.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Clamp.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2023/08/TypePak-Clamp.jpg 1600w, https://flatfootfox.com/content/images/size/w2400/2023/08/TypePak-Clamp.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>You should do this outside, obviously.</figcaption></figure><p>Remove the PCB, clamp one half of the cartridge shell down, sand a bit of the material away, unclamp the case, and reseat the PCB to see if it fits. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Bottom-1.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Bottom-1.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Bottom-1.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Bottom-1.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>It&apos;s difficult to get a perfectly clean look with this technique, but it&apos;s nice enough.</figcaption></figure><p>You&apos;ll want to repeat this process a half-dozen times. You can&apos;t add plastic back to the shell, so it&apos;s better to drill away too little than too much.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Tight.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Tight.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Tight.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Tight.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>Only making a side cutout doesn&apos;t provide quite enough room for the USB-C port.</figcaption></figure><p>Once you&apos;ve got the PCB sitting flush in the bottom piece, it&apos;s time to work on the top half. Drilling a side cutout for the USB-C port isn&apos;t enough here. &#xA0;You&apos;ll quickly find that the two halves of the case don&apos;t have enough room close.</p><p>My first instinct was to simply make a large rectangular cutout in the top of the cartridge shell. (You can see an example of this a bit later in this writeup.) Rather than completely taking the top off of the cartridge however, it&apos;s enough to simply shave off some of the plastic from inside the case. The cartridge is <em>just</em> thick enough that you can carve out the inside of the shell without actually disturbing the exterior of the shell.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Top.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Top.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Top.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Top.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The finished shell. It&apos;s got some more headroom now.</figcaption></figure><p>It&apos;s a tricky process and will require a few rounds of shaving, re-fitting, and shaving away again. In my experience, the end result hasn&apos;t been a <em>perfect</em> fit. The two halves are held together with two small plastic tabs on each side of the cartridge. After enough drilling, you should at least be able to get all four tabs to remain comfortably in place.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Drilling.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1173" height="1049" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Drilling.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Drilling.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Drilling.jpg 1173w" sizes="(min-width: 720px) 720px"><figcaption>You can see the two parts don&apos;t sit fully flush, but it&apos;s enough to keep the two halves of the shell locked together.</figcaption></figure><p>The center of the cartridge may bow out a bit, but there&apos;s also a screw that can help hold the cartridge together. There&apos;s a small gap in the cartridge if you know where to look, but it&apos;s not very noticeable on the transparent cartridge cases.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Battery.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Battery.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Battery.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Battery.jpg 1600w" sizes="(min-width: 720px) 720px"></figure><p>At this point we can go ahead and add the battery and close the cartridge up. In my experience however, it&apos;s pretty easy to accidentally leave a pin not fully soldered or have an accidental bridge somewhere. Rather than opening and closing the cartridge several times as you troubleshoot, now would be a good time to go and build your keyboard itself. The TypePak fits in a cartridge slot with the top half of the cartridge missing, so you can properly test everything over USB before continuing. If something doesn&apos;t work, it&apos;ll be easier to run some continuity tests before closing everything up.</p><p>Once you&apos;re happy that the keyboard and the TypePak are working, you can go ahead and solder the LiPo battery into place.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Caps-4.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Caps-4.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Caps-4.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Caps-4.jpg 1600w" sizes="(min-width: 720px) 720px"></figure><p>After that, carefully attach the Sharp Memory Display ribbon cable. Flip the latch up, slide the ribbon in over the top of the gray flap, and then push it back down.</p><p>Actually assembling the cartridge is... <em>really tight</em>. You need to slot the cartridge into place, slot the battery in beside it, and then do your best to fold the ribbon cable over so that the screen is pointing up at the cartridge&apos;s clear window. The process is a little tricky to photograph.</p><p>You might not get the screen 100% aligned with the window. I tried taping the screen down to the top shell, but that made it nearly impossible to actually attach the ribbon cable. In addition to needing to worry about the display while closing the two halves of the cartridge, you need to be mindful of the battery&apos;s position inside of the case. The LiPo battery has a tendency to slide up all the way to one side of the cartridge. The plastic lip of the battery likes getting pinched by the case as you try to close it.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Battery-3.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Battery-3.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Battery-3.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Battery-3.jpg 1600w" sizes="(min-width: 720px) 720px"></figure><p>Once you get the two pieces together, you have a nice compact cartridge of keyboard computing. Hopefully. The first cartridge I built ended up crushing the display between the cartridge shell and the top of the XIAO. It cracked the display instantly before I even had a chance to feel any resistance. Your milage may vary, but thankfully the second cartridge came together a bit easier. You really only need one display for a split keyboard, so I just left the second display out for this particular build. Hopefully things go a bit smoother for you. Just take things slow and be mindful of the stress you&apos;re putting on the different components.</p><p>Now that we&apos;ve got the TypePak built, we can turn our attention towards the TypeBoy.</p><h2 id="the-typeboy">The TypeBoy</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Bare.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Bare.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Bare.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Bare.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The TypeBoy in all its glory.</figcaption></figure><p>The TypeBoy is a fairly standard split keyboard with a 6x4+5 column staggered layout. If it looks familiar, that&apos;s because this is essentially a split version of the keyboard I designed for my <a href="https://flatfootfox.com/ergogen-introduction/">Let&apos;s Design A Keyboard With Ergogen v4</a> series. I&apos;ve fallen into a little bit of a rut with 58 key boards, but what can I say, I&apos;m a sucker for dedicated number keys.</p><p>The most striking aspect of the TypeBoy is naturally the large Game Boy cartridge slot on the side. This component replaces the standard microcontroller stack, and takes up slightly more PCB space than your standard Pro Micro or Nice!Nano setup. The cartridge slot has two plastic mounting legs, so aligning and soldering the pins is a breeze. Well, it&apos;s a breeze after that display connector at least.</p><p>The keyboard building scene has several low profile slide switch and pushbutton options, but I was able to take advantage of some taller components on this particular build. Since the hardware&apos;s going to be nestled up against the already tell cartridge slot, I was able to use nice chunky power switches and reset buttons. Both of them are of the right angle variety. The right angle reset button is a bit anachronistic for a Game Boy, but the power switch hits all the right nostalgia notes.</p><p>Finally, mechanical keyboards often include rotary encoders. These knobs can&apos;t do anything that a hotkey on your keyboard couldn&apos;t handle, but they&apos;re popular for quickly adjusting the volume on one&apos;s PC. Wouldn&apos;t you know, there&apos;s one last piece of Game Boy hardware that we can pay homage to. Nintendo&apos;s handhelds have had a variety of volume wheels and contrast knobs over their lifetime. I did some digging and tried to find a low profile encoder that would be suitable for the TypeBoy.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Rotary.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="900" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Rotary.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Rotary.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Rotary.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>Friendship ended with SIQ-02FVS3, now SLLB510100 is my best friend.</figcaption></figure><p>I originally tried working with the SIQ-02FVS3 rotary encoder. It&apos;s a true spinning wheel, but retains a push action so you can still send three signals like a traditional rotary encoder. Unfortunately I couldn&apos;t quite get it working with ZMK. I may have just had a bad batch of encoders, but I eventually swapped it out for a SLLB510100 thumb switch. Instead of a fully spinning knob, this thumb switch allows you to slide it to the left or right by several degrees, or to push in on the center of the switch. It&apos;s similar to controls you may have seen on 90s CD players or early 00s MP3 players. It&apos;s not a perfect fit for the Game Boy aesthetic, but it&apos;s close enough. They&apos;re also just a nice touch on low profile keyboards in general. I&apos;ll be experimenting a bit more with these in the future.</p><p>That&apos;s it for the hardware. The rest of the TypeBoy is a fairly standard Choc-spaced Sofle derivative with some splay on the last two columns for a bit of flair. Adding the cartridge slot and the thumb switch was more than enough experimentation for one build. You may have noticed a bodge wire in some of the pictures. There was one last wiring issue which I&apos;ve already resolved in the files hosted on the TypeBoy&apos;s GitHub repository, but I didn&apos;t want to wait for another batch of PCBs to fix it.</p><p>Now that I&apos;ve got a working keyboard, the last part of this build was to create an enclosure for it. (Note to self: Take more pictures during the bare PCB step!)</p><h2 id="the-typeboy-case">The TypeBoy Case</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Case-1.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="600" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Case-1.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Case-1.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Case-1.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>Tried something a little new for this keyboard build.</figcaption></figure><p>My previous two keyboards have both used a &quot;tray&quot; style 3D printed case. These cases are great for adding a bit of color to your keyboard and protecting the hotswap sockets, but I wanted to do something a little different this time around.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Case-Screw.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Case-Screw.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Case-Screw.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Case-Screw.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>I&apos;m finally getting a hang of these threaded screw inserts.</figcaption></figure><p>I knew I was going to be leaning specifically into the Game Boy Advance aesthetic. In addition to the whole cartridge thing, I also just picked up some some custom retro purple keycaps from FK Caps. (You can learn more about them in my <a href="https://flatfootfox.com/design-your-own-low-profile-keycaps-with-fk-custom/">recent writeup</a>.) With this in mind, I also wanted to try and obscure the Choc Red Pro switches I was re-using from my last keyboard build. The <a href="https://flatfootfox.com/the-chonkv-keyboard/">ChonkV</a> leaned into the red accents, but they&apos;d clash a bit here.</p><p>To that end I took some inspiration from <a href="https://github.com/GEIGEIGEIST">GEIST</a>&apos;s <a href="https://github.com/GEIGEIGEIST/TOTEM">full-height low-profile keyboard cases</a>. Having the edges of the case come right up to the top of the keycaps is a striking look and it would do a good job of mostly obscuring the bright red switches.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Case-Top.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Case-Top.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Case-Top.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Case-Top.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>It&apos;s almost as if 3D printers struggle to run in a garage when it&apos;s 106F/41C outside.</figcaption></figure><p>This case design is a little more complicated than what Ergogen can output on its own. I re-learned Autodesk Fusion 360 and ended up building the board in two pieces: The standard bottom tray and a single piece for the top. The top piece needed to be printed upside down for a variety of structural reasons, which means that the portion the keys slot into was left a little gnarly from the temporary supports. You don&apos;t see most of these rough spots when the keyboard&apos;s finally built.</p><p>I&apos;m not completely sure how I feel about the end result here. I knew my TypeBoy&apos;s PLA case wouldn&apos;t look as nice as the resin-printed cases GEIST used on the <a href="https://github.com/GEIGEIGEIST/TOTEM/tree/main/case">Totem</a> keyboard, but the current Texas heat wave gave me a <em>lot</em> more trouble than I expected while printing off this case design. I ended up giving the TypeBoy a duo-tone look with a gray bottom piece for the simple reason that I ran out of purple PLA during my prototyping. Thankfully this is the easiest to swap out component if I decide I&apos;d like to try and take another go at it. I&apos;d still like to experiment with this full-height low-profile case style in the future, but I might also take a break from 3D printing and try some FR4 PCB sandwiches next time. Stay tuned.</p><p>Tricky printing aside, the TypePak and TypeBoy are officially done! Now all that&apos;s left is to program it. </p><h2 id="the-firmware">The Firmware</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Closeup-1.png" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Closeup-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Closeup-1.png 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Closeup-1.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>The TypePak&apos;s ready for its close up.</figcaption></figure><p>After all the sturm und drang about cartridge slots and edge connectors, the firmware for the TypePak is relatively standard. It leverages ZMK since this is a wireless keyboard, but otherwise it&apos;s not pulling any unusual software tricks. As far as the firmware is concerned, it doesn&apos;t know that it&apos;s living on an odd removable daughterboard.</p><p>In case you&apos;re trying to build a keyboard with similar hardware, there&apos;s a few noteworthy aspects of this particular firmware build. First of all, it leverages a 74HC595 shift register to give the microcontroller a few extra pins. Next, it has the same LS011B7DH03 display as the Nice!View, but it doesn&apos;t actually actually use the Nice!View&apos;s wrapper. From the best I can tell, the Nice!View code is designed to pair with the Nice!Nano microcontroller, and things don&apos;t map up perfectly if you try running it on a different board.</p><p>Both of these bits of code are just serial device definitions. The screen uses ZMK&apos;s built in display support. The shift register meanwhile isn&apos;t too tricky to work with. Once you define the register, you can use it&apos;s pins as columns in a matrix just like you would with a standard microcontroller GPIO pin.</p><p>The only other piece of hardware on the TypeBoy is the thumb switch. It&apos;s wired up like three standard pushbuttons with a common ground, so it&apos;s not hard to get running in ZMK. You just define a &quot;<a href="https://zmk.dev/docs/config/kscan#composite-driver">Composite</a>&quot; key scan driver that uses a standard keyboard matrix for the keys themselves, and then a direct wiring setup for the thumb switch &quot;buttons&quot;.</p><p>ZMK is pretty well documented in the site&apos;s <a href="https://zmk.dev/docs/user-setup">getting started</a> guide. If you&apos;d like to poke around any of the aforementioned code, you can check out the TypePak&apos;s ZMK config on <a href="https://tech.lgbt/@flatfootfox">GitHub</a>.</p><p>With that, we&apos;ve finally got a fully functioning keyboard! Which begs a question.</p><h2 id="why-go-to-all-this-trouble">Why Go To All This Trouble?</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypeBoy-Left-1.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypeBoy-Left-1.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypeBoy-Left-1.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypeBoy-Left-1.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>The finished product and some GBA props.</figcaption></figure><p>Surely there must be <em>some</em> reason I&apos;m going to all these lengths, right? The TypePak and TypeBoy must offer some sort of benefit that you don&apos;t get from your standard mechanical keyboard build?</p><p>Not <em>particularly? </em>The XIAO BLE and a bare Sharp Memory Display module are cheaper than a Nice!Nano and Nice!View, but it&apos;s a wash when you factor in the other support hardware. The classic Pro Micro stack just needs some header pins. The TypePak needs a custom PCB, a cartridge shell, a cartridge slot, a display connector, a shift register, and several surface mount capacitors. Depending on the shipping fees of your suppliers, the TypePak and the Nice! combo cost roughly the same amount.</p><p>The components inside of the TypePak occupy a space that&apos;s roughly comparable to the traditional microcontroller stack, but the cartridge connector and the TypePak itself takes up considerably more room. It&apos;s fine for designs where the cartridge can hang off the side of the keyboard like the TypeBoy, but it might not fit every build.</p><p>One of the strengths of the TypePak is how easy it is to move from one keyboard to another. The mechanical keyboard community is particularly fond of machine pin headers, but I personally feel like I&apos;m going to break them every time I try inserting or removing a microcontroller that&apos;s using diode legs. This ease of moving a TypePak between keyboards is nice, but it&apos;s slightly hampered by the reality of firmware logistics. If you move from a 6x4+5 split keyboard to a 5x3+3 split keyboard, or from a split keyboard to a unibody build, you&apos;re most likely going to need a different keymap. The act of slotting the TypePak in will take two seconds, but you&apos;ll still have to re-flash the microcontroller for the new layout.</p><p>So... That mostly just leaves aesthetics and the hardware challenge. 3D printed case issues aside, I&apos;m really happy with how the TypePak and TypeBoy turned out on the aesthetics front. The cartridge slots in <em>exactly</em> how you&apos;d want it to, and the window on the TypePak is the perfect size for the display. The transparent cartridge really leans in nicely to those early aughts vibes, even if you don&apos;t go for the Atomic Purple version.</p><p>I&apos;m looking forward to leveraging these TypePaks for my next few keyboard builds. Now that the TypePak is actually built, it&apos;s just a couple of dollars per-keyboard for a new Game Boy cartridge slot.</p><h2 id="typepak-build-of-materials">TypePak Build of Materials</h2><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px;">
<tr class="post-table-header">
<th style="border-top-right-radius: 0px;">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px;">Price</th>
</tr>
<tr>
<td><a href="https://jlcpcb.com">TypePak PCB Via JLCPCB</a></td>
<td>1 Five Pack</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://www.digikey.com/en/products/detail/seeed-technology-co-ltd/102010448/16652893">XIAO nRF52840</a></td>
<td>1</td>
<td>$10.00 USD</td>
</tr>
<tr>
<td><a href="https://www.digikey.com/en/products/detail/hirose-electric-co-ltd/FH12A-10S-0-5SH-55/1110331">HFK110CT-ND Display Connector</a></td>
<td>1</td>
<td>$1.35 USD</td>
</tr>
<tr>
<td><a href="https://www.digikey.com/en/products/detail/samsung-electro-mechanics/CL21C561JBANNNC/3887492">560PF Capacitor</a></td>
<td>1</td>
<td>$0.15 USD</td>
</tr>
<tr>
<td><a href="https://www.digikey.com/en/products/detail/samsung-electro-mechanics/CL21B105KBFNNNG/3894467">1UF Capacitor</a></td>
<td>2</td>
<td>$0.10 USD</td>
</tr>
<tr>
<td><a href="https://www.digikey.com/en/products/detail/vishay-dale/ILBB0805ER301V/2574914">300 OHM Ferrite Beads</a></td>
<td>2</td>
<td>$0.20 USD</td>
</tr>
<tr>
<td><a href="https://www.digikey.com/en/products/detail/vishay-dale/ILBB0805ER301V/2574914">SN74HC595 Shift Register</a></td>
<td>1</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256801622787441.html">LS011B7DH03 Sharp Memory Display</a></td>
<td>1</td>
<td>$15.00 USD</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/gp/product/B09FLX9VZD/">401020 LiPo Battery (80 mAh)</a></td>
<td>1</td>
<td>$7.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256803793023444.html">Game Boy Advance Cartridge Shell</a></td>
<td>1</td>
<td>$3.50 USD</td>
</tr>

</table><!--kg-card-end: html--><p>The above table represents the parts needed to construct a single TypePak. You&apos;ll need to double everything except for the PCB order if you plan on making two. (JLCPCB fabricates PCBs in groups of 5 as a minimum.) If you&apos;re building two TypePaks, it&apos;s probably worth bumping the capacitor and ferrite bead orders up to 10. You don&apos;t want to have your entire project get stalled if you misplace one of the small components, and the bulk ordering pricing makes buying 4-6 units approximately the same cost as 10.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Case-11.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Case-11.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Case-11.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Case-11.jpg 1600w" sizes="(min-width: 720px) 720px"><figcaption>I personally like the transparent gray casings. The Atomic Purple TypePak is modeling the alternate cutout style here.</figcaption></figure><p>There&apos;s a variety of aftermarket Game Boy Advance cartridges available online. They primarily come in two varieties: Ones with small plastic dots on the inside of the label window, and those that don&apos;t. Make sure you get the version with the completely clear window. So far I&apos;ve tested the TypePak with the gray &quot;smokey&quot; clear, Atomic Purple, and standard clear casings. The Sharp Memory Display is clearly visible through all of them. I assume they&apos;d be similarly visible through the transparent red and transparent blue cases on the market.</p><p>One small note, most cartridge vendors mention that they&apos;re designed for &quot;bootleg&quot; PCBs. Authentic Game Boy Advance cartridge PCBs and shells have two small tabs on the inside to hold the PCB in place. These tabs aren&apos;t completely necessary, and they take up space that you could otherwise use for parts. The TypePak uses the &quot;bootleg&quot; PCB footprint and won&apos;t fit inside of an authentic cartridge. Don&apos;t be a monster and try to drill into a functioning Game Boy cartridge. These cartridge shells are cheap, widely available, and come in plenty of different colors.</p><h2 id="typeboy-build-of-materials">TypeBoy Build of Materials</h2><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px;">
<tr class="post-table-header">
<th style="border-top-right-radius: 0px;">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px;">Price</th>
</tr>
<tr>
<td><a href="https://jlcpcb.com">TypeBoy PCB Via JLCPCB</a></td>
<td>1 Five Pack</td>
<td>$20 USD (Incl. Slow Shipping)</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800103876564.html">Game Boy Cartridge Slot</a></td>
<td>2</td>
<td>$5.00 USD</td>
</tr>
<tr>
<td><a href="https://www.mouser.com/ProductDetail/Hirose-Connector/FH12A-10S-0.5SH55">SLLB510100 Thumb Switch</a></td>
<td>2</td>
<td>$8 USD</td>
</tr>
<tr>
<td><a href="https://www.mouser.com/ProductDetail/642-MJTP1117">Right Angle Pushbutton</a></td>
<td>2</td>
<td>$1.00 USD</td>
</tr>
<tr>
<td><a href="https://www.mouser.com/ProductDetail/612-EG1213">Right Angle Switch</a></td>
<td>2</td>
<td>$1.50 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256803687338432.html">Choc Hotswap Sockets</a></td>
<td>58</td>
<td>$12.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2255800498728983.html">1N4148 T4 Diodes</a></td>
<td>58</td>
<td>$3.00 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/3256805260407528.html">Choc Switches</a></td>
<td>58</td>
<td>$28.00 USD</td>
</tr>
<tr>
<td><a href="https://mkultra.click/mbk-legend-keycaps/">Choc Keycaps</a></td>
<td>Alphas + Mods</td>
<td>$60.00 USD</td>
</tr>
<tr>
<td><a href="https://github.com/ImStuBTW/TypeBoy_and_TypePak">3D Printed Case</a></td>
<td>Buy Your Buddy Some Filament</td>
<td>$20.00 USD</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/Adhesive-Bumper-106-PC-Spherical-Square/dp/B06XPCLN23/">Bumpons</a></td>
<td>1 Pack</td>
<td>$10.00 USD</td>
</tr>

</table><!--kg-card-end: html--><p>As I mentioned earlier, I&apos;ve generally found machine pin headers a bit too fiddly for my taste. The dream of DIY mechanical keyboards is that you can just move the expensive parts from socket to socket and keep your build costs low. Despite this, my Pro Micros have stayed put on my original Sofle, and my Nice!Nano is firmly planted on my ChonkV. The TypePak seems much more likely to see some movement between boards however.</p><p>If that dream becomes a reality, one of the TypePak based keyboards should run you about $50 USD when all is said and done. You still need to drop about $80 USD on the TypePaks, between $30-50 USD on switches, and another $50-70 USD on keycaps. Once you&apos;ve done that upfront cost however, iterating on designs and rapid prototyping should be a bit less taxing on one&apos;s budget. More or less, depending on your access to a 3D printer and how many bumpons you&apos;ve got clogging up your project drawer.</p><h2 id="acknowledgements">Acknowledgements</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/08/Giga40.png" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1001" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/Giga40.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/Giga40.png 1000w, https://flatfootfox.com/content/images/2023/08/Giga40.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>Original credit for this concept goes to mujimanic&apos;s Giga40 keyboard design.</figcaption></figure><p>The TypeBoy isn&apos;t the first mechanical keyboard which takes microcontroller cartridges. <a href="https://www.reddit.com/user/mujimanic/">mujimanic&apos;s</a> <a href="https://www.reddit.com/r/MechanicalKeyboards/comments/kut2nk/now_youre_playing_with_power_giga40_power/">Giga40</a> keyboard design and it&apos;s Famicom cartridges helped prove a low-profile Game Boy-centric version of this idea was worth pursuing.</p><p>The TypePak&apos;s display connector circuit is based off of <a href="https://github.com/karnadii">karnadii</a>&apos;s <a href="https://github.com/karnadii/sharp_memory_display_breakout">Sharp Memory Display breakout board</a> design. The TypePak&apos;s PCB is based off of templates from <a href="https://github.com/djedditt/">djedditt</a>&apos;s <a href="https://github.com/djedditt/kicad-gamepaks">kicad-gamepaks</a> library. The Game Boy cartridge slot KiCAD footprint was used from <a href="https://github.com/HDR">Martin Refseth</a>&apos;s <a href="https://github.com/HDR/Game-Boy-KiCad-Library">Game Boy KiCad Library</a>.</p><p>As usual, thanks to the <a href="https://discord.gg/DbCfZfZ">Absolem Club Discord</a> and their #Ergogen channel for answering my endless onslaught of questions. Particularly special thanks to <a href="https://github.com/petejohanson">Pete Johanson</a> for assisting with some <a href="https://zmk.dev">ZMK</a> troubleshooting when the low profile rotary encoders were giving me trouble. The ZMK firmware is heavily influenced by previous configs by <a href="https://github.com/GEIGEIGEIST/zmk-config-totem/tree/master/config">GEIST</a>, <a href="https://github.com/petejohanson/zaphod-config/tree/main/boards/shields/zaphod_lite">Pete Johanson</a>, and <a href="https://github.com/JonMuller/gerbers/tree/main/corne-choc-xiao">JonMuller</a>.</p><p>This keyboard is another derivative of <a href="https://josef-adamcik.cz/">Josef Adam&#x10D;&#xED;k</a>&apos;s original <a href="https://josefadamcik.github.io/SofleKeyboard/">Sofle Keyboard</a> layout. I need to start experimenting with other layouts at this point, but it&apos;s hard to beat that thumb cluster.</p><p>Finally, another shout out to <a href="https://github.com/GEIGEIGEIST">GEIST</a>, <a href="https://github.com/freya-irl">Freya</a>, <a href="https://github.com/bubbleology">Bubbleology</a> for their work on the <a href="https://github.com/GEIGEIGEIST/TOTEM">TOTEM</a> keyboard&apos;s case. It was a big inspiration for this build, and they pulled the concept off way better than I did.</p><h2 id="conclusion">Conclusion</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/08/TypePak-Angled.jpg" class="kg-image" alt="The TypeBoy Keyboard &amp; The TypePak Cartridge" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/08/TypePak-Angled.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/08/TypePak-Angled.jpg 1000w, https://flatfootfox.com/content/images/2023/08/TypePak-Angled.jpg 1600w" sizes="(min-width: 720px) 720px"></figure><p>I still can&apos;t believe this worked. Right up until it started typing, I felt like I bit off a bit more than I could chew with this particular design. It was my first XIAO BLE build, my first LS011B7DH03 breakout board build, my first time experimenting with thumb wheels, and my first time trying to cram everything inside of a Game Boy cartridge. I&apos;m a little astonished it all managed to come together. Part of me was worried this would just get written off as some dead end surface mount soldering experience.</p><p>A few people have asked me if I&apos;m going to try and establish the TypePak as a &quot;standard&quot; of some sort that designers build a keyboard around. We&apos;ll see how much interest there is in this particular build, but right now I think this is probably going to be relegated to exceptionally nostalgic do it yourselfers. The Dremel step of, &quot;Carve away plastic until it feels about right&quot; is a little too vague for a true guide at the moment, and right now these cartridges have a 50% rate of accidentally smashing the most expensive $15 USD part in the build. We&apos;ll see where things go in the future.</p><p>For now I&apos;m happy to get some typing in on my new keyboard. You can bet I&apos;m already thinking about where I&apos;ll take things next. Until then, you can view all of the KiCAD files, Ergogen configs, and ZMK keymaps for the TypePak and TypeBoy on <a href="https://github.com/ImStuBTW/typeboy_and_typepak">GitHub</a>. As always, feel free to give me a shout out on <a href="https://tech.lgbt/@flatfootfox">Mastodon</a> if you liked this project!</p>]]></content:encoded></item><item><title><![CDATA[Design Your Own Low-Profile Keycaps With FK Custom]]></title><description><![CDATA[FK Caps new FK Custom service makes it quick and easy to create low profile keycaps with unique legends.]]></description><link>https://flatfootfox.com/design-your-own-low-profile-keycaps-with-fk-custom/</link><guid isPermaLink="false">64971eb516eaa7195d0afc76</guid><category><![CDATA[Review]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sat, 24 Jun 2023 18:33:51 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/FK-Full-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/FK-Full-1.jpg" alt="Design Your Own Low-Profile Keycaps With FK Custom"><p>If you&apos;ve built a low profile keyboard, you&apos;re most likely already familiar with <a href="https://fkcaps.com/?a=FlatFootFox">FK Caps</a>. They&apos;re the team behind the popular MBK keycaps for Kailh Choc v1 switches. These keycaps make up the bulk of keycap options for Choc switches, and provide a few different avenues for expressing yourself.</p><p>The <a href="https://fkcaps.com/keycaps/mbk/blanks?a=FlatFootFox">original MBK keycaps</a> were blank, legend-less keys. They were available in a variety of injection molded and dyed colors, and let you build any sort of keyboard you could imagine... as long as you were a good touch typist. Then the aptly-named <a href="https://fkcaps.com/keycaps/mbk/legend-gb?a=FlatFootFox">MBK Legends</a> keycap set burst onto the scene. They offered a variety of alpha keys, text modifiers, and icon-based legends designed by tectonicplate. The initial run of MBK Legends provided aspiring keyboard builders with white, black, gray, and red keycap options. While stock of this initial print run is dwindling, FK Caps is planning on releasing a new extended MBK Legends set this year which will swap out the red accented keys for a new blue set.</p><p>Not satisfied there, FK Caps also released the popular <a href="https://fkcaps.com/keycaps/mbk/legend-glow?a=FlatFootFox">MBK Legend Glow</a> keycap set. This set is a must-have for any low profile keyboard with per-key LED backlighting, and is available in black or white.</p><p>For the last few years, this has generally been the state of low profile keycaps. You can either eschew key legends and create a color-coordinated board with blank keycaps, or you pick up set with legends and embrace the monochrome or lean into the red accents. I did the later with my <a href="https://flatfootfox.com/the-chonkv-keyboard/">ChonkV</a> keyboard. But now FK Caps has come out with a new option for keyboard design.</p><h2 id="fk-custom">FK Custom</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.27.59-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1167" height="756" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.27.59-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.27.59-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.27.59-PM.png 1167w" sizes="(min-width: 720px) 720px"></figure><p>FK Caps&apos; new <a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a> service is a laser engraving keycap service. Instead of having to choose between a stock set of legends or a blank set of keys, you can now print off exactly the keys you want for your next build. (Just in case you don&apos;t make it to the end of this article: You can get an extra 10% off your order with the <code>FlatFootFox</code> affiliate code.)</p><p>I&apos;m not going to bury the lede here: You can now make a low profile keyboard with purple legend keys.</p><p>Okay, that might not be everyone&apos;s priority. Let&apos;s back up a bit. <a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a> allows you to create custom-legend keys across 7 different keycap types. In the low profile Choc arena you can create three different types of MBK keycaps, while the full size MX crowd can make keys with Cherry, DSA, or MDA profiles. These keycaps come in a variety of colors (White, black, purple, red, orange, and black shine-through in the case of MBK keycaps.) The keycaps can be adorned in any text, international characters, icons, or vector graphics that you&apos;d like.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.30.26-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="837" height="698" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.30.26-PM.png 600w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.30.26-PM.png 837w" sizes="(min-width: 720px) 720px"></figure><p>FK Custom does a good job walking you through all the characteristics of each switch type. Their white MBK keycap offering feels similar to their classic MBK Legends keycaps, while the MBK (PU) keycaps have a polyurethane coating similar to the MBK Glow keycaps. If you&apos;re trying to match the look and feel of an existing keycap set, they do a good job steering you in the right direction.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.31.19-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1166" height="760" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.31.19-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.31.19-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.31.19-PM.png 1166w" sizes="(min-width: 720px) 720px"></figure><p>Once you pick your keycap type, FK Customs sends you through an interactive keycap design tool. Rather than having to start with a blank slate, FK Custom has gone ahead and created templates for some of the most popular ergonomic mechanical keyboards. If you&apos;re looking to outfit a Ferris or a Corne, it&apos;s as simple as selecting your board and moving onto the next step. If you&apos;re looking to build a keycap set for a custom board, you can drag and drop keys to build your custom layout.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.35.09-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1168" height="747" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.35.09-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.35.09-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.35.09-PM.png 1168w" sizes="(min-width: 720px) 720px"></figure><p>To start things off, FK Custom lets you select the language of your board. This applies a standard set of alpha letters to your board. The international crowd will be happy to see a wide variety of local letters and accent marks available within the customizer. (It&apos;s also worth noting that FK Custom has worldwide shipping for $9 USD.)</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.38.12-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1167" height="752" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.38.12-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.38.12-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.38.12-PM.png 1167w" sizes="(min-width: 720px) 720px"></figure><p>Once you&apos;ve picked your language, you can adjust the font of the alpha keys. The tool defaults to the legible Noto Sans, but you can mix things up with Helvetica Rounded, Roboto, and even some retro pixel fonts. You can also upload your own custom font file if you&apos;re looking for something a bit more bespoke.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.41.54-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1178" height="746" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.41.54-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.41.54-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.41.54-PM.png 1178w" sizes="(min-width: 720px) 720px"></figure><p>In addition to these keyboard-wide changes, you can also make individual adjustments to each keycap. You can enter text on a keycap, use a built-in icon, or upload your own vector.</p><p>Text keys support a variety of sizing and placement options. You&apos;re able to switch the font on a per-key basis, allowing you to do things such as having different fonts for your alpha keys and your text-style modifiers.</p><p>Icon keys allow you to select an icon from a variety of icon sets. You can select any of the icons from the custom MBK Legends icon set, as well as use icons from a variety of open source libraries such as Icofont, Font Awesome, Bootstrap, and Framework7.</p><p>If the glyph you&apos;re looking for isn&apos;t in any of those icon sets, you can also upload your own custom .svg vector icons. These can come from other external icon sets, or can be your own creation from free tools like Inkscape or Figma.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.48.15-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1178" height="747" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.48.15-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.48.15-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.48.15-PM.png 1178w" sizes="(min-width: 720px) 720px"></figure><p>All of these key types allow for different scaling options. I used a variety of built in icons and uploaded .svg files in the icon set I purchased from FK Custom.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.49.53-PM.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1166" height="751" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/Screenshot-2023-06-24-at-12.49.53-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/Screenshot-2023-06-24-at-12.49.53-PM.png 1000w, https://flatfootfox.com/content/images/2023/06/Screenshot-2023-06-24-at-12.49.53-PM.png 1166w" sizes="(min-width: 720px) 720px"></figure><p>The final summary screen gives you a nice breakdown of your shopping cart. Keys are listed by size and profile, so it&apos;s easy to spot if you accidentally selected a concave key, or put the wrong legend on one of your home row homing keys. FK Custom charges a separate price for customized and blank keys, which makes it easy to toss in a few blank keys to your order in case your design sensibilities change over time.</p><h2 id="the-finished-product">The Finished Product</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/06/FK-Packaging.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/FK-Packaging.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/FK-Packaging.png 1000w, https://flatfootfox.com/content/images/2023/06/FK-Packaging.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>My new set of modifiers.</figcaption></figure><p>FK Custom had quick turnaround and shipping in the United States. Their 6-14 day shipping means these keycaps probably won&apos;t be the long pole in the tent for your new custom build. The keys arrive in a small shipping box, and are vacuum sealed during shipping to keep them safe and scratch free.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/06/FK-Caps.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/FK-Caps.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/FK-Caps.png 1000w, https://flatfootfox.com/content/images/2023/06/FK-Caps.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>Some MBK Legend keys and their MBK (PU) custom equivalents.</figcaption></figure><p>I&apos;m incredibly happy with how these keycaps turned out. I was satisfied with the existing alpha keys in my MBK Legend set, but was eager to introduce a splash of color onto my keyboard with a new set of modifiers. I created a few keys with the existing MBK Legend set, as well as a few keys with custom vector designs from .svg files I uploaded.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/06/FK-Half.png" class="kg-image" alt="Design Your Own Low-Profile Keycaps With FK Custom" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/06/FK-Half.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/06/FK-Half.png 1000w, https://flatfootfox.com/content/images/2023/06/FK-Half.png 1600w" sizes="(min-width: 720px) 720px"></figure><p>The laser engraved legends look good. My next board is going to have a gaming influence, and the laser engraving process was able to handle the pixelated sharp edges of the icons I uploaded without any problems. (Random aside: It&apos;s a fun weekend project to try and get vector graphics applications to output convincingly squared off pixels.) FK Custom&apos;s laser engraving also did a good job of handling the smooth lines of my FlatFootFox icon.</p><p>I purchased a few 1.5u keys, some concave keycaps, and a pair of new homing keys. They all turned out equally as well as the standard 1u convex keys. The &quot;J&quot; is just as legible on the homing key, and the icons I printed on the concave keys came out just as well as on the convex keys. If you&apos;re familiar with the other MBK keycaps, you basically know what to expect here. </p><p>It feels silly 1,300 words into this review to suddenly walk away with the conclusion of, &quot;Yup, they&apos;re keycaps&quot;, but that&apos;s largely the takeaway here. 10/10, no notes. FK Custom lets you easily create a set of high quality custom-legend keycaps for your low profile mechanical keyboard. The next time you start an ergonomic mechanical keyboard build, make sure to budget a few keycaps from <a href="https://fkcaps.com/custom?a=FlatFootFox">FK Custom</a>. FK Caps has started up an affiliate program, so feel free to use the code <code>FlatFootFox</code> for an extra 10% off.</p><!--kg-card-begin: html--><div><sub>*The FK Custom keycaps featured in this review were purchased by the reviewer.</sub></div>
<div><sub>**FK Custom links in this review feature an affiliate code. More details about FK Custom&apos;s affiliate program can be found <a href="https://fkcaps.notion.site/Affiliation-f0827475022f49cc82e74c59678ce734">on their site</a>. I don&apos;t foresee hitting their payout threshold, but wanted to offer the coupon code to anyone who happens to stumble across this review.</sub></div><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Let's Design A Keyboard With Ergogen v4: KiCAD, Firmwares, & Assembly (Finale)]]></title><description><![CDATA[All good things must come to an end! This fifth and final installment covers KiCAD routing, PCB fabrication, keyboard firmwares, and assembly tips.]]></description><link>https://flatfootfox.com/ergogen-part5-kicad-firmware-assembly/</link><guid isPermaLink="false">6434706e1914912295541bed</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Thu, 20 Apr 2023 17:19:01 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Ergogen-KiCAD-Routed-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Ergogen-KiCAD-Routed-1.jpg" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)"><p>All good things must come to an end! We&apos;ve come far since the <a href="https://flatfootfox.com/ergogen-introduction/">introductory</a> post! In <a href="https://flatfootfox.com/ergogen-part1-units-points/">Part 1</a> we created our keyboard&apos;s layout by leveraging points, in <a href="https://flatfootfox.com/ergogen-part2-outlines/">Part 2</a> we gave our board an outline, in <a href="https://flatfootfox.com/ergogen-part3-pcbs/">Part 3</a> we discussed microcontrollers and created the basis for our PCB, and in <a href="https://flatfootfox.com/ergogen-part4-footprints-cases/">Part 4</a> we imported external footprints and designed a keyboard case. We&apos;ve reached the end of our journey with Ergogen.</p><p>The final steps of building a keyboard all take place outside of Ergogen. The biggest missing piece is actually creating the routes for our board in KiCAD. After that we need to create a custom firmware for the new keyboard, and finally there&apos;s the matter of actually sourcing the parts and assembling the keyboard.</p><p>This section is going to be a bit less click-by-click and line-by-line than the previous chapters. The remaining tools we need to leverage all have useful documentation and tutorials of their own, so the remainder of this guide is going to be giving some Ergogen-related tips and tutorial recommendations.</p><h2 id="what-a-cad">What a CAD!</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/easytraxdemopcb.jpg" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="640" height="480" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/easytraxdemopcb.jpg 600w, https://flatfootfox.com/content/images/2023/04/easytraxdemopcb.jpg 640w"><figcaption>DOS! 640x480 CAD work without a window in sight!</figcaption></figure><p>The &quot;CAD&quot; in &quot;KiCAD&quot; comes from the term &quot;Computer Aided Design&quot;. CAD itself is an offshoot of EDA, or Electronic Design Automation. This isn&apos;t just a stroll down memory lane (although fun fact, KiCAD is a portmanteau of the name of the lead developer&apos;s friend &quot;Ki&quot; and CAD), but it will hopefully be some useful context.</p><p>CAD software is <em>old</em>. Like, <em>has its roots in the 1960s</em> old. The most popular commercial CAD software today is EAGLE EDA. (I swear this series isn&apos;t a subtile plug for Autodesk, they&apos;ve just acquired a ton of applications at this point.) If EAGLE&apos;s all-caps German acronym name wasn&apos;t enough of a hint, this app has been around for 35 years. It started off as a 16-bit DOS application.</p><p>This is all to say that CAD software, including KiCAD, has some very odd historical quirks. The conventions of this space were codified at a time when designers had arrow keys and trackballs. There&apos;s an unusually heavy reliance on hotkeys, and a &quot;modality&quot; you don&apos;t see in many modern apps.</p><p>CAD software is difficult to &quot;feel&quot; one&apos;s way around. Case in point, the simple act of drawing a line is unlike any image manipulation app you&apos;ve ever worked with. Instead of clicking and dragging where you&apos;d like to draw a trace, you click on a start point and then drag your mouse along the path where you&apos;d like the trace to go. Once you&apos;ve reached the final point, you click a second time exit the routing mode. It&apos;s a few steps removed from opening up Photoshop, clicking on the blurry-looking icon, and then clicking and dragging the blur tool around experimentally.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.29.58-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="829" height="781" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.29.58-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.29.58-PM.png 829w" sizes="(min-width: 720px) 720px"></figure><p>I cut my teeth on KiCAD with Brian Benchoff&apos;s excellent HackADay <a href="https://hackaday.com/2016/09/21/creating-a-pcb-in-everything-introduction/">Creating A PCB In Everything</a> series. It served as a general survey of various popular CAD softwares at the time, and walked readers through <a href="https://hackaday.com/2016/11/17/creating-a-pcb-in-everything-kicad-part-1/">creating a KiCAD schematic</a> (something we didn&apos;t need to do thanks to Ergogen creating our nets), <a href="https://hackaday.com/2016/12/09/creating-a-pcb-in-everything-kicad-part-2/">designing a footprint</a> from scratch (useful, but something that doesn&apos;t come up as often in the Ergogen community), and finally <a href="https://hackaday.com/2016/12/23/creating-a-pcb-in-everything-kicad-part-3/">routing everything together</a> (the last step we need to do here today).</p><!--kg-card-begin: html--><sub>Also, huh, a multi-part blog post with an introductory post that serves as a table of contents for the rest of the series. Maybe I learned more from Benchoff than just how CAD software works.</sub><!--kg-card-end: html--><p>At the time of writing this post, KiCAD 7 is hot off the presses. KiCAD goes through the usual incremental upgrades between versions, but any guide you find for KiCAD 4, 5, or 6 should still be somewhat useful to you. KiCAD 4 had some significant UI changes over KiCAD 3, but things have been much more subtile since then.</p><p>As far as additional resources go, KiCAD manages some <a href="https://www.kicad.org/help/learning-resources/">recommendations</a> themselves. This includes their own <a href="https://docs.kicad.org/#_getting_started">KiCAD Getting Started</a> guide. <a href="https://forum.kicad.info/t/tutorial-introduction-to-pcb-design-with-kicad-version-5-1-getting-started/20600">Rene Poschl</a> and <a href="https://learn.sparkfun.com/tutorials/beginners-guide-to-kicad/all">Nate from Sparkfun</a> also both have well regarded KiCAD 5 and KiCAD 4 guides. Ben Vallack also has a good <a href="https://youtu.be/M_VuXVErD6E">keyboard-specific KiCAD video</a>. Apologies for not having solid personal recommendations for more contemporary resources.</p><h2 id="routing-basics">Routing Basics</h2><p>Printed circuit boards are made out of an epoxy fiberglass composite known as FR-4. They&apos;re, you know, flat boards, and have a copper layer on each side to connect your components together. When working with PCBs, it&apos;s important to remember that you&apos;re dealing with a two sided object that has a defined front and back.</p><p>This isn&apos;t completely universal. You can save a dollar and get copper only one side of your board. You can also pay three times as much and get a four layer PCB that&apos;s a sandwich of multiple copper and FR-4 layers. In most situations however it&apos;s not worth saving a buck to deal with making a single layer board, and whatever issue is nudging you towards considering a four layer PCB can be likely be solved with some clever rearrangement of parts and traces. For the most part almost any PCB you design or interact with will be a two layer PCB.</p><p>The copper line between two components on a PCB are known as a &quot;Trace&quot;. The verb for defining a trace on your PCB is &quot;Routing&quot;. Sometimes a trace will be referred to as a &quot;Route&quot;. They&apos;re also occasionally known as &quot;Tracks&quot;. The big last step we have in our keyboard design process is to route these traces on our empty PCB.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.08.26-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1214" height="934" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.08.26-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.08.26-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.08.26-PM.png 1214w" sizes="(min-width: 1200px) 1200px"></figure><p>KiCAD draws traces on the front of the PCB as red lines. They&apos;re part of the <code>F.Cu</code> layer. (AKA &quot;Front.Copper&quot;)</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.09.21-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1212" height="932" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.09.21-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.09.21-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.09.21-PM.png 1212w" sizes="(min-width: 1200px) 1200px"></figure><p>Traces on the back of the PCB are drawn in blue lines. They&apos;re part of the <code>B.Cu</code> layer. (AKA &quot;Back.Copper&quot;.) In this primitive example, what would happen if we try to connect these two far left and far right pins together?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.11.49-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1211" height="930" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.11.49-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.11.49-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.11.49-PM.png 1211w" sizes="(min-width: 1200px) 1200px"></figure><p>Our line gets stuck! KiCAD won&apos;t let us draw two red lines intersecting on top of one another. What if we switch to the <code>B.Cu</code> layer?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.13.12-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1213" height="930" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.13.12-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.13.12-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.13.12-PM.png 1213w" sizes="(min-width: 1200px) 1200px"></figure><p>This time we managed to go over the <code>F.Cu</code> trace, but we got stuck again at the <code>B.Cu</code> trace.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.14.26-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1213" height="930" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.14.26-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.14.26-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.14.26-PM.png 1213w" sizes="(min-width: 1200px) 1200px"></figure><p>This isn&apos;t software. We can&apos;t just cheat across intersections. If you want to draw a front trace over another front trace... you can&apos;t. You need to go around. A big part of PCBs is getting smart about where you place components.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.17.03-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1211" height="928" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.17.03-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.17.03-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.17.03-PM.png 1211w" sizes="(min-width: 1200px) 1200px"></figure><p>Sometimes we don&apos;t have the option of being smart however. If our board was a bit more narrow, we couldn&apos;t just sneak across the top. So what are we supposed to do in a situation like this?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.18.09-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1212" height="929" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.18.09-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.18.09-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.18.09-PM.png 1212w" sizes="(min-width: 1200px) 1200px"></figure><p>The one <em>Get Out of Jail Free</em> card we have when it comes to routing is the &quot;Via&quot;. Vias are physical holes drilled in our PCB that allow traces to move from one side of the broad to the other. Sometimes our layout is just too complicated and there&apos;s no better way to get around an existing trace.</p><p>There&apos;s a variety of factors impacting the cost of a PCB. The primary cost comes from the side of the circuit board. You pay per square millimeter. The larger your keyboard, the more it&apos;s going to cost. Secondary to that is how <em>long</em> it takes to fabricate your keyboard. If the PCB manufacturer has to spend an inordinate amount of time working on your PCB, they&apos;ll usually charge you a bit extra. Vias are physically drilled into your PCB, and drilling takes time. It&apos;s usually a good idea to limit the number of Vias you use when designing a keyboard. If you need to use a dozen of them to get your microcontroller wired up, fine, but it&apos;s not something you really want to use on a per-key basis.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.22.46-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1210" height="928" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.22.46-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.22.46-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.22.46-PM.png 1210w" sizes="(min-width: 1200px) 1200px"></figure><p>One last note on routing basics is the difference between &quot;surface mount device&quot; SMD pads and &quot;through hole&quot; pins. SMD pads are only exposed on one side of the board, so your trace needs to connect to it on the same side. In the above screenshot, our hotswap sockets need to connect to the blue pads on the back, while the reset button has red pads on the front. Through hole pins are physically drilled through a PCB and are exposed on both sides of the board. You can start your trace from either the front or the back when working with through holes components.</p><p>I&apos;m generally a fan of SMD diodes for keyboards. They&apos;re a little more fiddly, but you don&apos;t have to worry about the trimmed through hole leads getting in the way of anything. SMD diodes are also shorter than the hotswap sockets we&apos;re working with, so they don&apos;t introduce any new design considerations there Despite all this, I kept the dual SMD and TH diode footprint on our example keyboard design. Having at least one through hole component on each key switch allows us to more easily hop back and forth from the front and back of the keyboard.</p><h2 id="routing-a-keyboard">Routing A Keyboard</h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.50.30-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.50.30-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.50.30-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.50.30-PM.png 1404w" sizes="(min-width: 1200px) 1200px"><figcaption>Huh, KiCAD 7 is slightly more teal.</figcaption></figure><p>Enough theory! Let&apos;s route our keyboard. If you haven&apos;t already, download <a href="https://www.kicad.org">KiCAD</a> and open the PCB file Ergogen created earlier. I had been using KiCAD 6 in all of the screenshots I had taken up till now, but I suppose I really should hop on the brand spanking new KiCAD 7. There shouldn&apos;t be too much that changed between the versions, but I don&apos;t want new users to get caught up on the names of settings and preferences if there&apos;s any small differences.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.51.22-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.51.22-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.51.22-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.51.22-PM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Speaking of which, let&apos;s start with a quick preference tweak. Navigate to <code>File -&gt; Settings</code>, or press <code>Cmd-,</code> if you&apos;re on a Mac. Navigate to the <code>Editing Options</code> section. Change the &quot;Step for rotate commands:&quot; option from 90 degrees to whatever value you had set the <code>rotate:</code> value to your mirrored halves in your Ergogen config. In our case, that&apos;s 20 degrees.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.55.02-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1406" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.55.02-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.55.02-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.55.02-PM.png 1406w" sizes="(min-width: 1200px) 1200px"></figure><p>Now if we tap the <code>r</code> or <code>Shift-r</code> key while working with a part, KiCAD will rotate it 20 degrees instead of 90 degrees. This is useful for pivoting between the different halves of the board and keeping all of our traces straight. To rotate the board, simply tap <code>Cmd/Ctrl-a</code> to select every component in your design, then <code>r</code> or <code>Shift-r</code> to rotate it.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.57.17-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.57.17-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.57.17-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.57.17-PM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>My general approach when routing a board is to route the keyboard matrix and then figure out how to connect it to the microcontroller. To start with, let&apos;s figure out how we want to wire up an individual key.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.58.39-PM-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.58.39-PM-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-3.58.39-PM-1.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.58.39-PM-1.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Hover your cursor over one of the through holes and press the <code>x</code> key to begin routing. You can also select the &quot;Route Tracks&quot; tool from the right side of KiCAD and click the pin or pad you want to start routing from. We&apos;ve immediately run into a problem here though. Our track is on the red <code>F.Cu</code> layer, and we&apos;re trying to connect to a blue <code>B.Cu</code> pad.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.02.21-PM-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.02.21-PM-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.02.21-PM-1.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.02.21-PM-1.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>To switch sides of the board, tap the <code>v</code> key. You can also manually change front and back layers by using the panel on the right. Traces are always routed on the <code>F.cu</code> and <code>B.cu</code> layers, but you can use the other tools (lines, arcs, circles, text, etc.) to add elements to the other layers. Anything on the <code>F.Silkscreen</code> and <code>B.Silkscreen</code> layers will be drawn as a graphic on your board, and <code>Edge.Cuts</code> defines the physical edges of your PCB.</p><p>You may have noticed that your traces are <em>really</em> clunky. They&apos;re snapping to an almost absurdly large grid for the PCB we&apos;re working with. Let&apos;s fix that.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.06.31-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.06.31-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.06.31-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.06.31-PM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>The <code>Grid:</code> drop down at the top of the page is defaulting to 0.2540mm. (In other words, 0.01 of an inch.) We need something considerably smaller. I personally like working with 0.2mm. It&apos;s small enough that you can flexibly route your board, but still on enough of a grid that aligning things doesn&apos;t become a nightmare. Feel free to experiment and see what works best for you.</p><p>Most of the measurements we&apos;re working with here make more sense in terms of millimeters. (Sorry my fellow Americans.) If KiCAD starts suddenly displaying property screens to you with five digit decimal inch measurements, you probably accidentally changed your units somewhere along the way. Thankfully you can quickly get back to millimeters by clicking the small &quot;mm&quot; icon on the left side of the screen.</p><p>Now that we&apos;re familiarized ourselves with KiCAD, onto the actual routing.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.21.11-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.21.11-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.21.11-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.21.11-PM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>This particular diode footprint has SMD pads on the front and back. To start with, wire the front pads to the through holes. To do this, hover over one of the pads, press the <code>x</code> key to start routing, and then click the lit up pin next to the pad. Repeat this process for the other pin and pad.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.24.18-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.24.18-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.24.18-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.24.18-PM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>Flip to the back layer with <code>v</code> and wire up the rear pads. Again, <code>x</code> to start routing, click to stop. Yes, this is going to get a little tedious doing it on the front and back for 58 keys.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.26.16-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.26.16-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.26.16-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.26.16-PM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Next, wire up the through hole pin on the right to the pad on the right. When you&apos;re actively dragging the line, the two should be lit up so you know where to draw.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.27.36-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1401" height="880" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.27.36-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.27.36-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.27.36-PM.png 1401w" sizes="(min-width: 1200px) 1200px"></figure><p>KiCAD has a bit habit of sometimes jumping to a gap you didn&apos;t quite expect. If this happens I haven&apos;t found a good fix other than wiggling the mouse a bit or tapping <code>Esc</code> to cancel routing and remove the line. Sometimes you just need to try drawing the route a few times. Starting from the opposite end can also sometimes help.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.34.07-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.34.07-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.34.07-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.34.07-PM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Repeat this process for 9 different switches. (Naturally you don&apos;t have to stick to this design exactly, but having a repeatable per-switch footprint does make your board look nice.) Now that we have several adjacent keys, we need to figure out how to wire them together.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.36.09-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.36.09-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.36.09-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.36.09-PM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Pressing <code>x</code> over a pin will show us everything it&apos;s supposed to connect to. If we do it on the right side of a side, we can see it&apos;s connected to the right side of the SMD diode pad, and the right side of our hotswap pad.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.38.09-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.38.09-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.38.09-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.38.09-PM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>If we do this on the left side of the diode, we can see the entire row light up. Now we&apos;re in business! Use your new routing skills to wire together three keys in a row.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.40.14-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="885" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.40.14-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.40.14-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.40.14-PM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>While routing, you can click your mouse to lay down the trace you&apos;ve routed so far. If you like the first part of a path, clicking lays that part down so you can start using it as the anchor for the rest of your routing. Now that we have a row set, let&apos;s take a look at a column.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.42.14-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.42.14-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.42.14-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.42.14-PM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Well shoot. The columns are all connected together by the SMD pads on the left side of our hotswap socket. All of these pads are blue, which means they can&apos;t cross over the rows we just routed. We could start using vias to hop the rows here, but let&apos;s try to be a bit more smart about it. The columns are forced to use the blue SMD pads as their start and end points, but rows start and stop at through hole pins. We should go back and re-do those rows as front traces. Thankfully KiCAD supports <code>Cmd/Ctrl-z</code>.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.48.23-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-4.48.23-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-4.48.23-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-4.48.23-PM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>There we go! We now have a nice repeatable pattern we can use to wire up every key. The left side of the hotswap sockets are all connected together in a single column. The right side of the hotswap socket connects to the right side of our diodes. The left side of our diodes are all connected together in a single row. When a user presses on a key, the left and right pads of the hotswap socket will be connected together. They&apos;ll form a single circuit, passing through the diode on the way back to the microcontroller.</p><p>Now that we&apos;ve got the base pattern down, it&apos;s time to apply it to the rest of this side of the keyboard.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-5.04.13-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-5.04.13-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-5.04.13-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-5.04.13-PM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Looking good so far! The top four rows have all been traced using the steps we covered before. Hopefully you&apos;ve figured out KiCAD&apos;s slightly wonky mouse wheel scrolling by now. (It zooms in on wherever your mouse is hovering when you scroll.) The only big routing piece to call out here is the modifier keys on the bottom. Their columns are all shifted over by one, so we have to be a bit careful how we wire those up.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-5.12.56-PM-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-5.12.56-PM-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-5.12.56-PM-1.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-5.12.56-PM-1.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>I&apos;ve also gone ahead and routed the two thumb keys. This is a good example of what happens when you <em>don&apos;t</em> rotate the PCB before routing.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-5.12.37-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-5.12.37-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-5.12.37-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-5.12.37-PM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>Those are some gnarly traces. Let&apos;s go back to the Preferences and set the &quot;Step for rotate commands:&quot; to 15 degrees.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-10.38.11-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-10.38.11-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-10.38.11-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-10.38.11-PM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>There we go. That&apos;s marginally cleaner. Now we can set the rotate step back to 20 degrees.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-10.41.11-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="885" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-10.41.11-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-10.41.11-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-10.41.11-PM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>With that, we&apos;re done with the left side of the keyboard! Press <code>Cmd/Ctrl+a</code> to select all of the parts, and then <code>Shift+r</code> twice to rotate things over to the right side of the board.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-10.45.45-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1407" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-10.45.45-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-15-at-10.45.45-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-10.45.45-PM.png 1407w" sizes="(min-width: 1200px) 1200px"></figure><p>Time to do all those routing steps all over again. You&apos;ve got this, right?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.47.55-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-8.47.55-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-8.47.55-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.47.55-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Yeah, you&apos;ve got this. Alright, we have the two halves of our keyboard matrix wired together. What next?</p><p>In <a href="https://flatfootfox.com/ergogen-part3-pcbs/">Part 3</a> of this guide, we touched briefly on keyboard matrix theory. This keyboard is using a &quot;western duplex&quot; matrix. The columns are technically stretched out to cover both the left and right side. If we start routing from one of our left hotswap pads, we can see both parts of the keyboard light up.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.13.24-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-8.13.24-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-8.13.24-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.13.24-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Things are going to get a little tight, but we should be able to run a set of traces along the bottom of our keyboard. Start from the outside and work your way in.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.20.34-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-8.20.34-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-8.20.34-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.20.34-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>You don&apos;t need to finish the routes all in one go. In this screenshot, I&apos;ve routed a trace for the outer, pinky, and ring columns along the bottom of the board. I like working on one side of the board, leaving a half-finished trace, and then coming back to it later after you&apos;ve routed the board. Unfinished traces will work just like pins and pads on your board, and will have their associated nets pointing off of them.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.23.02-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-8.23.02-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-8.23.02-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.23.02-AM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>When routing traces closely together, KiCAD will show a small transparent area next to your route. This is a minimum buffer area between the traces to keep them from interacting with one another. The KiCAD&apos;s default distance should be fine for our keyboard.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.36.26-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-8.36.26-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-8.36.26-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-8.36.26-AM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>There&apos;s all six! It&apos;s not the prettiest group of lines, but it&apos;ll do the job.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.01.01-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1401" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.01.01-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.01.01-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.01.01-AM.png 1401w" sizes="(min-width: 1200px) 1200px"></figure><p>You may need to get creative with your rotation angles when routing around some of these corners. Changing your Grid settings may also help.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.01.51-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.01.51-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.01.51-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.01.51-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>If you routed everything properly, the nets should match up when these two groups of lines come together.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.05.05-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.05.05-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.05.05-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.05.05-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Holy cow that actually worked. Connecting all the lines took a bit of fiddling, but they came together in the end.</p><p>Okay. So. Microcontroller time. I like routing the OLED screen and Reset button to start with so that the nets are a little more readable.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.07.56-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.07.56-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.07.56-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.07.56-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>You generally want to keep all of the microcontroller accessory routes inside of the microcontroller&apos;s footprint. We&apos;ll need the space to the left and right to route the rows and columns in a minute and- Ugh. Hold on.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.11.03-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="885" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.11.03-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.11.03-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.11.03-AM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>There we go. Routing these things takes a lot of trial and error. Give yourself time to figure out the best layouts for things, and don&apos;t be afraid to back up and do sections over if you need to.</p><p>As a random aside, you&apos;ll notice all of the GND ground pins routed together here. They&apos;re technically connected together internally on the microcontroller, so these traces are strictly necessary. However, I&apos;ve totally botched a header pin on a microcontroller in the past, so it&apos;s always nice to not have to rely on a single pinout if you don&apos;t need to.</p><p>Our traces are a bit more readable now. The column traces are mostly pointing straight down, but we can see the row traces reaching out. Let&apos;s connect those now.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.17.56-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.17.56-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.17.56-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.17.56-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>These traces are admittedly a little messy. They get the job done though. Feel free to rotate things back and forth as you route if you haven&apos;t been already.</p><p>When routing a PCB, it&apos;s important to remember that the <code>F.Cu</code> traces are the ones you&apos;re more likely to see. We can be a bit more clean for the next step.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.19.40-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.19.40-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.19.40-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.19.40-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>The majority of our board is routed using back traces. The only piece of our matrix using front traces are the left-to-right row traces. This makes things a bit easier to get across the length of the board. Let&apos;s start our column routes off with some red <code>F.Cu</code> traces.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.24.46-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.24.46-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.24.46-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.24.46-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Now there&apos;s a nice trace. Nice symmetrical straight lines framing our Arduino. That should look good on the front of the board. Once we start routing under the keys, we don&apos;t have to worry as much about all our traces being perfectly aligned.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.29.08-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.29.08-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.29.08-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.29.08-AM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>Finishing off these routes marks the first appearance of vias in our keyboard. The <code>F.Cu</code> traces made it easy to travel this far across our keyboard, but in the end we still need to connect to a pad on the back of the board.</p><p>Okay, time for my coffee break. Do that again but on the other side-</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.33.40-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.33.40-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.33.40-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.33.40-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Wait, what do you mean there&apos;s a trace in the way? Right, our board&apos;s symmetrical, but these key switch footprints are not. The column traces on the left side of the switch are in the way if we want to use the same row routes as before. Is there any way we could get them out of our way? Hmm...</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.38.53-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.38.53-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.38.53-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.38.53-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>Routing through diode footprints is a little cheeky, but it&apos;ll work in a pinch. Just be careful when soldering that column of diodes and you should be fine. Probably. The good news is we can route our rows now.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.42.21-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.42.21-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.42.21-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.42.21-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>There we go. Now we just have three more columns to route. Thankfully these don&apos;t have to go as far.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.48.29-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.48.29-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.48.29-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.48.29-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Three more traces, three more vias, and we&apos;re done.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.49.14-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-9.49.14-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-9.49.14-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-9.49.14-AM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>Wait a second. We&apos;re done! Look at that! A shiny new keyboard, all routed and ready to send off to the fabricator. Go us! We&apos;re finished with KiCAD now, right? Well, not quite.</p><h2 id="design-rule-checker-drc">Design Rule Checker (DRC)</h2><p>Chances are you made a mistake somewhere in your board. (It&apos;s okay, this is a judgement free zone.) Rather than having to meticulously scrub through every trace however, KiCAD has what are known as &quot;Design Rules&quot;. They&apos;re a set of configurations that stop us from making easy-to-spot mistakes like laying two footprints right on top of one another, or leaving a pad un-routed.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-10.51.53-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-10.51.53-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-10.51.53-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-10.51.53-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>To access the DRC tool, click it&apos;s icon on the top navbar. Then click <code>Run DRC</code> in the modal that appears.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-10.58.26-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-10.58.26-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-10.58.26-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-10.58.26-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Oh jeez. That&apos;s a lot of errors. I was expecting one or two. Not over a hundred. Did I mention I upgraded to KiCAD 7 at the start of this guide? Hopefully this is just a quirk of the new version or some side effect from upgrading. Still, I&apos;ll keep the resolution of these issues in the guide if only for demonstration purposes.</p><p>Let&apos;s start with the easy warnings. Clicking on an error moves your window to that portion of the PCB. Zoom in on your board, then click the error in the DRC window to get a better look.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.02.23-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.02.23-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.02.23-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.02.23-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>KiCAD&apos;s router can sometimes leave small orphan fragments on your board. If you click where the arrow is pointing, you&apos;ll get a dropdown asking you which trace you&apos;re trying to select.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.03.24-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1400" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.03.24-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.03.24-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.03.24-AM.png 1400w" sizes="(min-width: 1200px) 1200px"></figure><p>Pick the small stray segment and delete it. You can delete traces with <code>backspace</code> on your keyboard.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.04.55-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.04.55-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.04.55-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.04.55-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>If you fixed the issue correctly, you&apos;ll see [Deleted Item] in place of the track definition. The arrow will linger around until you re-run DRC however. (Or until you click the &quot;Delete All Markers&quot; options.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.06.25-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.06.25-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.06.25-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.06.25-AM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>The other error had a similar chunk of trace left at a corner.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.08.14-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1402" height="885" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.08.14-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.08.14-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.08.14-AM.png 1402w" sizes="(min-width: 1200px) 1200px"></figure><p>I honestly have no idea what&apos;s going on with the next error. Apparently the footprint has an incorrect attribute? Let&apos;s double click on the switch and figure out what&apos;s going on. If you double click on a component of the footprint (a pad, drill hole, etc.), you&apos;ll get the properties of that component. We want the properties of the entire footprint, so double click on some of the whitespace in between. You can also right click and select <code>Properties...</code> if you&apos;re having trouble finding some clickable whitespace.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.10.55-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.10.55-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.10.55-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.10.55-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>This appears to be our culprit. Change &quot;Footprint type:&quot; to <code>SMD</code>. While we&apos;re here, it&apos;s worth remembering this &quot;Position&quot; section of the Properties screen. It can help you align footprints or tracks when laying out a PCB. You can also toggle the checkboxes in the &quot;Show&quot; column to enable or disable some silkscreen markings on your board.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.34.34-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.34.34-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.34.34-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.34.34-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Changing the &quot;Footprint type:&quot; on all of our Choc footprints and the diode footprints appears to have resolved this error. The next group of warnings has me stumped though. Hopefully this is just a side effect of updating KiCAD halfway through a tutorial? Or maybe it&apos;s something about Ergogen&apos;s footprints that KiCAD 7 just doesn&apos;t like. Either way, these are just warnings. Thankfully we can clear these out rather quickly.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.35.52-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="884" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.35.52-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.35.52-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.35.52-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Right click on one of the warnings and then chose the <code>Ignore all &apos;Footprint not found in libraries&apos; violations</code> option.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.37.35-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1407" height="886" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.37.35-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.37.35-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.37.35-AM.png 1407w" sizes="(min-width: 1200px) 1200px"></figure><p>That cleared out all of our errors and warnings. There&apos;s still a few issues under the &quot;Unconnected Items&quot; tab however.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.38.28-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="885" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.38.28-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.38.28-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.38.28-AM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>Alright, here&apos;s the feature of DRC I actually wanted to show. The Unconnected Items tab is great for finding diodes you forgot to wire together on one side of the board.</p><p>The stock Ergogen footprint has two through holes, and then two sets of surface mount SMD pads. Both the red pads on the front and the blue pads on the back need to be connected to the through holes next to them. If you run DRC and get a number of errors that is close to 2x the number of keys on your keyboard, you&apos;ve probably forgotten to connect the SMD pads on the back side of your keyboard to the through holes.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.40.05-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.40.05-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.40.05-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.40.05-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>Looks like I missed a hotswap trace too. You can actually see this mistake in the 6th from the last screenshot in the routing section of this guide. Let&apos;s pretend I left it here as a learning example. Running DRC at the end of your routing process is vital for picking up small but critical mistakes like this.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.42.26-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1404" height="881" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.42.26-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.42.26-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.42.26-AM.png 1404w" sizes="(min-width: 1200px) 1200px"></figure><p>Once you&apos;ve finished correcting all the issues, run DRC one last time to verify that your PCB doesn&apos;t have any errors. Looks like we&apos;re good to go.</p><p>Surely we&apos;re done with our board now, right? Well... Let&apos;s take one last look at things. It seems fine, but humor me and select <code>View -&gt; 3D Viewer</code> from the file menu.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.48.43-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1276" height="714" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.48.43-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.48.43-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.48.43-AM.png 1276w" sizes="(min-width: 1200px) 1200px"></figure><p>Tada! Here&apos;s a render of our board in all its 3D glory. This view can be good for one last double check. You can make sure the layout of your footprints makes sense, and that there&apos;s not an unsightly silkscreen you hadn&apos;t noticed.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.49.45-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1274" height="713" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.49.45-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.49.45-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.49.45-AM.png 1274w" sizes="(min-width: 1200px) 1200px"></figure><p>You can spin the board around with your mouse, but there&apos;s also a button on the navbar to quickly flip it over.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.51.35-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1279" height="718" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.51.35-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.51.35-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.51.35-AM.png 1279w" sizes="(min-width: 1200px) 1200px"></figure><p>For an added bit of fun, you can click the Raytracing button in the top left corner and watch your system perform a ray-traced render of your board in real time.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.51.45-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1275" height="712" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.51.45-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.51.45-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.51.45-AM.png 1275w" sizes="(min-width: 1200px) 1200px"></figure><p><em>Now</em> we&apos;re done. That was quite the journey, but we&apos;re ready to send our PCB off to be fabricated.</p><h2 id="fabulous-fabs">Fabulous Fabs</h2><p>KiCAD and other software generally use their own propriety file formats. While some PCB manufacturers will allow you to upload a KiCAD or EAGLE file, most prefer it you instead use &quot;Gerber&quot; files. Gerbers have been the common standard for plotting and drilling machines since time immemorial. They&apos;re plain text files that are conceptually similar to PDFs. The trick with Gerber files is that&apos;s it&apos;s Gerber<strong><em>s</em></strong><em>. </em>Plural. Each layer of your PCB needs its own specific Gerber file. In practice this isn&apos;t too tricky. Each layer has a specific file name convention which KiCAD does for us automatically. All you have to do is point KiCAD at a folder and then zip the exports afterwards. Because nothing&apos;s every completely straightforward in KiCAD, there&apos;s also a separate &quot;Drill&quot; file you need to include in the zip. Thankfully these aren&apos;t hard to export either, but it is an extra step.</p><p>Once you&apos;ve triple-checked everything on your PCB, head over to KiCAD&apos;s file menu. Hover over &quot;Fabrication Outputs&quot;, and then select &quot;Gerbers&quot;.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.55.52-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.55.52-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.55.52-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.55.52-AM.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>You should be able to stick with the default options here. The Included Layers section will show which layers of your PCB will get exported. <code>F.Cu</code> and <code>B.Cu</code> are your copper layers, <code>F.Paste</code> and <code>B.Paste</code> are used for creating SMD pads, <code>F.Silkscreen</code> and <code>B.Silkscreen</code> contains the text and icons that get printed on your board, <code>F.Mask</code> and <code>B.Mask</code> is the protective coating on non-exposed parts of your board, and <code>Edge.Cuts</code> is where the tool mills away the edge of your board.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.56.54-AM-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1403" height="882" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.56.54-AM-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.56.54-AM-1.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.56.54-AM-1.png 1403w" sizes="(min-width: 1200px) 1200px"></figure><p>The one change you should make on this screen is to specify an Output directory. By default KiCAD will dump your Gerbers in the same folder as your PCB file. Specifying <code>./keyboardname-gerbers</code> will create a folder called <code>keyboardname-gerbers</code> in the same location as your PCB file, and then store all of your outputs there. Click &quot;Plot&quot;, and KiCAD will create all the specified Gerber files.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.58.48-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="883" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-11.58.48-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-11.58.48-AM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-11.58.48-AM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>One last step. Next to the &quot;Plot&quot; button, click &quot;Generate Drill Files...&quot;. This opens up a &quot;Generate Drill Files&quot; modal. This one last step is needed to tell the machine where to physically drill our through hole pins. You can stick with all the defaults. The drill modal should have inherited your Output directory location from the previous screen. Click &quot;Generate Drill File&quot; and you should be good to go.</p><p>Forgetting to create a drill file is a <em>very</em> common step. If you get a message from your PCB fabricator that your upload appears to be missing it&apos;s drill file, it&apos;s because you forgot to do this last step. Don&apos;t worry, it happens to the best of us.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.00.05-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="755" height="574" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.00.05-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.00.05-PM.png 755w" sizes="(min-width: 720px) 720px"></figure><p>Finally, create a .zip file from your <code>keyboard-gerbers</code> folder. Your operating system&apos;s basic compression functionality should be fine. </p><p>At this point our PCB is ready to fabricate! That&apos;s the verb for creating a PCB by the way. The manufacturer of PCBs are known as &quot;Fabricators&quot;, or Fabs for short. There&apos;s a few popular options out there. JLCPCB and PCBWay are the two large fabricators in China. <a href="https://jlcpcb.com/?from=ERGOGEN">JLCPCB</a> is known for having competitive prices, particularly if you&apos;re making a PCB smaller than 100mm x 100mm. (Not super common for keyboards, but folks have <a href="https://github.com/skarrmann/janus">pulled it off</a>.) <a href="https://www.pcbway.com">PCBWay</a> is also another popular Chinese fab. Stateside, <a href="https://oshpark.com">OSH Park</a> has made a name for themselves with strikingly purple PCBs. They&apos;re a bit more expensive then their overseas counterparts, but they do have a faster turnaround time.</p><p>If you decide to create an account with JLCPCB, consider using this URL: <a href="https://jlcpcb.com/?from=ERGOGEN">https://jlcpcb.com/?from=ERGOGEN</a> It doesn&apos;t provide any additional discounts currently, but it&apos;ll let JLCPCB know that Ergogen is sending folks their way. If you decide to go with <a href="https://www.pcbway.com">PCBWay</a>, you can use the coupon code <code>ERGOGEN</code> to get 5% off your order. I&apos;m not affiliated with either of these codes, but am more than happy to pass on the Ergogen dev&apos;s promo codes.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.01.29-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1479" height="1023" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.01.29-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.01.29-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.01.29-PM.png 1479w" sizes="(min-width: 720px) 720px"></figure><p>Whichever fab you go with, the process of getting your PCB manufactured is pretty straightforward. Log into the site, upload your Gerbers (and drill) zip, and then click the buy button. Tutorial finished. Have a great day.</p><p>Okay, but seriously. The default options on these sites are fine. You want a 2 layer PCB, a board that&apos;s 1.6mm thick, and you can pick whichever color you&apos;d like. There are additional options such as the surface finish that you can adjust for an additional cost, but for your first PCB, you don&apos;t need to tweak anything.</p><p>One thing worth noting here is that most PCB fabs require a minimum order size. Usually it&apos;s around 3-5 PCBs. For this particular example board, JLCPCB will manufacture 5 copies of our PCB for $18 USD, and shipping to the US will cost an additional $15 USD. That&apos;s not bad all things considered. Many off the shelf keyboard PCBs run in the $25-35 range. By fabricating your own PCBs, you get some spares in case you have a soldering mishap, or you can share the extras with friends. The manufacturing and shipping of your PCB will take about two weeks, which leaves you just enough time to buy the rest of the parts.</p><h2 id="part-picker">Part Picker</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.09.21-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1192" height="789" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.09.21-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.09.21-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.09.21-PM.png 1192w" sizes="(min-width: 720px) 720px"></figure><p>Ordering parts for a keyboard can feel like a balancing act at times. Prices will vary between vendors, but the more places you shop from, the more you&apos;ll end up paying in shipping fees.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.15.06-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1226" height="732" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.15.06-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.15.06-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.15.06-PM.png 1226w" sizes="(min-width: 720px) 720px"></figure><p>For the keyboard we built, there&apos;s a few different parts we need. There&apos;s the pre-key components: The Choc switches, the keycaps, and the diodes. There&apos;s the microcontroller components: The Arduino Pro Micro, the headers, and the header pins. The OLED screen needs it&apos;s own set of pins and headers as well. Finally, there&apos;s the ancillary hardware such as the reset button. You&apos;ll also need a USB cable if you don&apos;t have one already.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.12.37-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1479" height="549" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.12.37-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.12.37-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.12.37-PM.png 1479w" sizes="(min-width: 720px) 720px"></figure><p>Naturally the types of parts you need will vary based on what you&apos;re building. If you&apos;re making a split keyboard, you&apos;ll need a cable to connect the two halves and sockets for the cable to plug into. If you&apos;re making a wireless keyboard, you&apos;ll need batteries. Looking around at other people&apos;s keyboard designs and seeing which designs worked for them can help here.</p><p>When shopping around, there&apos;s a few different stores you can hit up. There&apos;s a surprising number of mechanical keyboard vendors out there these days. Companies like <a href="https://42keebs.eu">42Keebs</a>, <a href="https://www.littlekeyboards.com">Little Keyboards</a>, and <a href="https://boardsource.xyz">Boardsource</a> are a good place to source keycaps and other keyboard-specific hardware. Electronics component supplies like <a href="https://www.digikey.com">DigiKey</a> and <a href="https://www.mouser.com">Mouser</a> are useful resources for picking up the occasional odd button or switch, although their website designs are not beginner friendly. It helps if you know the part number of what you&apos;re looking for, and you generally need to be able to read data sheets to double-check you&apos;ve found the right component. <a href="https://www.amazon.com">Amazon</a> is always an option as well, although you may not find the best deals there. It&apos;s not really worth it to list anything on the site for less than $7-10 USD, so rather than being able to buy <em>a</em> reset button, you may have to buy a bag of 100. Depending on what you need though, it can save you from needing to hit up yet another vendor. Finally, there&apos;s <a href="https://www.aliexpress.us/">Aliexpress</a>. This site is similar to a Chinese version of Amazon&apos;s seller marketplace. If you don&apos;t mind a two week lead time, you can get some good deals on Choc switches and hotswap sockets there. Your PCBs will take about that long to fab anyways.</p><p>After building your keyboard, you may have the realization that your USB cable isn&apos;t as spiffy and color coordinated as the ones you see on <a href="https://www.reddit.com/r/MechanicalKeyboards/">/r/mechanicalkeyboards</a>. Welcome to your next rabbit hole. If you feel confident enough to solder your own USB cord, <a href="https://www.zapcables.com">Zap Cables</a> can get you the parts needed to make your own custom cable for under $20 USD.</p><p>Here&apos;s an example part list for our tutorial keyboard. These are also often referred to as a &quot;Bill of Materials&quot;, or BOM. All told, you&apos;re going to be looking at about $200-300 USD depending on how fancy you want to get with your new keyboard. Hmm, maybe I should have lead with that in the introduction. Surprise? If this isn&apos;t your first rodeo, reusing keycaps or leveraging hot swap sockets can at least take some of the sting out. </p><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px">
<tbody><tr class="post-table-header">
<th style="border-top-right-radius: 0px">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px">Price (Total)</th>
</tr>
<tr>
<td><a href="https://jlcpcb.com/">PCB Fab (With Shipping)</a></td>
<td>1</td>
<td>$30.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/controllers/pro-micro-usb-c-controller/">Arduino Pro Micro</a></td>
<td>1</td>
<td>$10.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/oled-display-0-91-128x32/">OLED Display</a></td>
<td>1</td>
<td>$4.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/switches/choc/kailh-choc-low-profile-switches/">Kailh Choc v2 Switches</a></td>
<td>6 (58 Keys Total)</td>
<td>$30.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/1n4148-diodes-through-hole-smd/">1N4148 Diodes (SMD)</a></td>
<td>6 (58 Diodes Total)</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/kailh-choc-hot-swap-sockets/">Kailh Choc Hotswap Sockets</a></td>
<td>6 (58 Sockets Total)</td>
<td>$10.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/reset-switch/">Reset Switch (SMD, 4 Pin, Flat)</a></td>
<td>1</td>
<td>$0.50 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/mill-max-315-sockets-3320-pins-for-pro-micro/">Mill Max Sockets &amp; Pins</a></td>
<td>1</td>
<td>$7.50 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/microcontroller-socket-medium-profile/">Medium Profile Controller Socket</a></td>
<td>1</td>
<td>$0.50 USD</td>
</tr>
<tr>
<td><a href="https://mkultra.click/mbk-legend-keycaps/">Choc v1 Keycaps</a></td>
<td>1</td>
<td>$75.00 USD</td>
</tr>
</tbody></table><!--kg-card-end: html--><h2 id="firmware-options">Firmware Options</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.32.34-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="857" height="371" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-15-at-3.32.34-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-15-at-3.32.34-PM.png 857w" sizes="(min-width: 720px) 720px"></figure><p>Now that all our parts are in the mail, it&apos;s time to start thinking about firmware options. DIY mechanical keyboards have a few different firmware options at this point depending on which type of microcontroller you end up using. Most wired Arduino Pro Micro and RP2040 based keyboards use the popular <a href="https://qmk.fm">QMK</a> firmware. Meanwhile, wireless keyboards leveraging the Nice!Nano microcontroller typically employ <a href="https://zmk.dev">ZMK</a> instead. There are some differences between the two firmwares, but they&apos;re both philosophically very similar.</p><p><a href="https://docs.qmk.fm/#/">QMK&apos;s documentation</a> has a dedicated section for <a href="https://docs.qmk.fm/#/porting_your_keyboard_to_qmk">porting your keyboard to QMK</a>. They also have some excellent additional background information on <a href="https://docs.qmk.fm/#/how_a_matrix_works">keyboard matrixes</a>. Meanwhile, <a href="https://zmk.dev/docs">ZMK&apos;s documentation</a> has their own guide for how to create a <a href="https://zmk.dev/docs/development/new-shield">&quot;shield&quot; configuration</a> for your keyboard. Both of these firmwares rely on you defining the pins used for your rows and columns, and then creating a configuration that outlines the physical arrangement of those keys. From there, you can start programming macros to your heart&apos;s content. Both of these firmwares also have support for additional hardware such as the OLED display we created a footprint for earlier. (Although you <em>probably</em> don&apos;t want to use an OLED screen on a wireless battery operated keyboard. There&apos;s some <a href="https://nicekeyboards.com/nice-view">low power alternatives</a> for those keyboards.)</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.16.26-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1492" height="727" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.16.26-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.16.26-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.16.26-PM.png 1492w" sizes="(min-width: 720px) 720px"></figure><p>The two firmwares have slightly different approaches when it comes to compiling your firmware. QMK has instructions on how to <a href="https://docs.qmk.fm/#/newbs_building_firmware">compile</a> your new keyboard firmware locally on your computer, while ZMK has a process using <a href="https://zmk.dev/docs/user-setup">GitHub Actions</a> to streamline the compilation of your firmware.</p><p>Once you have your firmware compiled, you need to &quot;flash&quot; it onto your keyboard. To start the flashing process, you need to double tap the reset button on your keyboard or microcontroller to reboot the microcontroller into a flashing mode. After that, you need to send the firmware from your computer onto the microcontroller. For sending <a href="https://docs.qmk.fm/#/newbs_flashing">QMK to an Arduino Pro Micro</a>, this relies on using lower-level commands to send the compiled firmware to the microcontroller. Thankfully the <a href="https://github.com/qmk/qmk_toolbox">QMK Toolbox</a> utility wraps these functions in a straightforward GUI. ZMK is a bit more <a href="https://zmk.dev/docs/user-setup">straightforward</a>. Double tapping the reset button will mount the Nice!Nano microcontroller as a storage device on your computer. You simply need to drag and drop your compiled firmware onto the microcontroller with your computer&apos;s file browser to kick off the flashing process.</p><p>Both of these firmwares are well documented with their own community Discords. I might do an article on writing your own QMK or ZMK configuration in the future, but for now their documentation and the row, column, and microcontroller pin background we went over in this guide should be enough to set you down the right path.</p><h2 id="assembling-your-team">Assembling Your Team</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.17.12-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1481" height="1113" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.17.12-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.17.12-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.17.12-PM.png 1481w" sizes="(min-width: 720px) 720px"></figure><p>Hopefully by the time you&apos;ve got your first attempt at a custom firmware compiled your parts will have arrived. All that&apos;s left is to finally build your keyboard.</p><p>Keyboard designs can vary, but the actual act of building them is fairly universal. If this is your first rodeo, find a keyboard with similar functionality to your own and see if it has a build guide. Brian Low did an excellent job outlining the build process for the <a href="https://choc.brianlow.com/pages/build">Sofle Choc</a> for instance. The venerable <a href="https://github.com/foostan/crkbd">Corne keyboard</a> has variants for nearly every type of key switch and hotswap socket configuration, so it&apos;s also a useful resource for assembly tips. Finally, as much as I&apos;ve enjoyed writing out this long-form text guide, <a href="https://www.youtube.com/watch?v=UKfeJrRIcxw">YouTube</a> does have a place when it comes to soldering tips.</p><p>In general, measure twice and solder once. Make sure your parts are oriented properly <em>before</em> you bond it to your PCB with liquid hot metal. You can solder a lot of these parts in any order, but starting with the per-switch components like diodes and hotswap sockets allow you to lay the board flat on your work surface for the first few steps.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/image.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/image.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/image.png 1000w, https://flatfootfox.com/content/images/2023/04/image.png 1600w" sizes="(min-width: 720px) 720px"></figure><p>You never want to look up nine months after a keyboard build and realize your microcontroller has somehow gone bad, so <em>socket your microcontrollers. </em>It adds a tiny bit onto the cost, but it&apos;s worth having the flexibility in the long run. If you get bit by the keyboard building bug, you can even move microcontrollers between keyboards and save yourself a bit of additional cost with each new build.</p><p>If you ask a friend to 3D print a case for you, buy them a six pack of their beverage of choice. If you&apos;re feeling particularly generous (or are having to iterate through multiple designs), you could even offer to buy your friend a $20 USD spool of 3D printer plastic. It&apos;s roughly the cost of mailing away for a piece, and you get to pick your case color rather than dipping into their available supply.</p><p>After building your keyboard and gathering the parts for the case, make sure to test your keyboard thoroughly before assembling the case. Enviably you&apos;ll notice one lose joint the second you&apos;ve painstakingly socketed every part and screwed down every piece.</p><p>At this point, you should have a brand spanking new keyboard. Thanks for sticking it out through all five parts of this guide! Hopefully you picked up a thing or two!</p><h2 id="a-brief-disclaimer">A Brief Disclaimer</h2><p>This guide was a fun excuse to learn Ergogen v4. If you&apos;d like to look at any of the config files or outputs from this guide, they&apos;re uploaded on <a href="https://github.com/imstubtw/ergogen-tutorial">Github</a> now. However, I&apos;ve never actually built this example keyboard. The techniques and methodologies I used in this series are based off of the <a href="https://flatfootfox.com/the-chonkv-keyboard/">very similar ChonkV keyboard</a> I made with Ergogen v3. Since they&apos;re so similar to one another, I haven&apos;t actually sent this particular tutorial PCB design off to get fabricated. There may be a short in the wiring somewhere, or the case may be slightly too snug, or the thumb keys may be brushing up against each other. If you were planning on dropping the Gerbers onto a PCB fab and ordering the parts, just be warned that this hasn&apos;t been fully tested in the real world just yet.</p><p>If you&apos;re not interested in learning Ergogen but like the idea of a Choc-spaced unibody keyboard similar to the Sofle, you&apos;re in luck! Josef Adam&#x10D;&#xED;k is working on the <a href="https://josef-adamcik.cz/electronics/sofle-unsplit-stana-keyboard.html">St&#xE1;&#x148;a</a> unibody keyboard. It&apos;s a more polished, refined take on the style of keyboard that was featured here.</p><h2 id="conclusion">Conclusion</h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.22.26-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)" loading="lazy" width="1405" height="886" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.22.26-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.22.26-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.22.26-PM.png 1405w" sizes="(min-width: 1200px) 1200px"></figure><p>Congratulations, you now have a custom bespoke DIY keyboard unlike any other input device in the world! Happy typing! If you&apos;d like to test your new WPM, <a href="https://monkeytype.com">MonkeyType</a> is always a popular online typing test. </p><p>I sincerely hope you found this guide useful. The world of custom low profile ergonomic mechanical keyboards has been fun to explore, and I hope this series serves as a useful on ramp for those looking to get into the hobby. Even if I didn&apos;t cover exactly what you&apos;re looking to build here, you hopefully have a better sense of what to Google now. If you designed your own keyboard with this guide, we&apos;d love to hear about it in the Ergogen <a href="https://discord.gg/DbCfZfZ">Discord</a>, or feel free to send me a picture of it on <a href="https://tech.lgbt/@flatfootfox">Mastodon</a>! If you&apos;re feeling extra generous, I&apos;ve got a Cash App tip jar over at <a href="https://cash.app/$ItsAStu">$ItsAStu</a>.</p>]]></content:encoded></item><item><title><![CDATA[Let's Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, & Cases (Part 4)]]></title><description><![CDATA[In this section of Let's Design a Keyboard with Ergogen v4, we're wrapping up the last few bits of functionality. Installing it locally, adding custom footprints, and designing a case!]]></description><link>https://flatfootfox.com/ergogen-part4-footprints-cases/</link><guid isPermaLink="false">6420869c1914912295540ffb</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Mon, 10 Apr 2023 02:56:40 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Ergogen-Case.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Ergogen-Case.jpg" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)"><p>Welcome back! We&apos;re in the home stretch now. Well, home-ish stretch. If you need catching up: The series <a href="https://flatfootfox.com/ergogen-introduction/">introduction</a> introduced us to the world of Ergogen, <a href="https://flatfootfox.com/ergogen-part1-units-points/">Part 1</a> created the points that define out layout, and <a href="https://flatfootfox.com/ergogen-part2-outlines/">Part 2</a> created some useful outlines for our keyboard. In <a href="https://flatfootfox.com/ergogen-part3-pcbs/">Part 3</a> we created the basis of our keyboard&apos;s PCB, defined the footprints for our parts, and connected them all together with nets. If you&apos;re familiar with KiCAD, you can probably run off and trace the routes on your own at this point. Slap some rubber feet on the bottom of the keyboard and call it a day!</p><p>In the interest of completeness however, I&apos;d like to take a side trip over to the last few Ergogen topics I haven&apos;t touched on just yet. Chief among these is the &quot;Cases&quot; section. Ergogen has functionality to export outlines as 3D objects with a depth component. The web implementation of Ergogen doesn&apos;t support exporting these files just yet however, which gives us an excuse to dabble in the world of a locally installed, offline Ergogen.</p><p>Even if you don&apos;t own a 3D printer and aren&apos;t interested in creating a case for your keyboard, running a local copy of Ergogen allows you to import custom footprints from outside of the main Ergogen GitHub repository. This chapter will use that functionality to import a mounting hole footprint, but the same theory could apply to a different microcontroller, toggle switch, or rotary encoder. Part 4 still has something for everyone.</p><blockquote>Update: Thanks to the updates Ceoloide has made to Ergogen, much of what Part 4 covered can now be performed in the <a href="https://ergogen.xyz/">ergogen.xyz</a> web view. It now supports integrating external footprints, and has experimental support for KiCAD previews. Working with Ergogen locally can still be useful for certain workflows, so I&apos;m keeping this part in the guide. Just know that if all you need to do is drop a single mounting hole footprint in, there&apos;s a much more straightforward approach these days.</blockquote><h2 id="commanding-the-line">Commanding the Line</h2><p>Installing Ergogen locally on your computer is thankfully a fairly straightforward process. Ergogen is written in the popular cross-platform NodeJS scripting language. As the name implies, Node leverages the Javascript, making it easily adaptable to Windows machines, Mac laptops, or Linux setups. As we saw earlier, it&apos;s also what makes it easy to create a web implementation for Ergogen.</p><p>Node install instructions vary over time and by platform. Your best guess is to mosey on over to <a href="https://nodejs.org">NodeJS.org</a> and follow their instructions there. If you&apos;re on a Mac or Linux system, you may also want to look into the <a href="https://github.com/nvm-sh/nvm">Node Version Manager</a> application if you haven&apos;t already. nvm can save you some versioning headaches in the long run if you start using Node more regularly.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/ergogen-node.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="585" height="372"></figure><p>Installing Node nets you more than just the scripting environment. You also get the Node Package Manager. Rather than having to fiddle with a bunch of application files and install scripts, npm lets you easily download and install Node packages from <a href="https://www.npmjs.com">npmjs.com</a>. These packages can be installed in one or two ways: Locally or Globally.</p><p>A local package install works like most software. It creates a folder in a specified location on your hard drive, and to use that package you need to navigate to that folder. This is useful for programs that have very isolated contexts, or apps that you may install multiple instances of.</p><p>In Ergogen&apos;s case, we don&apos;t want a single isolated instance of the tool. We want to be able to run it inside of any of our future keyboard project folders like a standard command line utility. This means we should perform a global install for Ergogen. This installs Ergogen to a Node system folder, and allows us to call the utility from anywhere on the command line.</p><p>Enough command line background, let&apos;s get to it! Assuming your NodeJS install is up and running, open a command line and run:</p><pre><code class="language-markup">npm i -g ergogen</code></pre><p><code>npm</code> calls the Node Package Manager, <code>i</code> is short for install, <code>-g</code> is the global flag, and <code>ergogen</code> is the name of the package we want to install. Easy peasy.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/ergogen-install.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="585" height="370"></figure><p>Now that we&apos;ve got Ergogen installed, go ahead and do whatever it is you usually do when starting a new coding project. In my case, I&apos;m creating a new folder inside of <code>~/pcb</code> on my system called <code>/tutorial</code>. This is where my Ergogen config will live, and where all the outputs will be placed. I&apos;m also running a quick <code>git init</code> to create a local git repository in case I accidentally screw something up and want to roll back to an earlier state. Finally, create a file called <code>config.yaml</code> inside of your project folder and copy the contents of your <a href="https://ergogen.xyz/">ergogen.xyz</a> config into it.</p><p>Now&apos;s the moment of truth. Let&apos;s run Ergogen!</p><pre><code class="language-markup">ergogen config.yaml</code></pre><p><code>ergogen</code> is the name of our command, and <code>config.yaml</code> is the name of your config file. If everything goes smoothly, Ergogen will create an <code>outputs</code> folder and put our finished files inside of it. If you&apos;d like to use an outputs folder with a different name, you can use the <code>-o output_folder_name</code> option to specify your own.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-Test.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="585" height="372"></figure><p>With that, we should be back to where we were with the web UI. We&apos;ve got all of our .dxf outline files, as well as the .kicad_pcb file.</p><p>So far running things locally hasn&apos;t gotten us anything astounding yet. The web UI is useful for generating points and outlines, while the local instance can make constantly reloading new KiCAD files a bit easier. There are a few tricks up the local install&apos;s sleeve however. Let&apos;s first take a look at loading external footprints.</p><h2 id="expanding-the-footprint-clan">Expanding The Footprint Clan</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-Foot-Clan.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="807" height="800" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen-Foot-Clan.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen-Foot-Clan.png 807w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><sub>Wow this section header is going to date me.</sub><!--kg-card-end: html--><p>Ergogen <a href="https://github.com/ergogen/ergogen/tree/develop/src/footprints">comes with</a> a useful assortment of component footprints. At some point however you&apos;ll most likely want to add something a bit custom to your keyboard. In the old Ergogen v3 era you would need to fork Ergogen, add your additional footprints, and then run your new custom fork locally.</p><p>Thankfully in Ergogen v4, there&apos;s now a dedicated method for referencing external footprints. As of the time of writing this guide, this technique only works on local instances of Ergogen. The code&apos;s already there to handle bundled .zip footprint collections however, so it&apos;s only a matter of time until the web instance gets updated as well.</p><p>For this external footprint example, I&apos;m going to use <a href="https://github.com/MvEerd">MvEerd&apos;s</a> <a href="https://github.com/MvEerd/ergogen/pull/6">M2 mounting hole footprint</a>. Creating your own custom footprint is a bit outside of the scope of this tutorial, but they&apos;re written in fairly straightforward javascript files. If you need to make a small tweak to an existing footprint, it shouldn&apos;t be too difficult to fumble your way through it. There are a <em>lot</em> of community footprints at this point, so poke around Github to see what else is out there, or hit up the <a href="https://discord.gg/DbCfZfZ">Ergogen Discord</a>.</p><p>Go ahead and download the <a href="https://github.com/MvEerd/ergogen/blob/d8ce16cfe664797d1b2ff3055ec2ef98935ae644/src/footprints/mountinghole.js">M2 mounting hole footprint</a>. (&quot;M2&quot; is metric shorthand for a screw with a 2mm diameter.) If you haven&apos;t downloaded individual files from GitHub before, you&apos;ll need to right click on the Raw button and download it to your computer. Make sure it keeps the <code>mountinghole.js</code> name. Some browsers like adding .txt onto the end of .js.</p><p>Create a new folder inside of your project folder called <code>footprints</code>. Place <code>mountinghole.js</code> inside of it.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-vs.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="1096" height="557" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen-vs.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Ergogen-vs.png 1000w, https://flatfootfox.com/content/images/2023/04/Ergogen-vs.png 1096w"></figure><p>This screenshot shows the current structure of our project file. There&apos;s a few things to note here when working with external footprints. Ergogen has historically allowed you to use any file name for your .yaml config. If you named your config <code>tutorial.yaml</code>, all you would need to do is call <code>ergogen tutorial.yaml</code> for Ergogen to parse the file.</p><p>That&apos;s not the case here. <strong>When working with external footprints, it&apos;s <em>required</em> that you use the filename <code>config.yaml</code> for your Ergogen config.</strong> Secondly, we need to change how we call Ergogen. Instead of the usual <code>ergogen config.yaml</code> command, we need to pass our entire folder to Ergogen.</p><p>This can be accomplished easily enough. But first, let&apos;s add an example mounting hole to our <code>config.yaml</code> file.</p><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="16-19"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline:
          board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro: ...
      oled: ...
      reset: ...
      holeTopLeft:
        what: mountinghole
        where:
          ref: [matrix_outer_num]
</code></pre><!--kg-card-end: html--><p>This should be pretty standard at this point. <code>holeTopLeft:</code> is the name of our footprint. <code>what: mountinghole</code> indicates that we&apos;d like to use mountinghole.js for the footprint. <code>where.ref: [matrix_outer_num]</code> places the footprint smack dab in the middle of the top left key.</p><p>The trick here is that mountinghole.js isn&apos;t in the Ergogen GitHub repository. It&apos;s part of our local project folder. Thankfully we don&apos;t need to use any special syntax as long as we place the footprint files in the correct location. Without further ado, let&apos;s fire up Ergogen and provide it with our project folder.</p><pre><code class="language-markup">ergogen .</code></pre><p>That&apos;s a bit of an anticlimax. On command lines, a single dot is shorthand for &quot;the current folder that I&apos;m in. By calling Ergogen this way, we&apos;re telling it that it needs to look at both the config.yaml file <em>and</em> all of the .js files inside of the <code>./footprints</code> folder.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/ergogen-dot.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="587" height="373"></figure><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-1.32.23-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="1534" height="809" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-1.32.23-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-08-at-1.32.23-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-1.32.23-PM.png 1534w" sizes="(min-width: 720px) 720px"></figure><p>There&apos;s our mounting hole! You need to make sure all your ducks are in a row, but working with external footprints is a huge step up in Ergogen v4. I cannot stress enough that you need to call Ergogen with <code>ergogen .</code> instead of <code>ergogen config.yaml</code></p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-1.35.35-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="585" height="372"></figure><p>There&apos;s a ton of examples and documentation online for v3 with the config file explicitly called out. Don&apos;t get tripped up!</p><h2 id="mounting-holes">Mounting Holes</h2><p>Mounting holes are a convenient way of attaching a case to a PCB. Our custom footprint is honestly a bit overkill. We could have just created a few circle outlines and drilled them out of our PCB as edge cuts. (You&apos;ll see this from time to time if you go poking around Github.) But now that we&apos;ve got a properly drilled mounting hole, let&apos;s go ahead and add a few more.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-1.52.25-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="1364" height="690" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-1.52.25-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-08-at-1.52.25-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-1.52.25-PM.png 1364w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="20-43"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline:
          board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro: ...
      oled: ...
      reset: ...
      holeTopLeft:
        what: mountinghole
        where:
          ref: [matrix_outer_num]
      holeTopInnerLeft:
        what: mountinghole
        where:
          ref: [matrix_index_num]
      holeBottomInnerLeft:
        what: mountinghole
        where:
          ref: [matrix_index_mod]
      holeTopRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_outer_num]
      holeBottomRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_outer_bottom]
      holeTopInnerRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_index_num]
      holeBottomInnerRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_index_mod]
</code></pre><!--kg-card-end: html--><p>Things are looking good so far, but we&apos;ve got the classic issue of having placed out footprints directly inside of one of our key switches. Let&apos;s add some shifts to move these mounting holes over.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-2.12.02-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="1355" height="683" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-2.12.02-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-08-at-2.12.02-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-2.12.02-PM.png 1355w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="20,25,30,35,40,45,50,55"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline:
          board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro: ...
      oled: ...
      reset: ...
      holeTopLeft:
        what: mountinghole
        where:
          ref: [matrix_outer_num]
          shift: [0.5kx, -0.3ky]
      holeBottomLeft:
        what: mountinghole
        where:
          ref: [matrix_outer_bottom]
          shift: [0.5kx, -0.3ky]
      holeTopInnerLeft:
        what: mountinghole
        where:
          ref: [matrix_index_num]
          shift: [0.5kx, -0.4ky]
      holeBottomInnerLeft:
        what: mountinghole
        where:
          ref: [matrix_index_mod]
          shift: [0.5kx, -0.35ky]
      holeTopRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_outer_num]
          shift: [0.5kx, -0.3ky]
      holeBottomRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_outer_bottom]
          shift: [0.5kx, -0.3ky]
      holeTopInnerRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_index_num]
          shift: [0.5kx, -0.4ky]
      holeBottomInnerRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_index_mod]
          shift: [0.5kx, -0.35ky]
</code></pre><!--kg-card-end: html--><p>There we go! Our mounting holes have been nudged over between the keys, and shifted down slightly so that they&apos;re tucked away between the diodes. This design might be a <em>little</em> tight if you&apos;re using through hole diodes, but it should work fine for smd diodes.</p><p>That wraps up our last big change to the PCB. The important thing to note here is that we can use these same <code>where:</code> values when constructing our PCB to know exactly where each of these mounting holes go.</p><h2 id="making-a-case">Making A Case</h2><p>3D printing is an art form of its own. People familiar with CAD tools most likely have some idea of the type of case they&apos;d like to design. This section isn&apos;t going to be an exhaustive treatise on keyboard case design. We&apos;re going to quickly slap something together in Ergogen to cover the bottom of our keyboard and give it a bit of color.</p><p>Let&apos;s define a simple 3D model now.</p><pre><code class="language-yaml">units: ...
points: ...
outlines:
  raw: ...
  keys: ...
  board: ...
  combo: ...
pcbs: ...
cases:
  bottom:
    - name: board
      extrude: 1</code></pre><p>After everything we just went through with the PCB, cases are surprisingly straightforward. The <code>cases:</code> section is similar to the <code>outlines:</code> section of our Ergogen config file. Instead of creating flat .dxf files, it creates 3D files with depth.</p><p>The <code>bottom:</code> entry is a name we gave this particular 3D model. <code>- name: board</code> refers to the outline we defined earlier. Finally, <code>extrude: 1</code> tells Ergogen to create a 3D model that is 1mm tall. </p><p>Ergogen v3 previously exported cases files in the .stl lingua franca format of 3D printing. Due to some technical issues with the .stl file creation library, Ergogen v4 exports cases as .jscad files. If you&apos;d like to convert these into .stl files, you can use sites like <a href="https://openjscad.xyz/">openjscad.xyz</a> or their <a href="https://www.npmjs.com/package/@jscad/cli">NPM package</a>. We&apos;re already working on the command line, so let&apos;s leverage their command line package. </p><pre><code class="language-markup">npx @jscad/cli@1 output/cases/bottom.jscad -of stla -o bottom.stl</code></pre><p>This line uses the Node Package Manager&apos;s <code>npx</code> command to run JSCAD as an executable. It&apos;s a whole topic worth looking into on its own, but the short story is that the above command will convert a .jscad into an .stl files for us.</p><p>If we want to run both Ergogen and JSCAD with one terminal command, we can string them together with:</p><pre><code class="language-markup">ergogen . &amp;&amp; npx @jscad/cli@1 output/cases/bottom.jscad -of stla</code></pre><p>This will only match the one part name of <code>bottom.jscad</code> however. If we&apos;d like to get real fancy, the following command will process your Ergogen files and then convert every .jscad file in your outputs folder. Sometimes it&apos;s hard to beat a good old fashioned for loop. (The output name is implicitly understood to be the same as the input name here.)</p><pre><code class="language-markup">ergogen . &amp;&amp; for i in output/cases/*.jscad; do npx @jscad/cli@1 &quot;$i&quot; -of stla; done</code></pre><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-2.42.23-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="799" height="611" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-2.42.23-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-2.42.23-PM.png 799w" sizes="(min-width: 720px) 720px"></figure><p>After all that, we&apos;ve got a 1mm thick version of our bottom outline. Hurray?</p><p>Let&apos;s see if we can add some walls to our case design. First up, we need an outline of our board that&apos;s a few mm larger than the actual PCB design.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-2.53.38-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="800" height="513" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-2.53.38-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-2.53.38-PM.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="9-10,16-64,71-73"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 4
  py: ky + 4
  # Double Padding Variables
  dpx: kx + 8
  dpy: ky + 8
points: ...
outlines:
  raw: ...
  keys: ...
  board: ...
  xlBoard:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5dpx,0.5dpy]
        - ref: matrix_ring_num
          shift: [-0.5dpx,0.5dpy]
        - ref: matrix_middle_num
          shift: [-0.5dpx,0.5dpy]
        - ref: matrix_middle_num
          shift: [0.5dpx,0.5dpy]
        - ref: matrix_inner_num
          shift: [0.5dpx,0.5dpy]
        - ref: matrix_inner_top
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_inner_top
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_inner_num
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_middle_num
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_middle_num
          shift: [-0.5dpx,0.5dpy]
        - ref: mirror_matrix_ring_num
          shift: [-0.5dpx,0.5dpy]
        - ref: mirror_matrix_outer_num
          shift: [-0.5dpx,0.5dpy]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5dpx,-0.5dpy]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5dpx,-0.5dpy]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5dpx,-0.5dpy]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.5dpy,-0.5dpx]
        - ref: mirror_thumbs_space_cluster
          shift: [0.5dpy,-0.5dpx]
        - ref: thumbs_space_cluster
          shift: [0.5dpy,-0.5dpx]
        - ref: thumbs_space_cluster
          shift: [-0.5dpy,-0.5dpx]
        - ref: thumbs_layer_cluster
          shift: [-0.5dpx,-0.5dpy]
        - ref: matrix_ring_mod
          shift: [-0.5dpx,-0.5dpy]
        - ref: matrix_outer_bottom
          shift: [-0.5dpx,-0.5dpy]
      fillet: 2
    combo: ...
pcbs: ...
cases:
  bottom:
    - name: board
      extrude: 1
  xlBottom:
    - name: xlBoard
      extrude: 1
</code></pre><!--kg-card-end: html--><p>Our good buddy units is back! Our original board outline used the <code>px</code> and <code>py</code> padding variables to make a board that was 2mm wider than it absolutely needed to be. <code>dpx</code> and <code>dpy</code> are adding another 2px onto the outside of our new <code>xlBoard</code> outline. Just as before we were able to create a 1mm case file called <code>xlBottom</code>.</p><p>...okay. So we have a slightly bigger bottom board. Does that get us anything? Well, cases can be added and subtracted to just like we did with the <code>combo</code> outline in <a href="https://flatfootfox.com/ergogen-part2-outlines/">Part 2</a>. If we subtracted <code>board</code> from <code>xlBoard</code>, we&apos;d start getting something that resembles a wall.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-3.20.31-PM-2.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="799" height="510" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-3.20.31-PM-2.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-3.20.31-PM-2.png 799w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="314" data-line-offset="314" data-line="322-333"><code>cases:
  bottom:
    - name: board
      extrude: 1
  xlBottom:
    - name: xlBoard
      extrude: 1
  _outerWall:
    - name: xlBoard
      extrude: 4
  _innerWall:
    - name: board
      extrude: 4
  wall:
    - what: case
      name: _outerWall
      operation: add
    - what: case
      name: _innerWall
      operation: subtract
</code></pre><!--kg-card-end: html--><p>Now that&apos;s starting to look like a case! We even got to introduce a bit more syntactic flare to our config. Prefixing an outline or case with an underscore will signal to Ergogen that it doesn&apos;t need to export a particular asset to our outputs files. It can still be referenced by other cases however, which is exactly what we did here.</p><p><code>_outerWall</code> and <code>_innerWall</code> were 4mm repeats of what we&apos;ve seen before. <code>wall</code> is a bit new however. Instead of creating a new case object, we combined two together. The <code>what:</code> property defaults to an outline when working with cases, so we had to be explicit here that we wanted to refer to one of our earlier case files. <code>name:</code> tells Ergogen which case files we&apos;d like to reference. <code>operation:</code> meanwhile tells Ergogen what we&apos;d like to do to those particular case file. <code>add</code> is the default implicit option, but in this case we wanted to use <code>operation: subtract</code> to remove the inner option of our larger outline.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-3.29.37-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="799" height="364" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-3.29.37-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-3.29.37-PM.png 799w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="314" data-line-offset="314" data-line="334-340"><code>cases:
  bottom:
    - name: board
      extrude: 1
  xlBottom:
    - name: xlBoard
      extrude: 1
  _outerWall:
    - name: xlBoard
      extrude: 4
  _innerWall:
    - name: board
      extrude: 4
  wall:
    - what: case
      name: _outerWall
      operation: add
    - what: case
      name: _innerWall
      operation: subtract
  case:
    - what: case
      name: xlBottom
      operation: add
    - what: case
      name: wall
      operation: add
</code></pre><!--kg-card-end: html--><p>One more quick addition, and now we&apos;ve got a nice stable base with some sturdy looking walls. This <code>case</code> piece should make a good basis for the rest of our build. Now we just need to address those mounting holes.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-3.46.28-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="798" height="552" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-3.46.28-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-3.46.28-PM.png 798w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="9-12,20-60,68-70,75-77"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 4
  py: ky + 4
  # Double Padding Variables
  dpx: kx + 8
  dpy: ky + 8
  # Defaults to M2 Screws
  screwSize: 1
points: ...
outlines:
  raw: ...
  keys: ...
  board: ...
  xlBoard: ...
  combo: ...
  mounting:
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_index_mod]
        shift: [0.5kx, -0.35ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_index_mod]
        shift: [0.5kx, -0.35ky]
pcbs: ...
cases:
  bottom: ...
  xlBottom: ...
  _outerWall: ...
  _innerWall: ...
  wall: ...
  _holes:
    - name: mounting
      extrude: 4
  case:
    - what: case
      name: xlBottom
      operation: add
    - what: case
      name: _holes
      operation: add
    - what: case
      name: wall
      operation: add
</code></pre><!--kg-card-end: html--><p>Another giant code block, but most of this should start to look a little familiar. To start with I added a new unit called <code>screwSize: 1</code> to use as the radius of our screws. I then created a new outline called <code>mounting:</code> which reused the <code>where.ref:</code> and <code>where.shift:</code> values from our mounting holes on the PCB. (This <code>mounting</code> outline is a good example of including multiple shapes within a single outline by the way.) Finally, I created a new case called <code>_holes</code> and added it to our final <code>case</code> part.</p><p>You could keep going with this approach and create a basic plastic standoff design to slot onto the PCB, but we can get a much sturdier design by introducing a few extra pieces of hardware.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/featured_preview_IMG_9583.jpg" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="628" height="472" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/featured_preview_IMG_9583.jpg 600w, https://flatfootfox.com/content/images/2023/04/featured_preview_IMG_9583.jpg 628w"><figcaption>An example <a href="https://www.thingiverse.com/thing:5443846">Sofle Choc</a> case with metal standoffs.</figcaption></figure><p><a href="https://www.amazon.com/dp/B07LBQFNQD">Threaded screw inserts</a> are small pieces of metal with a screw hole in the middle. They&apos;re designed to let you add a sturdy mounting point on wooden or plastic components. They&apos;re 3.2mm wide, and 3mm tall. All you need to do to add them to your design is create a hole that&apos;s 3mm in diameter and 3mm tall. Then you use a soldering iron to warm up the screw insert and melt the last 0.2mm of plastic. Once they&apos;re in place, you just need a standard <a href="https://www.amazon.com/gp/product/B01FTI8TM8/">M2 laptop-style flathead screw</a> to hold the keyboard in place.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/51gzO9-8WuL._SL1100_-1.jpg" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="680" height="445" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/51gzO9-8WuL._SL1100_-1.jpg 600w, https://flatfootfox.com/content/images/2023/04/51gzO9-8WuL._SL1100_-1.jpg 680w"></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>To add support for these threaded screw inserts to our design, we need to define a second set of slightly larger mounting holes, and then subtract the inner holes from the outside holes like we did for the wall part. The outer walls will be 5mm thick, with a 3mm hollow inside.</p><p>Incidentally, these threaded screw inserts are why I had been using 4mm for some of the heights in the case section. 1mm for the base of the case plus 3mm for the standoff height is 4mm. You could get a <em>little</em> thinner without the standoffs, but the hotswap sockets are already 2mm thick. This design is only making the case 2mm thicker than the bare PCB itself.</p><p>Double-checking all the number just now made me realize I had undershot the wall height. The walls currently come up to the <em>bottom</em> of the PCB, but I want it to be flush with the top. We need to add the 1.6mm height of the PCB to the walls. Let&apos;s build our threaded screw insert standoffs and fix those heights.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-4.12.33-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="802" height="535" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-08-at-4.12.33-PM.png 600w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-08-at-4.12.33-PM.png 802w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="12-13,22-62,73-89"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 4
  py: ky + 4
  # Double Padding Variables
  dpx: kx + 8
  dpy: ky + 8
  # M2 Screw Inserts
  screwSize: 1.5
  standoffSize: 2.5
points: ...
outlines:
  raw: ...
  keys: ...
  board: ...
  xlBoard: ...
  combo: ...
  mounting
  standoff:
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_index_mod]
        shift: [0.5kx, -0.35ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_index_mod]
        shift: [0.5kx, -0.35ky]
pcbs: ...
cases:
  bottom: ...
  xlBottom: ...
  _outerWall:
    - name: xlBoard
      extrude: 5.6
  _innerWall:
    - name: board
      extrude: 5.6
  wall: ...
  _holes:
    - name: mounting
      extrude: 4
  _standoffs:
    - name: standoff
      extrude: 4
  case:
    - what: case
      name: _standoffs
      operation: add
    - what: case
      name: _holes
      operation: subtract
    - what: case
      name: xlBottom
      operation: add
    - what: case
      name: wall
      operation: add
</code></pre><!--kg-card-end: html--><p>The threaded screw insert standoffs are looking great! With that, our case is finished! We&apos;ve got slightly more than a minimum viable case without ever having to leave Ergogen.</p><p>If you&apos;ve got something a bit more complicated in mind, it may be worth pivoting to CAD software at some point. There are beginner friendly options like Autodesk&apos;s <a href="http://tinkercad.com">TinkerCAD</a> software, or more high end suites like <a href="https://www.autodesk.com/products/fusion-360/overview">Autodesk Fusion 360</a> for creating impressive beveled edges. Even if your end product isn&apos;t created from Ergogen alone, the .dxf and .stl files generated by it provide great starting points. For a more focused guide on keyboard case design theory, check out Sadek Baroudi excellent <a href="https://kbd.news/Keyboard-Case-Design-1764.html">KBD News article</a> on the topic.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-09-at-3.22.20-PM-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)" loading="lazy" width="2000" height="1273" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-09-at-3.22.20-PM-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-09-at-3.22.20-PM-1.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/04/Screenshot-2023-04-09-at-3.22.20-PM-1.png 1600w, https://flatfootfox.com/content/images/size/w2400/2023/04/Screenshot-2023-04-09-at-3.22.20-PM-1.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>It&apos;s worth noting that if you&apos;re building a unibody keyboard like the one we designed in this tutorial, there&apos;s a good chance your keyboard will be larger than your 3D printer&apos;s print area. This case design is 273mm wide, while my printer bed is only 200mm wide. You&apos;ll probably need to split your case into at least two pieces. Each half of this design has four well-spaced standoffs, so we should be fine here.</p><h2 id="end-of-part-4">End of Part 4</h2><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 4
  py: ky + 4
  # Double Padding Variables
  dpx: kx + 8
  dpy: ky + 8
  # Defaults to M2 Screws
  screwSize: 1.5
  standoffSize: 2.5
points:
  zones:
    # The primary 6x4 key matrix, plus 3 modifiers.
    matrix:
      # Position in center of KiCAD workspace.
      anchor:
        shift: [100, -100]
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      columns:
        # Hide the first two mods and the last mod.
        # Provide a Sofle-like column stagger.
        outer:
          rows.mod.skip: true
          key.column_net: P14
        pinky:
          rows.mod.skip: true
          key.column_net: P16
        ring:
          key:
            stagger: 5
            column_net: P10
          rows.mod.column_net: P16
        middle:
          key:
            stagger: 2.5
            column_net: P7
          rows.mod.column_net: P10
        index:
          key:
            stagger: -2.5
            column_net: P8
          rows.mod.column_net: P7
        inner:
          rows.mod.skip: true
          key:
            stagger: -2.5
            column_net: P9
      rows:
        # Four main rows, one partial row.
        mod:
          row_net: P15
          mirror.row_net: P6
        bottom:
          row_net: P18
          mirror.row_net: P5
        home:
          row_net: P19
          mirror.row_net: P4
        top:
          row_net: P20
          mirror.row_net: P0
        num:
          row_net: P21
          mirror.row_net: P1
    # Thumb cluster for Layer and Space keys.
    thumbs:
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      # Place thumbs where the inner mod would go.
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        # Fan thumbs out by -15 degrees.
        layer:
          key:
            splay: -15
            column_net: P8
        # Spacebar uses a 1.5 wide key.
        space:
          key:
            width: 1.5kx
            splay: 75
            shift: [2.5,-3.25]
            column_net: P9
      rows:
        # Thumbs only have one row.
        cluster:
          row_net: P15
          mirror.row_net: P6
  # Mirror keyboard halves with a moderate rotation.
  rotate: -20
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2kx
outlines:
  # Pure key outline.
  raw:
    - what: rectangle
      where: true
      size: [px, py]
  # Key outlines with 0.5mm removed to show key overlaps.
  keys:
    - what: rectangle
      where: true
      size: [kx-0.5,ky-0.5]
  # PCB board outline.
  board:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_top
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_top
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5px,-0.5py]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: mirror_thumbs_space_cluster
          shift: [0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: matrix_outer_bottom
          shift: [-0.5px,-0.5py]
      fillet: 2
  # Extra Large PCB board outline.
  xlBoard:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5dpx,0.5dpy]
        - ref: matrix_ring_num
          shift: [-0.5dpx,0.5dpy]
        - ref: matrix_middle_num
          shift: [-0.5dpx,0.5dpy]
        - ref: matrix_middle_num
          shift: [0.5dpx,0.5dpy]
        - ref: matrix_inner_num
          shift: [0.5dpx,0.5dpy]
        - ref: matrix_inner_top
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_inner_top
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_inner_num
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_middle_num
          shift: [0.5dpx,0.5dpy]
        - ref: mirror_matrix_middle_num
          shift: [-0.5dpx,0.5dpy]
        - ref: mirror_matrix_ring_num
          shift: [-0.5dpx,0.5dpy]
        - ref: mirror_matrix_outer_num
          shift: [-0.5dpx,0.5dpy]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5dpx,-0.5dpy]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5dpx,-0.5dpy]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5dpx,-0.5dpy]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.5dpy,-0.5dpx]
        - ref: mirror_thumbs_space_cluster
          shift: [0.5dpy,-0.5dpx]
        - ref: thumbs_space_cluster
          shift: [0.5dpy,-0.5dpx]
        - ref: thumbs_space_cluster
          shift: [-0.5dpy,-0.5dpx]
        - ref: thumbs_layer_cluster
          shift: [-0.5dpx,-0.5dpy]
        - ref: matrix_ring_mod
          shift: [-0.5dpx,-0.5dpy]
        - ref: matrix_outer_bottom
          shift: [-0.5dpx,-0.5dpy]
      fillet: 2
  # Combination preview showing outline and keys.
  combo:
    - name: board
    - operation: subtract
      name: keys
  mounting:
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: screwSize
      where:
        ref: [matrix_index_mod]
        shift: [0.5kx, -0.35ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: screwSize
      where:
        ref: [mirror_matrix_index_mod]
        shift: [0.5kx, -0.35ky]
  standoff:
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [matrix_index_mod]
        shift: [0.5kx, -0.35ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_outer_num]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_outer_bottom]
        shift: [0.5kx, -0.3ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_index_num]
        shift: [0.5kx, -0.4ky]
    - what: circle
      radius: standoffSize
      where:
        ref: [mirror_matrix_index_mod]
        shift: [0.5kx, -0.35ky]
pcbs:
  tutorial:
    outlines:
      main:
        outline:
          board
    footprints:
      # Hotswap Choc keys.
      choc_hotswap:
        what: choc
        where: true
        params:
          keycaps: true
          reverse: false
          hotswap: true
          from: &quot;{{column_net}}&quot;
          to: &quot;{{colrow}}&quot;
      # Through Hole or SMD Diodes
      diode:
        what: diode
        where: true
        params:
          from: &quot;{{colrow}}&quot;
          to: &quot;{{row_net}}&quot;
        adjust:
          shift: [0, -5]
      # Face Down Arduino Pro Micro
      promicro:
        what: promicro
        params:
          orientation: &quot;down&quot;
        where:
          ref.aggregate.parts: [matrix_inner_home, mirror_matrix_inner_home]
          shift: [0,0]
          rotate: -90
      # OLED Screen
      oled:
        what: oled
        params:
          side: &quot;F&quot;
          SDA: P2
          SCL: P3
        where:
          ref.aggregate.parts: [matrix_inner_home, mirror_matrix_inner_home]
          shift: [-6,-19]
          rotate: 90
      # Four Pin Reset Button
      reset:
        what: button
        params:
          from: GND
          to: RST
        where:
          ref.aggregate.parts: [matrix_index_mod, mirror_matrix_index_mod]
          shift: [0, -1]
          rotate: -90
      # Mounting Holes
      holeTopLeft:
        what: mountinghole
        where:
          ref: [matrix_outer_num]
          shift: [0.5kx, -0.3ky]
      holeBottomLeft:
        what: mountinghole
        where:
          ref: [matrix_outer_bottom]
          shift: [0.5kx, -0.3ky]
      holeTopInnerLeft:
        what: mountinghole
        where:
          ref: [matrix_index_num]
          shift: [0.5kx, -0.4ky]
      holeBottomInnerLeft:
        what: mountinghole
        where:
          ref: [matrix_index_mod]
          shift: [0.5kx, -0.35ky]
      holeTopRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_outer_num]
          shift: [0.5kx, -0.3ky]
      holeBottomRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_outer_bottom]
          shift: [0.5kx, -0.3ky]
      holeTopInnerRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_index_num]
          shift: [0.5kx, -0.4ky]
      holeBottomInnerRight:
        what: mountinghole
        where:
          ref: [mirror_matrix_index_mod]
          shift: [0.5kx, -0.35ky]
cases:
  bottom:
    - name: board
      extrude: 1
  xlBottom:
    - name: xlBoard
      extrude: 1
  _outerWall:
    - name: xlBoard
      extrude: 5.6
  _innerWall:
    - name: board
      extrude: 5.6
  wall:
    - what: case
      name: _outerWall
      operation: add
    - what: case
      name: _innerWall
      operation: subtract
  _holes:
    - name: mounting
      extrude: 4
  _standoffs:
    - name: standoff
      extrude: 4
  case:
    - what: case
      name: _standoffs
      operation: add
    - what: case
      name: _holes
      operation: subtract
    - what: case
      name: xlBottom
      operation: add
    - what: case
      name: wall
      operation: add
</code></pre><!--kg-card-end: html--><p>That&apos;s it for Part 4! We configured Ergogen to run locally on the command line, imported some custom external footprints, and created a basic case file. Not bad for less than 500 lines of configuration.</p><p>With that, we&apos;re also done with Ergogen in general. We&apos;ve walked through all four of the main sections of an Ergogen config, and have created an unrouted PCB and case file for our new keyboard. For the final chapter, I&apos;ll give a brief overview of the non-Ergogen steps required to build a custom keyboard. We need to route our PCB, export the circuit board files to a PCB fab, create a firmware for the keyboard, and actually build the dang thing. Time to wrap this up with <a href="https://flatfootfox.com/ergogen-part5-kicad-firmware-assembly/">Let&apos;s Design A Keyboard With Ergogen v4: KiCAD, Firmwares, &amp; Assembly (Finale)</a>!</p>]]></content:encoded></item><item><title><![CDATA[Let's Design A Keyboard With Ergogen v4: The PCB (Part 3)]]></title><description><![CDATA[In the third installation of this Ergogen series, we finally get around to designing the PCB!]]></description><link>https://flatfootfox.com/ergogen-part3-pcbs/</link><guid isPermaLink="false">6403847f1914912295540575</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Thu, 06 Apr 2023 22:38:25 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-03-27-at-5.40.03-PM.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-03-27-at-5.40.03-PM.jpg" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)"><p>Congratulations, you&apos;ve made it to Part 3! If you&apos;ve been following along with this series so far, you should have an Ergogen config file with defined <a href="https://flatfootfox.com/ergogen-part1-units-points/">units</a>, a keyboard layout specified by <a href="https://flatfootfox.com/ergogen-part1-units-points/">points</a>, and a board shape created from an <a href="https://flatfootfox.com/ergogen-part2-outlines/">outline</a>. If you&apos;re just joining us and this all sounds like gibberish, feel free to hop back to the introduction.</p><p>Before we dive straight into discussing how to design a PCB, we need to have a brief side discussion about microcontrollers and keyboard matrixes. I promise I&apos;ll try to keep this short.</p><h2 id="whats-a-microcontroller">What&apos;s a Microcontroller?</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/523a1765757b7f5c6e8b4567.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="600" height="500" srcset="https://flatfootfox.com/content/images/2023/02/523a1765757b7f5c6e8b4567.png 600w"><figcaption>An Arduino Pro Micro&apos;s pinout. (Via Sparkfun.)</figcaption></figure><p>It&apos;s a controller but... micro?</p><p>Okay, in all seriousness, a microcontroller is a small reprogrammable chip designed to work in embedded applications. It differentiates itself from more powerful computing devices by generally lacking a traditional operating system. Microcontrollers get flashed with a single program, and will run that script every time it powers up until you flash it with a new program. Microcontrollers also generally have hardware designed to interact with low level hardware components. Instead of focusing on powering a single screen and running a variety of apps, microcontrollers can power LEDs, read sensor states, and drive small motors.</p><p>The most popular and hobbyist friendly microcontroller platform has been the Arduino family of boards. Custom mechanical keyboards have been leveraging the Arduino Pro Micro for years now, although different variant boards also exist. Microcontrollers like the Elite-C have Arduino compatibility while offering slightly different hardware capabilities. More recently, Seedsudio&apos;s XIAO line of boards and the Raspberry Pi foundation&apos;s RP2040 boards have also made inroads into the mechanical keyboard scene.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/SuperSolversGizmosAndGadgets.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="676" height="501" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/SuperSolversGizmosAndGadgets.png 600w, https://flatfootfox.com/content/images/2023/04/SuperSolversGizmosAndGadgets.png 676w"><figcaption>Finally all those hours with Super Solvers: Gizmos and Gadgets pays off.</figcaption></figure><p>No matter which board you&apos;re working with, they all tend to behave in the same way. If you ever played with electric circuit kits as a kit, you should have a rough idea what&apos;s going on here. Microcontrollers have a variety of &quot;pins&quot; on them, all with their own specific purpose and usage type.</p><p>The most basic pins are &quot;Ground&quot; and &quot;VCC&quot;. These pins are essentially the positive and negative end of a AA battery. If you connect the positive pin of an LED to VCC, and the negative end to Ground (GND), then congratulations. You&apos;ve got light.</p><p>The majority of pins on an Arduino are known as &quot;General Purpose Input/Output&quot; pins. These are pins that can be controlled via software for you guessed it, general input or output tasks. If you connected the positive end of your LED to GPIO 1 and the negative end to your GND, your LED wouldn&apos;t light until you sent a software command which says, &quot;Turn on GPIO 1&quot;.</p><p>Conversely, we can also use this same basic setup for wiring inputs. If instead of an LED we put a basic switch in between GPIO 2 and GND, it&apos;s possible to tell your software, &quot;Perform this action when you detect someone closing the circuit between GPIO 2 and GND.&quot;</p><p>This sort of functionality is <em>perfect</em> for keyboards. We just need to wire up all of our switches between a GPIO pin and ground, and then write a keyboard firmware that says, &quot;When switch 38 is flipped, type the &apos;A&apos; key.&quot; Only, uh oh, the Arduino Pro Micro only has 18 GPIO pins. What do we do now?</p><p>Microcontrollers like the Arduino do have a few other tricks up their sleeves. They have analog pins which can send or receive signals that aren&apos;t a binary &quot;on&quot; or &quot;off&quot;. This is useful for things like detecting light levels, but isn&apos;t exactly useful for a keyboard. We can also get into more technical ways of sending a signal. The Arduino supports I<sup>2</sup>C (&quot;Eye-Squared-C&quot;) and SPI serial protocols for more advanced communication between devices, but this is generally only reserved for more advanced accessories like a keyboard&apos;s OLED screen.</p><p>To power a large keyboard with a handful of GPIO pins, we don&apos;t need to get a more advanced microcontroller. We need to leverage more basic electronics principles.</p><h2 id="enter-the-matrix">Enter the Matrix</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/03/TheMatrix.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="2000" height="828" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/TheMatrix.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/TheMatrix.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/TheMatrix.png 1600w, https://flatfootfox.com/content/images/2023/03/TheMatrix.png 2064w" sizes="(min-width: 720px) 720px"><figcaption>You knew this pun was coming.</figcaption></figure><p>Working with microcontrollers is an interesting change of pace for a lot of traditional programmers. Instead of being able to work in a purely digital world, you suddenly have to start accounting for a bunch of squishy real world physics limitations. Sometimes we can use this to our advantage though.</p><p>You probably have some passing familiarity with some basic electronics components. You&apos;ve got LEDs to provide light, wires to hook things up, and resistors to... make electricity somehow less uh, electric. They resist things, right?</p><p>Diodes are one of those components everyone&apos;s heard of, but may be less clear on the details. They&apos;re a small piece of electronics that allow circuit designers to ensure that electricity is only flowing in one direction. The full details of why this is desirable is better left to full electronics engineering texts, but in short, it allows us to design circuits with very predictable and measurable flows of signals.</p><p>In all the GPIO examples I mentioned earlier, the circuits were wired with the GPIO pin generally going where the &quot;positive&quot; end of a battery would be, and the Ground pin was where the &quot;negative&quot; end of a battery would be. This isn&apos;t strictly required. We can wire a switch going from GPIO 1 to GPIO 2 and still detect in software when the button is pressed. When you introduce diodes into the picture, we can start getting very creative about wiring up multiple keys to the same GPIO pins.</p><p>Enter the keyboard matrix. This is an ancient design that essentially turns our keyboard into an intersecting grid of columns and rows. Turns out that terminology wasn&apos;t just useful for arrangement purposes. We get to leverage it here as well. If you design a keyboard matrix correctly, you can have several GPIO pins acting as the &quot;columns&quot;, and several other GPIO pins acting as the &quot;rows&quot;. With diodes acting as the electricity&apos;s traffic cop, we can design a circuit in which the only way GPIO 4 and GPIO 10 would both be receiving a signal is if key &quot;A&quot; was being held down.</p><p>The PCB section in our Ergogen config file isn&apos;t just dedicated to where the microcontroller goes on our keyboard. It also defines how the keyboard itself is wired.</p><h2 id="designing-a-matrix">Designing a Matrix</h2><p>Before we actually jump into the Ergogen config, let&apos;s quickly sketch out the matrix we want to build so everyone&apos;s on the same page.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/03/PlankExample.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1500" height="443" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/PlankExample.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/PlankExample.png 1000w, https://flatfootfox.com/content/images/2023/03/PlankExample.png 1500w" sizes="(min-width: 720px) 720px"><figcaption>A nice simple grid. (Via OLKB)</figcaption></figure><p>If we were building an Ortholinear keyboard, this guide would be ludicrously simple. Your up down keys are the columns, your left right keys are your rows. If our keyboard reports that Col1-Row2 is being pressed, we know it&apos;s the Z key. The unibody Sofle in this design isn&apos;t as aligned, but we can make it work.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/DumbMatrix.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="950" height="453" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/DumbMatrix.png 600w, https://flatfootfox.com/content/images/2023/03/DumbMatrix.png 950w" sizes="(min-width: 720px) 720px"></figure><p>Tada, a 14 column, 5 row matrix for our Sofle. The thumbs having their own dedicated columns is a little silly, but as we saw in the Ortholinear example&apos;s spacebar, you don&apos;t have to have every matrix be the exact same size. Now that we&apos;ve got the basic matrix defined, let&apos;s go back to our Arduino Pro Micro diagram and look at what the pinout for this keyboard may look like.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/DummyMatrixArduino.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="750" height="500" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/DummyMatrixArduino.png 600w, https://flatfootfox.com/content/images/2023/03/DummyMatrixArduino.png 750w" sizes="(min-width: 720px) 720px"></figure><p>Welp. We&apos;ve done goofed. We&apos;ve got 19 rows and columns and only 18 pins. Pack it up everyone, it&apos;s been a great tutorial.</p><p>...or we could just be a little smarter about how we handle those thumbs.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/FixedThumbs.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1224" height="582" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/FixedThumbs.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/FixedThumbs.png 1000w, https://flatfootfox.com/content/images/2023/03/FixedThumbs.png 1224w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/FixedThumbPins.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="750" height="500" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/FixedThumbPins.png 600w, https://flatfootfox.com/content/images/2023/03/FixedThumbPins.png 750w" sizes="(min-width: 720px) 720px"></figure><p>By treating the thumbs as part of the inner-most columns, we can save two column pins. The mod row is essentially just shifted over by one. When the time comes to define our PCB config, we can use this layout to demonstrate how to do one-off key wiring overrides.</p><p>If we were designing a very basic keyboard, we&apos;d be good to go at this point. However, the original Sofle Choc had support for an OLED screen. What if we wanted to add a screen to our design? The most popular OLED screen module for mechanical keyboards requires the use of the two I<sup>2</sup>C pins. Which means we&apos;re once again one pin short. Is there some way we could potentially squeeze one more pin out of our matrix?</p><p>Keyboard matrixes use an amount of pins equal to the number of columns plus the number of rows. This means that the more square your keyboard design is, the fewer number of pins you need. For example, 10 columns and 2 rows can support 20 keys across 12 pins, but 5 columns and 4 rows can support 20 keys across 9 pins.</p><p>But our layout is pretty fixed, right? We can&apos;t just magically somehow make it more square. We could free up some pins by doing something drastic like ditching the number row, but what if we could somehow just... fake a more square design? Right now we&apos;ve got a 12x5 keyboard. Is there any shape that would get us closer to a square?</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/StackedMatrix.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1003" height="1569" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/StackedMatrix.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/StackedMatrix.png 1000w, https://flatfootfox.com/content/images/2023/03/StackedMatrix.png 1003w" sizes="(min-width: 720px) 720px"></figure><p>Huh. Okay. This is interesting. If you can&apos;t tell what&apos;s going on here, I took the two pieces of our keyboard and stacked them on top of each other. Gone is the nice <code>rotate: -20</code> degree angle. This is an absurd keyboard bent completely in on itself. But this configuration does give us one benefit: It has 6 columns and 10 rows. 6+10=16, and would you look at that, we&apos;ve managed to shave a pin off our 12+5=17 layout.</p><p>Of course, we need to figure out how to fit this into our existing wiring.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/DuplexMatrix.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1224" height="582" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/DuplexMatrix.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/DuplexMatrix.png 1000w, https://flatfootfox.com/content/images/2023/03/DuplexMatrix.png 1224w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/03/DuplexMatrixPinout.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="750" height="500" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/DuplexMatrixPinout.png 600w, https://flatfootfox.com/content/images/2023/03/DuplexMatrixPinout.png 750w" sizes="(min-width: 720px) 720px"><figcaption>Note the two new <code>SDA</code> and <code>SCL</code> I<sup>2</sup>C pins over on Pin 2 and Pin 3.</figcaption></figure><p>Tada! Our finished keyboard matrix! &#xA0;This is what&apos;s known, slightly confusingly, as a &quot;Duplex&quot; matrix. Essentially we &quot;bend&quot; the columns back on each other and double the number of rows. (This doubling is where the &quot;duplex&quot; term comes from.) It can often help create a slightly better board geometry and save you a pin or two.</p><p>There&apos;s a completely unrelated &quot;duplex matrix&quot; which leverages diodes arranged in alternating directions. It requires slightly different key scanning code than traditional keyboard matrixes. <a href="https://kbd.news/The-Japanese-duplex-matrix-1391.html">KBD News</a> has a full rundown of the difference between these two matrixes. The double row, bent column design was popularized by ai03 on the English speaking web, while the alternating-diode duplex matrix primarily took off in Japan. Due to this, they&apos;re often referred to as a &quot;Western Duplex Matrix&quot; and a &quot;Japanese Duplex Matrix&quot;. &quot;Duplex&quot; as a communication term implies a bi-directional system, so the western duplex matrix is unfortunately a bit of a misnomer. Regardless of what term you use for it, these matrix designs can be useful when creating large unibody layouts.</p><h2 id="defining-the-pcb">Defining the PCB</h2><p>Alright, back to Ergogen! Previously we&apos;ve defined several top level sections in our Ergogen config. <code>units:</code> let us set the global variables for our project. <code>points:</code> defined the overall layout of the keys on our board. <code>outlines:</code> allowed us to create a border for our PCB. Finally, <code>pcb:</code> is going to allow us to define the circuit board and its related support hardware.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-9.37.32-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1269" height="1089" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-19-at-9.37.32-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-19-at-9.37.32-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-9.37.32-PM.png 1269w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="4-8"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
</code></pre><!--kg-card-end: html--><p>Here we&apos;ve defined the top level <code>pcb:</code> section. Just like the outline section, we can define multiple PCBs if we&apos;d like. We&apos;re just creating one here and naming it <code>tutorial</code>. Inside of our tutorial PCB, we&apos;ve defined an <code>outlines:</code> section to specify which outlines we&apos;d like to use for this board. I&apos;m honestly not sure what the benefit of getting to name our own <code>main:</code> section inside of the PCB&apos;s outline section, but that&apos;s what some of the v4 examples use and sometimes you just need to roll with what works.</p><p>You&apos;ll also notice a different preview here. We&apos;ve transitioned from Ergogen&apos;s web preview into KiCad. (KiCAD 7 came out while this series was being written. These screenshots are of KiCAD 6, but there shouldn&apos;t be any significant difference.) You can still use the web version of Ergogen to generate these files if you&apos;d like. Just be aware you actually need to start clicking the &quot;Generate&quot; button instead of waiting for the preview to automatically re-render.</p><p>One oddity here is that our PCB outline is way outside of KiCAD&apos;s default sheet. We can fix this with a quick tweak in the Points section.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-9.57.39-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1514" height="1080" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-19-at-9.57.39-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-19-at-9.57.39-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-9.57.39-PM.png 1514w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="6-7"><code>units: ...
points:
  zones:
    matrix:
      # Fix placement on KiCAD sheet.
      anchor:
        shift: [100, -100]
      ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
</code></pre><!--kg-card-end: html--><p>That was simple enough. But our board&apos;s still completely unpopulated. In the earlier parts of this guide we defined where each key switch was going to go, but we haven&apos;t defined the actual switches themselves yet. In KiCAD terms, we need to define the &quot;Footprint&quot; of the switches.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-10.17.20-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1251" height="635" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-19-at-10.17.20-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-19-at-10.17.20-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-10.17.20-PM.png 1251w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="9-18"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap:
        what: choc
        where: true
        params:
          keycaps: true
          reverse: false
          hotswap: true
          from: &quot;{{column_net}}&quot;
          to: &quot;{{colrow}}&quot;
</code></pre><!--kg-card-end: html--><p>Now it&apos;s starting to look like a PCB! There&apos;s a <em>lot</em> going on here. Let&apos;s break down everything we just added. The <code>footprints:</code> section is naturally where we&apos;re going to add our part footprint definitions.</p><p>The first footprint we&apos;re going to define will be for the key switches themselves. We&apos;re leveraging Choc v1 switches in this design, and are going to be supporting &quot;hotswap&quot; sockets, so we&apos;ve given it the creative name of <code>choc_hotswap:</code>.</p><p>The <code>what:</code> property specifies which footprint we&apos;re using. The Ergogen GitHub repository has a list of the <a href="https://github.com/ergogen/ergogen/tree/develop/src/footprints">default available footprints</a>. We want to use the <code>choc.js</code> footprint, so these switch footprints are set as <code>what: choc</code>. The <code>where:</code> property allows us to specify where this footprint should apply. Ergogen has a tagging property we haven&apos;t touched on before, allowing you to flag certain keys to get certain footprints or properties applied to them. This could allow you to create some pretty unusual designs, hypothetically letting us set up MX switches for the main keys and Choc switches for the thumbs, etc. This board is using the same footprint for every key, so we&apos;re just going to use <code>where: true</code>.</p><p>In the <code>params:</code> section, we can adjust various settings of the footprint. If you open up the GitHub repository&apos;s <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/choc.js">choc.js</a> file, you can see a list of available parameters at the top of the file. The <code>keycaps: true</code> property shows a box outline around the edges of where a 1u Choc keycap would be fit. The <code>reverse: false</code> property allows us to specify if we want the footprint to appear on the top and bottom of a PCB. This is a single-side unibody design, so we&apos;ve set this to false. Finally, <code>hotswap: true</code> specifies that we&apos;d like to use the hotswap socket footprint instead of the through-hole switch design.</p><p>At the end of the footprint we&apos;ve got the <code>from:</code> and <code>to:</code> properties. These control the &quot;Nets&quot; of the PCB. It&apos;s a larger topic that we&apos;ll cover in a bit, but we&apos;re adding them now so Ergogen doesn&apos;t throw any errors.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-10.18.51-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1415" height="718" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-19-at-10.18.51-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-19-at-10.18.51-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-19-at-10.18.51-PM.png 1415w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="19-26"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap:
        what: choc
        where: true
        params:
          keycaps: true
          reverse: false
          hotswap: true
          from: &quot;{{column_net}}&quot;
          to: &quot;{{colrow}}&quot;
      diode:
        what: diode
        where: true
        params:
          from: &quot;{{colrow}}&quot;
          to: &quot;{{row_net}}&quot;
        adjust:
          shift: [0, -5]
</code></pre><!--kg-card-end: html--><p>Next we need to define the diodes used in our keyboard matrix. We&apos;ve set up another entry in the <code>footprints:</code> section, cleverly named <code>diode:</code>. This footprint contains <code>what: diode</code> to refer to Ergogen&apos;s <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/diode.js">diode.js</a> file. This footprint supports both surface mount smd diodes as well as through hole diodes, and doesn&apos;t have any parameters other than those mysterious <code>from:</code> and <code>to:</code> attributes. We have made one other adjustment however.</p><p>The <code>where: true</code> attribute places this diode footprint at the center of every point on our keyboard. This worked well for our choc footprints, but we don&apos;t want the diodes to be literally right on top of the key switch. Adding <code>adjust.shift: [0, -5]</code> moves the diode down beneath the key footprint.</p><p>Now that we&apos;ve got our keys and our diodes set, let&apos;s do a very ham-fisted approach of trying to place the Arduino Pro Micro.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-20-at-9.49.34-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1417" height="698" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-20-at-9.49.34-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-20-at-9.49.34-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-20-at-9.49.34-PM.png 1417w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="12-19"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro:
        what: promicro
        params:
          orientation: &quot;down&quot;
        where:
          ref: matrix_inner_top
          shift: [0,0]
          rotate: 0
</code></pre><!--kg-card-end: html--><p>You&apos;re starting to see a trend here. We&apos;ve named our microcontroller&apos;s footprint <code>promicro:</code>, and the <code>what:</code> is a reference to <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/promicro.js">promicro.js</a>. The <code>orientation: &quot;down&quot;</code> parameter specifies whether or not the pinout for the Arduino should be with the microcontroller facing &quot;up&quot; or &quot;down&quot;. Arduino Pro Micros aren&apos;t symmetrical, so you need to pick how you&apos;d like it to be oriented. Most header pins are tall enough that they can fit the USB port in either configuration, so boards commonly use a face-down configuration for aesthetic reasons and to give the OLED screen something flush to sit against.</p><p>For the placement in <code>where:</code>, I set the reference to the <code>matrix_inner_top</code> key on the left side of the keyboard. It&apos;s one of the closer keys to the center of the board. From here we could try to <code>shift:</code> the key closer to the center, and give it a <code>rotate:</code> so that its pointing up instead of aligned with <code>matrix_inner_top</code>, but there&apos;s a new method we can use here.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-20-at-10.01.24-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1421" height="695" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-20-at-10.01.24-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-20-at-10.01.24-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-20-at-10.01.24-PM.png 1421w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="17"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro:
        what: promicro
        params:
          orientation: &quot;down&quot;
        where:
          ref.aggregate.parts: [matrix_inner_top, mirror_matrix_inner_top]
          shift: [0,0]
          rotate: 0
</code></pre><!--kg-card-end: html--><p>The <code>ref.aggregate.parts:</code> method allows you to specify location <em>between</em> two points. In this case, I specified a reference location between the <code>matrix_inner_top</code> left on the left, and the <code>mirror_matrix_inner_top</code> key on the right. Earlier versions of Ergogen would have just used <code>ref: [matrix_inner_top, mirror_matrix_inner_top]</code>, but v4 makes things a bit more explicit what&apos;s going on.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-20-at-10.09.22-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1439" height="701" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-20-at-10.09.22-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-20-at-10.09.22-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-20-at-10.09.22-PM.png 1439w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="19"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro:
        what: promicro
        params:
          orientation: &quot;down&quot;
        where:
          ref.aggregate.parts: [matrix_inner_top, mirror_matrix_inner_top]
          shift: [0,0]
          rotate: -90
</code></pre><!--kg-card-end: html--><p>One quick application of <code>rotate: -90</code> later, and things are starting to look good. Surprisingly good actually.</p><p>Real talk. When I created Part 1 of this guide I had assumed I had spaced the two halves of the keyboard too far apart. The placement of this Arduino looks almost perfect. I was planning on demonstrating how you can always go back and adjust earlier properties like <code>points.mirror.distance: 2.5kx</code> later on while building your config. Just for demonstration purposes, let&apos;s see if we can&apos;t make a better use of this space. Or at least arbitrarily different use.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-22-at-9.04.09-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1302" height="651" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-22-at-9.04.09-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-22-at-9.04.09-AM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-22-at-9.04.09-AM.png 1302w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="9,25-32,91"><code>units: ...
points:
  zones:
    matrix: ...
    thumbs: ...
  rotate: ...
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2kx
outlines:
  raw: ...
  keys: ...
  board:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_top
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_top
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5px,-0.5py]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: mirror_thumbs_space_cluster
          shift: [0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: matrix_outer_bottom
          shift: [-0.5px,-0.5py]
      fillet: 2
  combo: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap:
        what: choc
        where: true
        params:
          keycaps: true
          reverse: false
          hotswap: true
          from: &quot;{{colrow}}&quot;
          to: &quot;{{col_net}}&quot;
      diode:
        what: diode
        where: true
        params:
          from: &quot;{{colrow}}&quot;
          to: &quot;{{row_net}}&quot;
        adjust:
          shift: [0, -5]
      promicro:
        what: promicro
        params:
          orientation: &quot;down&quot;
        where:
          ref.aggregate.parts: [matrix_inner_home, mirror_matrix_inner_home]
          shift: [0,0]
          rotate: -90
</code></pre><!--kg-card-end: html--><p>Alright, things are looking a bit more snug now! I went ahead and updated the <code>points.mirror.distance:</code> value from 2.5kx to 2kx. The Pro Micro&apos;s anchor reference has also been updated to use <code>matrix_inner_home</code> and its mirrored counterpart instead of <code>matrix_inner_top</code>. Finally, I added four new points to our outline. The outline now drops down from <code>matrix_inner_num</code> to <code>matrix_inner_top</code> before jumping across to the mirrored half. Similarly, the thumb keys linger on the <code>thumbs_space_cluster</code> for two additional points that shifted up to the top of the switch.</p><p>This is a fairly arbitrary change, but it&apos;s useful to show that none of the design decisions are set in stone. It&apos;s also important to remember that you pay per square inch when fabricating a PCB, so these sorts of small improvements can add up over time.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-3.33.41-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1380" height="698" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-25-at-3.33.41-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-25-at-3.33.41-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-3.33.41-PM.png 1380w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="20-29"><code>units: ...
points:
  zones:
    matrix: ...
    thumbs: ...
  rotate: ...
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2kx
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro: ...
      oled:
        what: oled
        params:
          side: &quot;F&quot;
          SDA: P2
          SCL: P3
        where:
          ref.aggregate.parts: [matrix_inner_home, mirror_matrix_inner_home]
          shift: [-6,-19]
          rotate: 90
</code></pre><!--kg-card-end: html--><p>We&apos;re wrapping up the parts now. Next is the footprint for the OLED screen. The <code>what: oled</code> portion refers to <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/oled.js">oled.js</a>, and the <code>where:</code> parameters should be starting to look a little familiar. This footprint has an awkward <code>shift: [-6, -19]</code> on it. For whatever reason, the anchor point for the footprint itself isn&apos;t centered on the screen&apos;s pins.</p><p>The <code>params:</code> section has a few attributes we haven&apos;t seen before. <code>side: &quot;F&quot;</code> specifies that we&apos;re dealing with the front of the OLED screen, but what&apos;s <code>SDA:</code> and <code>SCL:</code>? That&apos;s an excellent question. One I&apos;m not going to answer just yet.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-3.35.16-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1369" height="699" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-25-at-3.35.16-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-25-at-3.35.16-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-3.35.16-PM.png 1369w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="14-22"><code>units: ...
points: ...
outlines: ...
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap: ...
      diode: ...
      promicro: ...
      oled: ...
      reset:
        what: button
        params:
          from: GND
          to: RST
        where:
          ref.aggregate.parts: [matrix_index_mod, mirror_matrix_index_mod]
          shift: [0, -1]
          rotate: -90
</code></pre><!--kg-card-end: html--><p>The last component we&apos;re dealing with is a reset button for the microcontroller. This allows you to reset the Arduino Pro Micro and put it into a flashing state for applying new firmware. This footprint is defined by <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/button.js">button.js</a>, and we&apos;re once again seeing those unusual <code>from:</code> and <code>to:</code> parameters. Let&apos;s wrap up the PCB layout section and finally tackle what&apos;s going on with those net parameters.</p><p>It&apos;s worth noting that this is a pretty barebones PCB. It&apos;s a unibody design, so we didn&apos;t need to use <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/trrs.js">trrs.js</a> to define a headphone jack to connect the two sides of a split keyboard. We&apos;re also not using a Nice!Nano wireless microcontroller, so we don&apos;t need to worry about a lipo battery and its <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/jstph.js">jstph.js</a> battery header.</p><h2 id="casting-a-net">Casting a Net</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-24-at-4.34.25-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1916" height="1292" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-24-at-4.34.25-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-24-at-4.34.25-PM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-24-at-4.34.25-PM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-24-at-4.34.25-PM.png 1916w" sizes="(min-width: 720px) 720px"></figure><p>If you&apos;ve been following along with this guide, you may have noticed some unusual things about the PCB file that Ergogen is creating. First of all: None of these parts are connected. There&apos;s just a blank void with several part footprints outlined by the edge of our board. Most PCBs you&apos;ve looked at generally have thick lines connecting the parts together.</p><p>Furthermore, you may have noticed that when we placed the OLED screen and reset buttons, small thin white lines started appearing on our PCB. These don&apos;t look like normal PCB lines though. They&apos;re just shooting diagonal across the board between different pins. The clever ones among you may have started getting a sinking feeling when they noticed that the <code>VCC</code> pin on the OLED screen has a thin white line pointing to the <code>VCC</code> pin on the Arduino Pro Micro.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-24-at-4.38.26-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1768" height="1314" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-24-at-4.38.26-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-24-at-4.38.26-PM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-24-at-4.38.26-PM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-24-at-4.38.26-PM.png 1768w" sizes="(min-width: 720px) 720px"></figure><p>That&apos;s right. It&apos;s our job to make all of these connections. Welcome to the fun world of routing traces. A &quot;trace&quot; on a PCB is a small strip of metal connecting two parts on the board. It&apos;s similar to connecting components together with a jumper cable on a breadboard. The catch here is that the PCB only has two sides: A front and a bottom. I connected the <code>VCC</code> and <code>GND</code> pins with red traces on the front of the board, but needed to connect the <code>P2</code> and <code>P3</code> pins with blue traces on the backside of the board so they could pass under the red traces.</p><p>This is a manual and time consuming process. Worst yet, if you notice an error in your Ergogen config, you need to generate a new blank PCB and start all over again. Defining nets can help aid in this process considerably however. If we weren&apos;t able to specify that the OLED&apos;s left pin connected to the Arduino&apos;s 17th pin, we&apos;d be left constantly flipping back and forth between part documentation, our schematics / config files, and the PCB itself. By defining in Ergogen which parts connect to one another, Ergogen can <em>force</em> us to wire things correctly.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-24-at-4.44.34-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1678" height="1374" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-24-at-4.44.34-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-24-at-4.44.34-PM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-24-at-4.44.34-PM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-24-at-4.44.34-PM.png 1678w" sizes="(min-width: 720px) 720px"></figure><p>When you&apos;re in the process of actively connecting two parts together, KiCAD will highlight the pins that your Ergogen config has specified that it would be alright for you to wire them to. You can see this behavior in this mid-routing screenshot where the two P2 pins are lit up like a Christmas tree.</p><p>So the next big step in our Ergogen config is defining all of these nets. We&apos;ve seen a few of these definitions already in our file. Those <code>from:</code> and <code>to:</code> lines I skipped over earlier? We&apos;re finally getting back to those now.</p><p>The footprint file in Ergogen&apos;s Github repository defines the attribute name for a pin. <code>from:</code> and <code>to:</code> are conventions that footprint authors commonly use when a component only has two pins, but it&apos;s not a hard and fast rule.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">params: {
  designator: &apos;B&apos;, // for Button
  side: &apos;F&apos;,
  from: undefined,
  to: undefined
}</code></pre><figcaption>The params section of <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/button.js">button.js</a></figcaption></figure><p>Here&apos;s the top section of the reset button we defined earlier. It has some metadata fields like <code>designator:</code> and <code>side:</code>, and then these undefined <code>from:</code> and <code>to:</code> fields. If we don&apos;t override the designator or the side it will use these defaults, but we <em>have</em> to define <code>from:</code> and <code>to:</code></p><figure class="kg-card kg-code-card"><pre><code class="language-js">params: {
  designator: &apos;OLED&apos;,
  side: &apos;F&apos;,
  VCC: {type: &apos;net&apos;, value: &apos;VCC&apos;},
  GND: {type: &apos;net&apos;, value: &apos;GND&apos;},
  SDA: undefined,
  SCL: undefined
},</code></pre><figcaption>The params section of <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/oled.js">oled.js</a></figcaption></figure><p>Jumping back to the OLED footprint, we can see a slightly different configuration. The OLED screen on the keyboard needs power, and it also requires several pins to communicate with the Arduino. <code>VCC</code> is the term for regulated power coming from a microcontroller, and we also need a <code>GND</code> pin to complete the circuit. This OLED screen is powered by I<sup>2</sup>C serial communication which uses pins commonly defined as <code>SDA</code> and <code>SCL</code>.</p><p>Rather than arbitrarily coming up with new names for these pins, this footprint users the industry standard. <code>VCC</code> and <code>GND</code> are such common abbreviations that the footprint goes ahead and defines those pins for us. It doesn&apos;t know which <code>SDA</code> and <code>SCL</code> pins we&apos;d like to use however, so we still need to define those.</p><p>In our Ergogen config, we referenced this OLED footprint with <code>SDA: P2</code> and <code>SCL: P3</code>. This tells Ergogen, &quot;If you see anything with a <code>P2</code> pin on it, then this OLED screen&apos;s <code>SDA</code> pin is okay to connect to it. Our Arduino Pro Micro footprint has such a <code>P2</code> pin, so lets look at its definition now.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">  params: {
    designator: &apos;MCU&apos;,
    orientation: &apos;down&apos;,
    RAW: {type: &apos;net&apos;, value: &apos;RAW&apos;},
    GND: {type: &apos;net&apos;, value: &apos;GND&apos;},
    RST: {type: &apos;net&apos;, value: &apos;RST&apos;},
    VCC: {type: &apos;net&apos;, value: &apos;VCC&apos;},
    P21: {type: &apos;net&apos;, value: &apos;P21&apos;},
    P20: {type: &apos;net&apos;, value: &apos;P20&apos;},
    P19: {type: &apos;net&apos;, value: &apos;P19&apos;},
    P18: {type: &apos;net&apos;, value: &apos;P18&apos;},
    P15: {type: &apos;net&apos;, value: &apos;P15&apos;},
    P14: {type: &apos;net&apos;, value: &apos;P14&apos;},
    P16: {type: &apos;net&apos;, value: &apos;P16&apos;},
    P10: {type: &apos;net&apos;, value: &apos;P10&apos;},
    P1: {type: &apos;net&apos;, value: &apos;P1&apos;},
    P0: {type: &apos;net&apos;, value: &apos;P0&apos;},
    P2: {type: &apos;net&apos;, value: &apos;P2&apos;},
    P3: {type: &apos;net&apos;, value: &apos;P3&apos;},
    P4: {type: &apos;net&apos;, value: &apos;P4&apos;},
    P5: {type: &apos;net&apos;, value: &apos;P5&apos;},
    P6: {type: &apos;net&apos;, value: &apos;P6&apos;},
    P7: {type: &apos;net&apos;, value: &apos;P7&apos;},
    P8: {type: &apos;net&apos;, value: &apos;P8&apos;},
    P9: {type: &apos;net&apos;, value: &apos;P9&apos;}
  }</code></pre><figcaption>The params section for <a href="https://github.com/ergogen/ergogen/blob/develop/src/footprints/promicro.js">promicro.js</a></figcaption></figure><p>Woah! That&apos;s a lot of pins! You can see all of these pins are predefined here. For our OLED screen, the <code>VCC</code> pin automatically matched up with the Arduino&apos;s <code>VCC</code> pin since they were defined to the exact same value. In the case of the data pins, the <code>SDA: P2</code> pin has a thin white line leading to the Arduino Pro Micro because we defined it as such.</p><p>The P1-P21 pins seem a little generic at first, but let&apos;s go back and take a look at the Arduino screenshot and our Pro Micro footprint.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-4.12.39-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1008" height="915" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-25-at-4.12.39-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-25-at-4.12.39-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-4.12.39-PM.png 1008w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/523a1765757b7f5c6e8b4567.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="600" height="500" srcset="https://flatfootfox.com/content/images/2023/03/523a1765757b7f5c6e8b4567.png 600w"></figure><p>The Arduino footprint is oriented face down, so you need to mentally mirror these two diagrams. Once you do that however, you can see the same pattern of <code>RAW</code>, <code>GND</code>, <code>RST</code>, <code>VCC</code>, <code>21</code>, <code>20</code>, <code>19</code>, etc. Pin numbers are a tricky thing on Arduinos. The ATmega32U4 processor has its own internal pin numbering, and on top of that pins can have multiple definitions. <code>2</code> is also the <code>SDA</code> pin, and <code>21</code> is also the <code>A3</code> analog pin. In general however, most Arduino-based projects will discuss their wiring in terms of &quot;Arduino&quot; pins, or sometimes &quot;Digital&quot; pins. That&apos;s what this footprint has done here. They&apos;ve just tacked <code>P</code> for &quot;Pin&quot; in front. (These pin names are also treated as a text string. <code>P9</code> and <code>P09</code> are considered two different pin labels, so don&apos;t go adding leading zeroes to your pin config.)</p><p>So at this point we understand how footprint nets are defined, and we&apos;ve seen it in action on the few small footprints that we&apos;ve added. We still don&apos;t have any nets going from our key switches to the Arduino however. Let&apos;s back up a minute and look at the existing key and diode definitions.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-4.31.45-PM-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1164" height="762" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-25-at-4.31.45-PM-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-25-at-4.31.45-PM-1.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-25-at-4.31.45-PM-1.png 1164w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="162" data-line-offset="162" data-line="175,176,181,182"><code>pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      choc_hotswap:
        what: choc
        where: true
        params:
          keycaps: true
          reverse: false
          hotswap: true
          from: &quot;{{column_net}}&quot;
          to: &quot;{{colrow}}&quot;
      diode:
        what: diode
         where: true
        params:
          from: &quot;{{colrow}}&quot;
          to: &quot;{{row_net}}&quot;
        adjust:
          shift: [0, -5]
</code></pre><!--kg-card-end: html--><p>These footprints have had <code>from:</code> and <code>to:</code> definitions this entire time, and sure enough, you can see some nets in between the switch and the diode at every key.</p><p>The <code>choc_hotswap:</code> and <code>diode:</code> sections are using a new syntax we haven&apos;t seen yet. The <code>from: &quot;{{colrow}}&quot;</code>, <code>to: &quot;{{col_net}}&quot;</code>, and <code>to: &quot;{{row_net}}&quot;</code> properties have introduced curly brackets to our config file. (If you&apos;re looking at older Ergogen v3 configs, you&apos;ll instead see <code>from: =colrow</code> with an equal sign instead.)</p><p>This curly bracket syntax allows us to set &quot;key-level attributes&quot;. Unlike the OLED screen on the Reset button footprints, we don&apos;t want to just straight wire every key on our keyboard to <code>GND</code> or <code>VCC</code>. We need to build out the matrix, and these key-level attributes are part of that.</p><p>In the next step of this guide, we&apos;ll be running those column and row lines we outlined back in the matrix section. The row lines will connect to one side of our switch, and the column lines will connect to the other side of the switch. It would be nice and simple, but we&apos;ve also got the diodes to hook up.</p><p>The <code>from: {{colrow}}</code> parameter inside of <code>choc_hotswap:</code> and <code>diode:</code> signal to Ergogen that every key&apos;s switch needs to be wired up to every key&apos;s diode. They share this internal wiring because they both use <code>{{colrow}}</code> as a key-level net name.</p><p>The other properties are another one of those slightly confusing community naming convention vs. fixed Ergogen property name topics. The <code>col_net</code> and <code>row_net</code> (or sometimes <code>column_net</code> and <code>row_net</code>) properties you frequently see online in other people&apos;s Ergogen configs are just inherited from the original Absolem days. <code>col_net</code> and <code>row_net</code> are just popular conventions. <code>colrow</code> on the other hand is a function built into Ergogen. It&apos;s an aliased variable to the column-row intersection at that particular key.</p><p>All you really need to know here is that this is the portion of our code responsible for wiring up the diodes at each key. As long as you stay consistent in your use of <code>col_row</code>, <code>row_net</code>, and <code>colrow</code> you should be fine. Let&apos;s finally move on to creating our matrix.</p><p>(It&apos;s probably also worth pointing out at this point that our diode footprint has both options for through hole and surface mount device footprints. You can use a diode with legs that need to be soldered through the holes, or smaller smd diodes that only need to be soldered onto the pads. For reasons we&apos;ll cover later, having at least one pair of through hole components on this board helps us out a bit. If you&apos;re wondering why a pair of pads are connected so closely with those small through holes, there&apos;s your explanation.)</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-10.52.37-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1985" height="845" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-10.52.37-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-10.52.37-AM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-26-at-10.52.37-AM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-10.52.37-AM.png 1985w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="17"><code>units: ...
points:
  zones:
    matrix:
      anchor: ...
      key: ...
      columns:
        outer: ...
        pinky: ...
        ring: ...
        middle: ...
        index: ...
        inner: ...
      rows:
        mod: ...
        bottom:
          row_net: P1
        home: ...
        top: ...
        num: ...
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space: ...
      rows:
        cluster: ...
  rotate: -20
  mirror: ...
outlines: ...
pcbs: ...
</code></pre><!--kg-card-end: html--><p>Wiring up our keyboard matrix&apos;s nets requires us to go all the way back up into the <code>points:</code> section of our config. I&apos;ve hidden most of the properties we added during Part 1, but you can see the newly added <code>bottom.row_net: P1</code> attribute.</p><p>This does pretty much what you expect. You can see a net coming from the Arduino&apos;s <code>P1</code> pin connecting to all of the keys in the bottom row.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.03.38-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1662" height="1038" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-11.03.38-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-11.03.38-AM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-26-at-11.03.38-AM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.03.38-AM.png 1662w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="15"><code>units: ...
points:
  zones:
    matrix:
      anchor: ...
      key: ...
      columns:
        outer: ...
        pinky: ...
        ring: ...
        middle: ...
        index:
          key:
            stagger: -2.5
            column_net: P0
        inner: ...
      rows:
        mod: ...
        bottom:
          row_net: P1
        home: ...
        top: ...
        num: ...
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space: ...
      rows:
        cluster: ...
  rotate: -20
  mirror: ...
outlines: ...
pcbs: ...
</code></pre><!--kg-card-end: html--><p>The <code>column_net:</code> property works the exact same way, just for columns instead of rows. Just note that you need to put it inside of the <code>key:</code> property of each column.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.07.40-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1007" height="634" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-11.07.40-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-11.07.40-AM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.07.40-AM.png 1007w" sizes="(min-width: 720px) 720px"></figure><p>Before we continue, mosey on over to the Editing Options section of your KiCAD Settings. There&apos;s an option for <code>Step for rotate commands:</code>. Change that to match whatever <code>rotate:</code> attribute to inside of the <code>points:</code> section. In our case, 20 deg.</p><p>Now if you go back to your KiCAD window, you can select the entire board with <code>Ctrl/Cmd-a</code>, and rotate the two halves back and forth with <code>r</code> and <code>Shift-r</code>.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.11.10-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1429" height="1015" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-11.11.10-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-11.11.10-AM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.11.10-AM.png 1429w" sizes="(min-width: 720px) 720px"></figure><p>Ah, that feels better.</p><p>This tutorial isn&apos;t going to be a full KiCAD guide. Thankfully you don&apos;t need to get deep into this software in order to make a keyboard. KiCAD actions are very &quot;modal&quot;, and are usually triggered by discrete clicks or key commands. Unlike a drawing application like Paint or Photoshop, you create traces by clicking where you want to start drawing a line, dragging the line to where it needs to go, and then clicking a second time to stop drawing.</p><p>Let&apos;s go ahead and wire up our row now.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.18.30-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1689" height="394" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-11.18.30-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-11.18.30-AM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-26-at-11.18.30-AM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.18.30-AM.png 1689w" sizes="(min-width: 720px) 720px"></figure><p>Here&apos;s our row.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.20.56-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="356" height="1174"></figure><p>And here&apos;s our column. (Shout out to my CMS stretching the image out a bit.)</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.22.53-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1808" height="1138" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-11.22.53-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-11.22.53-AM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-26-at-11.22.53-AM.png 1600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.22.53-AM.png 1808w" sizes="(min-width: 720px) 720px"></figure><p>Oof. I did not think through which pins I used for these columns and rows, huh? Those row and column traces are having to reach over to the far side of the keyboard in order to get hooked up. Let&apos;s see if we can more intelligently map out these pins.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/DuplexMatrix-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1224" height="582" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/DuplexMatrix-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/DuplexMatrix-1.png 1000w, https://flatfootfox.com/content/images/2023/03/DuplexMatrix-1.png 1224w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/NewPinout-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="986" height="767" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/NewPinout-1.png 600w, https://flatfootfox.com/content/images/2023/03/NewPinout-1.png 986w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="10,13,17,21,25,30,33,35,37,39,41"><code>units: ...
points:
  zones:
    matrix:
      anchor: ...
      key: ...
      columns:
        outer:
          rows.mod.skip: true
          key.column_net: P14
        pinky:
          rows.mod.skip: true
          key.column_net: P16
        ring:
          key:
            stagger: 5
            column_net: P10
        middle:
          key:
            stagger: 2.5
            column_net: P7
        index:
          key:
            stagger: -2.5
            column_net: P8
        inner:
          rows.mod.skip: true
          key:
            stagger: -2.5
            column_net: P9
      rows:
        mod:
          row_net: P15
        bottom:
          row_net: P18
        home:
          row_net: P19
        top:
          row_net: P20
        num:
          row_net: P21
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space: ...
      rows:
        cluster: ...
  rotate: -20
  mirror: ...
outlines: ...
pcbs: ...
</code></pre><!--kg-card-end: html--><p>We are <em>almost</em> there. We&apos;ve set all of the column nets, but we still need to define the row nets for the right side of the keyboard. Thankfully, Ergogen provides a syntax to specifically target mirrored sections of the board.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.53.55-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1359" height="697" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-11.53.55-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-11.53.55-AM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-11.53.55-AM.png 1359w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="46" data-line-offset="46" data-line="49,52,55,58,61"><code>rows:
  mod:
    row_net: P15
    mirror.row_net: P6
  bottom:
    row_net: P18
    mirror.row_net: P5
  home:
    row_net: P19
    mirror.row_net: P4
  top:
    row_net: P20
    mirror.row_net: P0
  num:
    row_net: P21
    mirror.row_net: P1
</code></pre><!--kg-card-end: html--><p>There we go! All of our nets are now set up!</p><p>Except wait, the thumbs aren&apos;t connected to anything. Right, we were going to nudge all of those net definitions over by one. Let&apos;s clean that up real quick. Key level overrides to the rescue!</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-12.09.31-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: The PCB (Part 3)" loading="lazy" width="1371" height="692" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-26-at-12.09.31-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-26-at-12.09.31-PM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-26-at-12.09.31-PM.png 1371w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="18,23,28,57,63,67"><code>units: ...
points:
  zones:
    matrix:
      anchor: ...
      key: ...
      columns:
        outer:
          rows.mod.skip: true
          key.column_net: P14
        pinky:
          rows.mod.skip: true
          key.column_net: P16
        ring:
          key:
            stagger: 5
            column_net: P10
          rows.mod.column_net: P16
        middle:
          key:
            stagger: 2.5
            column_net: P7
          rows.mod.column_net: P10
        index:
          key:
            stagger: -2.5
            column_net: P8
          rows.mod.column_net: P7
        inner:
          rows.mod.skip: true
          key:
            stagger: -2.5
            column_net: P9
      rows:
        mod:
          row_net: P15
          mirror.row_net: P6
        bottom:
          row_net: P18
          mirror.row_net: P5
        home:
          row_net: P19
          mirror.row_net: P4
        top:
          row_net: P20
          mirror.row_net: P0
        num:
          row_net: P21
          mirror.row_net: P1
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer:
          key:
            splay: -15
            column_net: P8
        space:
          key:
            width: 1.5kx
            splay: 75
            shift: [2.5,-3.25]
            column_net: P9
      rows:
        cluster:
          row_net: P15
          mirror.row_net: P6
  rotate: -20
  mirror: ...
outlines: ...
pcbs: ...
</code></pre><!--kg-card-end: html--><p>In this step we finished wiring up our thumb keys, and we also included some row level overrides in our column definitions. The <code>rows.mod.column_net: P16</code> inside of <code>column.ring:</code> tells Ergogen that we want to override the rest of that column&apos;s <code>column_net: P10</code> for just the mod key.</p><p>With that, we&apos;re finally done. There was a lot of theory talk here when it came to the nets, but our PCB configuration is finished!</p><h2 id="end-of-part-3">End of Part 3</h2><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 4
  py: ky + 4
points:
  zones:
    # The primary 6x4 key matrix, plus 3 modifiers.
    matrix:
      # Position in center of KiCAD workspace.
      anchor:
        shift: [100, -100]
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      columns:
        # Hide the first two mods and the last mod.
        # Provide a Sofle-like column stagger.
        outer:
          rows.mod.skip: true
          key.column_net: P14
        pinky:
          rows.mod.skip: true
          key.column_net: P16
        ring:
          key:
            stagger: 5
            column_net: P10
          rows.mod.column_net: P16
        middle:
          key:
            stagger: 2.5
            column_net: P7
          rows.mod.column_net: P10
        index:
          key:
            stagger: -2.5
            column_net: P8
          rows.mod.column_net: P7
        inner:
          rows.mod.skip: true
          key:
            stagger: -2.5
            column_net: P9
      rows:
        # Four main rows, one partial row.
        mod:
          row_net: P15
          mirror.row_net: P6
        bottom:
          row_net: P18
          mirror.row_net: P5
        home:
          row_net: P19
          mirror.row_net: P4
        top:
          row_net: P20
          mirror.row_net: P0
        num:
          row_net: P21
          mirror.row_net: P1
    # Thumb cluster for Layer and Space keys.
    thumbs:
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      # Place thumbs where the inner mod would go.
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        # Fan thumbs out by -15 degrees.
        layer:
          key:
            splay: -15
            column_net: P8
        # Spacebar uses a 1.5 wide key.
        space:
          key:
            width: 1.5kx
            splay: 75
            shift: [2.5,-3.25]
            column_net: P9
      rows:
        # Thumbs only have one row.
        cluster:
          row_net: P15
          mirror.row_net: P6
  # Mirror keyboard halves with a moderate rotation.
  rotate: -20
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2kx
outlines:
  # Pure key outline.
  raw:
    - what: rectangle
      where: true
      size: [px, py]
  # Key outlines with 0.5mm removed to show key overlaps.
  keys:
    - what: rectangle
      where: true
      size: [kx-0.5,ky-0.5]
  # PCB board outline.
  board:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_top
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_top
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5px,-0.5py]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: mirror_thumbs_space_cluster
          shift: [0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: matrix_outer_bottom
          shift: [-0.5px,-0.5py]
      fillet: 2
  # Combination preview showing outline and keys.
  combo:
    - name: board
    - operation: subtract
      name: keys
pcbs:
  tutorial:
    outlines:
      main:
        outline: board
    footprints:
      # Hotswap Choc keys.
      choc_hotswap:
        what: choc
        where: true
        params:
          keycaps: true
          reverse: false
          hotswap: true
          from: &quot;{{column_net}}&quot;
          to: &quot;{{colrow}}&quot;
      # Through Hole or SMD Diodes
      diode:
        what: diode
        where: true
        params:
          from: &quot;{{colrow}}&quot;
          to: &quot;{{row_net}}&quot;
        adjust:
          shift: [0, -5]
      # Face Down Arduino Pro Micro
      promicro:
        what: promicro
        params:
          orientation: &quot;down&quot;
        where:
          ref.aggregate.parts: [matrix_inner_home, mirror_matrix_inner_home]
          shift: [0,0]
          rotate: -90
      # OLED Screen
      oled:
        what: oled
        params:
          side: &quot;F&quot;
          SDA: P2
          SCL: P3
        where:
          ref.aggregate.parts: [matrix_inner_home, mirror_matrix_inner_home]
          shift: [-6,-19]
          rotate: 90
      # Four Pin Reset Button
      reset:
        what: button
        params:
          from: GND
          to: RST
        where:
          ref.aggregate.parts: [matrix_index_mod, mirror_matrix_index_mod]
          shift: [0, -1]
          rotate: -90
</code></pre><!--kg-card-end: html--><p>We still need to wire this bad boy together, but before we wrap up this PCB, I&apos;d like to take a trip over to the Cases section and wrap up a few of the smaller Ergogen topics. When you&apos;re ready, head on over to <a href="https://flatfootfox.com/ergogen-part4-footprints-cases/">Let&apos;s Design a Keyboard With Ergogen v4: Offline Ergogen, External Footprints, &amp; Cases (Part 4)</a>!</p>]]></content:encoded></item><item><title><![CDATA[Let's Design A Keyboard With Ergogen v4: Outlines (Part 2)]]></title><description><![CDATA[In the second part of this guide, I take a look at creating a keyboard's shape using Ergogen's outline tool.]]></description><link>https://flatfootfox.com/ergogen-part2-outlines/</link><guid isPermaLink="false">640384151914912295540567</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Tue, 04 Apr 2023 14:55:00 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Ergogen-Outlines.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Ergogen-Outlines.jpg" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)"><p>Welcome back, again! In the <a href="https://flatfootfox.com/ergogen-introduction">introduction</a> to this series we discussed the various parts of Ergogen, and in <a href="https://flatfootfox.com/ergogen-part1-units-points/">Part 1</a> we created a series of points defining the layout of our keyboard. Now in Part 2 we&apos;re going to focus on creating an outline for our board.</p><h2 id="outlines">Outlines</h2><p>Right now we&apos;ve only defined the points. We know what layout our keys will take, but we need to give shape and structure to the actual board itself. This is done via &quot;Outlines&quot;. They pretty much do what they say on the tin, and they can be defined a few different ways. Let&apos;s go ahead and try out the first method now.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-3.33.11-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="873" height="420" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-3.33.11-PM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-3.33.11-PM.png 873w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="14-18"><code>units:
  kx: cx
  ky: cy
  px: kx + 2
  py: ky + 2
points:
  zones:
    matrix: ...
    thumbs: ...
  rotate: -15
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
outlines:
  raw:
    - what: rectangle
      where: true
      size: [kx, ky]
</code></pre><!--kg-card-end: html--><p>We&apos;ve gone ahead and added a new top level section. Along with <code>units</code> and <code>points</code>, the <code>outlines</code> section will house all of our outline data. To start with, let&apos;s define a very simple outline. In this (user named) <code>raw:</code> section, we&apos;re going to put a border around every key on our keyboard. The <code>- what: rectangle</code> attribute tells Ergogen we&apos;re dealing with four sided shapes, and the <code>where: true</code> tells Ergogen we&apos;d like to set this outline up anywhere we have points (keys). <code>size: [kx, ky]</code> tells Ergogen that we want these rectangles to have a standard Choc height and width. (We assigned <code>cx</code> and <code>cy</code> to <code>kx</code> and <code>ky</code> in the Units section of Part 1 so that we can easily re-define them later if we need to.)</p><p>Just a head&apos;s up, the <code>-</code> in <code>- what: rectangle</code> is YAML&apos;s way of indicating an item in a list. You may reciever errors from your config if your outline&apos;s <code>-</code> characters don&apos;t have the proper whitespace.</p><p>Anywhere that these rectangles overlap or have touch edges will be combined into the same shape. Our Choc spaced switches all overlap one another, so we get two slightly bumpy rectangles with the thumbs floating out by themselves. </p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-3.36.49-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="871" height="425" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-3.36.49-PM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-3.36.49-PM.png 871w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="6" data-line-offset="6" data-line="19"><code>points:
  zones:
    matrix: ...
    thumbs: ...
  rotate: -15
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
outlines:
  raw:
    - what: rectangle
      where: true
      size: [px, py]
</code></pre><!--kg-card-end: html--><p>We don&apos;t have to go with our usual <code>size: [kx, ky]</code> exactly Choc-sized switch outlines if we don&apos;t want to. Switching over to those padded <code>px</code> and <code>py</code> units we created at the start of Part 1 will allow us to add 1mm of padding on each side of our keys. Since the <code>raw</code> outline is combining these keys together, the extra padding on the interior of the shape won&apos;t matter. You can see our larger thumbs start to become part of the overall shape at this point.</p><p>From here there&apos;s a few approaches we could take. We can keep using this traced-style keyboard and do some tricks to incorporate the thumbs and bridge the two halves together, or we could define our own custom keyboard shape from scratch.</p><p>Before we get into that however, we should circle back on something we discussed in the Points portion of this guide. Our <a href="https://ergogen.xyz/">ergogen.xyz</a> preview was limited to MX spacing, and we weren&apos;t able to get a clear view of our actual keyboard layout. Let&apos;s fix that now and create an outline that&apos;s just a preview of our keys.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-10.45.06-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="878" height="407" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-10.45.06-AM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-10.45.06-AM.png 878w" sizes="(min-width: 720px) 720px"><figcaption>keys.dxf</figcaption></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="6" data-line-offset="6" data-line="19-23"><code>points:
  zones:
    matrix: ...
    thumbs: ...
  rotate: -15
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
outlines:
  raw:
    - what: rectangle
      where: true
      size: [px, py]
  keys:
    - what: rectangle
      where: true
      size: [kx-0.5,ky-0.5]
</code></pre><!--kg-card-end: html--><p>This new <code>keys:</code> section is very similar to our earlier <code>raw:</code> shape. The only difference is that we&apos;ve shaved half a millimeter off of each key so that we can more easily see any potential overlap between them.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-10.51.06-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="873" height="419" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-10.51.06-AM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-10.51.06-AM.png 873w" sizes="(min-width: 720px) 720px"><figcaption>demo.dxf</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-10.50.51-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="869" height="410" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-10.50.51-AM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-10.50.51-AM.png 869w" sizes="(min-width: 720px) 720px"><figcaption>keys.dxf</figcaption></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="6" data-line-offset="6" data-line="20"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space:
            width: 1.5kx
            splay: 75
            shift: [2.5,-3.25]
      rows:
        cluster: ...
  rotate: ...
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
outlines:
  raw:
    - what: rectangle
      where: true
      bound: true
      size: [px, py]
  keys:
    - what: rectangle
      where: true
      bound: false
      size: [kx-0.5,ky-0.5]
</code></pre><!--kg-card-end: html--><p>With a better view of the thumbs, I&apos;ve decided to go back and adjust the <code>points.zones.matrix.thumbs.columns.space</code> section. The key is now shifted over <code>shift: [2.5, -3.25]</code>. It&apos;s still a visual eyeball, but it seems a little better positioned than before.</p><blockquote>Update! <a href="https://ergogen.xyz/">ergogen.xyz</a> now supports custom preview variables! You can set <code>$default_width</code> and <code>$default_height</code> in the <code>units:</code> section to adjust the <code>demo.dxf</code> preview. These variables only adjust the web preview, so the rest of this guide is still useful, but it&apos;s not strictly necessary to create the custom <code>keys:</code> preview anymore.</blockquote><p>Now let&apos;s get onto the main event: Creating an actual outline for the keyboard.We want something that looks vaguely like this:</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-Crude.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="900" height="450" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen-Crude.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen-Crude.png 900w" sizes="(min-width: 720px) 720px"></figure><p>The trick is that we can&apos;t just arbitrarily draw lines on a blank canvas. We need to use the reference the points we&apos;ve created to indicate where the line should be drawn.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-11.02.36-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="875" height="365" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-11.02.36-AM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-11.02.36-AM.png 875w" sizes="(min-width: 720px) 720px"><figcaption>Ergogen Output</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-Approx.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="900" height="450" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen-Approx.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen-Approx.png 900w" sizes="(min-width: 720px) 720px"><figcaption>A rough approximate of the outline. Points in red.</figcaption></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="6" data-line-offset="6" data-line="36-67"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer: ...
        pinky: ...
        ring: ...
        middle: ...
        index: ...
        inner: ..
      rows:
        mod: ...
        bottom: ...
        home: ...
        top: ...
        num: ...
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space: ...
      rows:
        cluster: ...
  rotate: ...
  mirror: ...
outlines:
  raw: ...
  keys: ...
  board:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [0,0]
        - ref: matrix_ring_num
          shift: [0,0]
        - ref: matrix_middle_num
          shift: [0,0]
        - ref: matrix_inner_num
          shift: [0,0]
        - ref: mirror_matrix_inner_num
          shift: [0,0]
        - ref: mirror_matrix_middle_num
          shift: [0,0]
        - ref: mirror_matrix_ring_num
          shift: [0,0]
        - ref: mirror_matrix_outer_num
          shift: [0,0]
        - ref: mirror_matrix_outer_bottom
          shift: [0,0]
        - ref: mirror_matrix_ring_mod
          shift: [0,0]
        - ref: mirror_thumbs_space_cluster
          shift: [0,0]
        - ref: thumbs_space_cluster
          shift: [0,0]
        - ref: matrix_ring_mod
          shift: [0,0]
        - ref: matrix_outer_bottom
          shift: [0,0]
</code></pre><!--kg-card-end: html--><p>We&apos;ve introduced a new type of outline here. The &quot;polygon&quot; outline allows us to create a many-sided shape. Each point needs a <code>ref</code> key to describe where it is, and can be adjusted with <code>shift</code>. In this particular polygon, I&apos;ve started in the top left corner and walked around the board. This uses that same ref notation we discussed earlier, and has some actual examples of the <code>mirror_</code> prefix. There&apos;s just one small problem: All of these points are referencing the center of the key. We need to shift the outline to the edge of the key.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-11.40.38-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="873" height="417" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-11.40.38-AM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-11.40.38-AM.png 873w" sizes="(min-width: 720px) 720px"><figcaption>Ergogen&apos;s refined output.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-Approx2.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="900" height="450" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen-Approx2.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen-Approx2.png 900w" sizes="(min-width: 720px) 720px"><figcaption>An approximate drawing of our new shifted refs shown in magenta.</figcaption></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="33" data-line-offset="33" data-line="41,43,45,46,47,49,51,53,54,55,57,59,61,63,64,65,67,69,70,71,73"><code>outlines:
  raw: ...
  keys: ...
  board:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5px,-0.5py]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.75px,0.5py]
        - ref: thumbs_space_cluster
          shift: [-0.75px,0.5py]
        - ref: thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: matrix_outer_bottom
          shift: [-0.5px,-0.5py]
</code></pre><!--kg-card-end: html--><p>Now that&apos;s a lot of points. I added a few additional refs as we walked clockwise around the keyboard. Most keys have a shift of <code>0.5px</code> or <code>-0.5px</code> to shift to the left or right side of the key (with some extra padding), and <code>0.5py</code> or <code>-0.5py</code> to move the line to the top or bottom of the key. The thumbs have a <code>-0.75px</code> shift since they&apos;re larger than the standard key.</p><p>This isn&apos;t an end-all-beat-all outline design method. It&apos;s just one example technique of using polygons to draw a shape that roughly outlines your board. Identifying which keys you want to be the outer edge of your outline and then figuring out how you need to shift those points to the edge can be a useful way of quickly create a rough outline of your board.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-11.41.35-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="873" height="412" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-11.41.35-AM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-11.41.35-AM.png 873w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="33" data-line-offset="33" data-line="41"><code>outlines:
  raw: ...
  keys: ...
  board:
    - what: polygon
      operation: stack
      points:
        ...
      fillet: 2
</code></pre><!--kg-card-end: html--><p>Now that we&apos;ve got our outline, let&apos;s put a bit of polish on it. <code>fillet: 2</code> will round the corners of the outline and give it less of a jagged look. A larger fillet value will give you a larger curve.</p><p>The last step here is to make sure everything actually fits. Let&apos;s create one last outline to do just that.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-12.01.49-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="874" height="424" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-12.01.49-PM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-12.01.49-PM.png 874w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="33" data-line-offset="33" data-line="45-48"><code>outlines:
  raw: ...
  keys:
    - what: rectangle
      where: true
      bound: false
      size: [kx-0.5,ky-0.5]
  board:
    - what: polygon
      operation: stack
      points: ...
      fillet: 2
  combo:
    - name: board
    - operation: subtract
      name: keys
</code></pre><!--kg-card-end: html--><p>The <code>combo:</code> outline has some new syntax. Rather than defining a new outline, we&apos;re going to combine two previous outlines. In this case, we&apos;ve subtracted the keys shape from the inside of the board shape.</p><p>You can also use <code>- operation: add</code> to combine two outlines together. If we had decided to use the <code>raw</code> outline earlier, instead of creating our large <code>board</code> shape, we could have just defined a simplistic <code>middle</code> shape to bridge the gap between the two halves. Connecting <code>matrix_inner_num</code>, <code>mirror_matrix_inner_num</code>, <code>mirror_matrix_index_mod</code>, and <code>matrix_index_mod</code> probably would have done the trick. Ergogen v3 had a <code>glue</code> syntax to help streamline this process but it&apos;s been depreciated with v4.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-12.04.04-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="879" height="427" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-12.04.04-PM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-12.04.04-PM.png 879w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="4-5"><code>units:
  kx: cx
  ky: cy
  px: kx + 4
  py: ky + 4
</code></pre><!--kg-card-end: html--><p>Our board outline is looking pretty tight. Err, not in the slang meaning of things. The edge of the PCB were really close to the switches. Now is where we can really let those <code>units:</code> values we set earlier shine. Changing <code>px</code> and <code>py</code> to <code>+4</code> instead of <code>+2</code> immediately gives our board a nice amount of buffer.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-2.59.16-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)" loading="lazy" width="875" height="467" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-25-at-2.59.16-PM.png 600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-25-at-2.59.16-PM.png 875w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="6" data-line-offset="6" data-line="10"><code>points:
  zones:
    matrix: ...
    thumbs: ...
  rotate: -20
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
outlines:
  raw: ...
  keys: ...
  board: ...
  combo: ...
</code></pre><!--kg-card-end: html--><p>Before we wrap up this section, I wanted to take a moment to highlight just how powerful the parametric nature of Ergogen is. We were just able to update the padding on the keyboard outline by updating just two lines of text.</p><p>All of this outline creation and key placement is something one could do with enough time and patience in KiCAD. However, since Ergogen boards are defined by an easily adjusted config file, we&apos;re not stuck with the layout that we currently have. Now that we&apos;ve finished laying out our board, we might decide that we want a slightly sharper angle on the board. We could update <code>points.rotate: -15</code> to <code>points.rotate: -20</code>, giving the board a much more significant angle to it. Just like that, our entire layout has shifted. Rather than needing to lasso a bunch of switches and rejigger a board edge, we just had to change one variable. That&apos;s hard to beat.</p><h2 id="end-of-part-2">End of Part 2</h2><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 2
  py: ky + 2
points:
  zones:
    # The primary 6x4 key matrix, plus 3 modifiers.
    matrix:
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      columns:
        # Hide the first two mods and the last mod.
        # Provide a Sofle-like column stagger.
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key.stagger: 5
        middle:
          key.stagger: 2.5
        index:
          key.stagger: -2.5
        inner:
          rows.mod.skip: true
          key.stagger: -2.5
      rows:
        # Four main rows, one partial row.
        mod:
        bottom:
        home:
        top:
        num:
    # Thumb cluster for Layer and Space keys.
    thumbs:
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      # Place thumbs where the inner mod would go.
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        # Fan thumbs out by -15 degrees.
        layer:
          key.splay: -15
        # Spacebar uses a 1.5 wide key.
        space:
          key:
            width: 1.5kx
            splay: 75
            shift: [2.5,-3.25]
      rows:
        # Thumbs only have one row.
        cluster:
  # Mirror keyboard halves with a moderate rotation.
  rotate: -20
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
outlines:
  # Pure key outline.
  raw:
    - what: rectangle
      where: true
      size: [px, py]
  # Key outlines with 0.5mm removed to show key overlaps.
  keys:
    - what: rectangle
      where: true
      size: [kx-0.5,ky-0.5]
  # PCB board outline.
  board:
    - what: polygon
      operation: stack
      points:
        - ref: matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_inner_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [0.5px,0.5py]
        - ref: mirror_matrix_middle_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_ring_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_num
          shift: [-0.5px,0.5py]
        - ref: mirror_matrix_outer_bottom
          shift: [-0.5px,-0.5py]
        - ref: mirror_matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: mirror_thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: thumbs_space_cluster
          shift: [-0.5py,-0.5px]
        - ref: thumbs_layer_cluster
          shift: [-0.5px,-0.5py]
        - ref: matrix_ring_mod
          shift: [-0.5px,-0.5py]
        - ref: matrix_outer_bottom
          shift: [-0.5px,-0.5py]
      fillet: 2
  # Combination preview showing outline and keys.
  combo:
    - name: board
    - operation: subtract
      name: keys
</code></pre><!--kg-card-end: html--><p>On that note, that&apos;s the end of Part 2! We created an outline for our PCB, and have demonstrated the utility of the Units section we created in Part 1. Now we can finally start defining our actual PCB. Join us for the next step over in: <a href="https://flatfootfox.com/ergogen-part3-pcbs/">Let&apos;s Build A Keyboard With Ergogen v4: PCBs (Part 3)</a>!</p>]]></content:encoded></item><item><title><![CDATA[Let's Design A Keyboard With Ergogen v4: Units & Points (Part 1)]]></title><description><![CDATA[In the first part of this guide, I discuss creating a keyboard layout with Ergogen's Units and Points sections.]]></description><link>https://flatfootfox.com/ergogen-part1-units-points/</link><guid isPermaLink="false">63f6d6c17a20c14ec07ff0d3</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sun, 02 Apr 2023 20:12:23 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Ergogen-Units-and-Points-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Ergogen-Units-and-Points-1.jpg" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)"><p>Welcome back! Hopefully by now you&apos;ve read the <a href="https://flatfootfox.com/ergogen-introduction/">introductory</a> post to this series. If not: Howdy! We&apos;re walking through how to design a keyboard using the Ergogen ergonomic keyboard layout generator. In Part 1 of this guide we&apos;ll be defining some useful units for our keyboard and creating the points that comprise it&apos;s layout.</p><p>If you haven&apos;t already, navigate to <a href="https://ergogen.xyz/">ergogen.xyz</a> and clear out the contents of the left side of the page. Go ahead and open up a text editor on your system and create a backup <code>your-keyboard-name.yaml</code> file. Each code block in this guide will iterate on the previous block. Feel free to follow along on <a href="https://ergogen.xyz/">ergogen.xyz</a>. I&apos;ll post the current full Ergogen config file at the end of each part of this series.</p><blockquote>Update: Ceoloide&apos;s done an incredible job of updating the web based version of Ergogen. It now features the ability to import external footprints, KiCAD previews, Github integration, and more. Previous versions of this guide referenced the <a href="https://ergogen.ceoloide.com/">ergogen.ceoloide.com</a> version of the site, but all of his changes have been rolled back into the official <a href="https://ergogen.xyz/">ergogen.xyz</a> site.</blockquote><h2 id="set-up-your-units">Set Up Your Units</h2><p>Before we get into the config file proper, we should set up some useful variables. Ergogen uses the metric system and any number without a unit behind it is understood to be in millimeters. <code>padding: 4</code> describes a key with 4mm of padding for example. (The one large exception to this is rotation properties, where numbers without units are describing degrees of rotation.)</p><p>There&apos;s a few magic numbers that are repeated frequently when designing a keyboard. Cherry MX keys are 19mm x 19mm, and Kailh Choc keys are 18mm wide and 17mm tall. There&apos;s nothing stopping you from using <code>spread: 19mm</code> throughout your config file, but Ergogen provides us with a few useful default units to reference these frequently used numbers. The lowercase <code>u</code> unit provides you a quick reference to the MX switch&apos;s 19mm, while a capital <code>U</code> represents 19.05mm for keycaps that need a bit more breathing room. Over on the Kailh side of things, Choc keys have <code>cx</code> and <code>cy</code> to quickly reference the 18mm width and 17mm height of these rectangular keys.</p><p>These units can be mixed with common math operations. <code>spread: u</code> defines a spread with a standard MX spacing, <code>spread: 1.5u</code> defines a spread of one and a half MX keys, and <code>spread: u + 2</code> defines a standard MX spread with an extra 2mm of space.</p><p><code>u</code>, <code>U</code>, <code>cx</code>, and <code>cy</code> come built into Ergogen by default, but we&apos;re not limited to just these units. The <code>units:</code> section at the top of your config allows you to create your own custom variables. Let&apos;s go ahead and create a <code>units:</code> section now and set up some proxy units.</p><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 2
  py: ky + 2
</code></pre><!--kg-card-end: html--><p>Ergogen&apos;s built in units are great, but they&apos;re a <em>pain</em> to update if you realize you want to globally adjust some aspect of your board. If you&apos;d like to take an MX spaced layout to a Choc spaced layout, you can&apos;t just find-replace the <code>u</code> character throughout your project. You can save your future self some trouble by creating a pair of &quot;proxy&quot; <code>kx</code> and <code>ky</code> variables pointing to whatever Ergogen default you&apos;d like to leverage. We&apos;re designing a Choc spaced board today, so let&apos;s define our proxy variables to <code>kx: cx</code> and <code>ky: cy</code>. In the future if we want to adjust this board to an MX layout, all we need to do is update these variables to <code>kx: u</code> and <code>ky: u</code>. </p><p>We&apos;ll show off the power of units a bit later in this guide. While we&apos;re here though, let&apos;s go ahead and define some slightly padded values of our standard width and height. <code>px: kx + 2</code> (20mm) and <code>py: ky + 2</code> (19mm) will help us down the road when we&apos;re trying to come up with the outline for our PCB.</p><h2 id="get-to-the-point">Get To The Point</h2><p>Ergogen uses the concept of &quot;Points&quot; to describe where each key in a layout should be placed. A single &quot;Point&quot; describe the <code>[x,y]</code> coordinate at the center of where a key should be placed, as well as an <code>r</code> value describing that key&apos;s rotation. A group of points in Ergogen is known as a <code>Zone</code>.</p><p>The vast majority of ergonomic keyboards, including the one we&apos;re going to build today, leverage a &quot;keyboard matrix&quot;. This is a set of rows and columns that allow us to use a dozen pins on our keyboard to read dozens of keys. In keyboard matrix parlance (and uh, general table nomenclature), the up-down groups of keys are a &quot;column&quot;, and the left-right groups of keys are a &quot;row&quot;.</p><p>Let&apos;s go ahead and define a few basic rows and columns now. The keyboard we want to build is a knockoff of the Sofle keyboard. It has four complete rows with six keys, a smaller modifier row with four keys, and a thumb. Setting aside the thumb key for the moment, let&apos;s build a simple 5 row by 6 column design to start with.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="394" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-1.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-1.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 2
  py: ky + 2
points:
  zones:
    matrix:
      columns:
        outer:
        pinky:
        ring:
        middle:
        index:
        inner:
      rows:
        mod:
        bottom:
        home:
        top:
        num:
</code></pre><!--kg-card-end: html--><p>This is about a simple a layout one can get in Ergogen, but let&apos;s break down exactly what just happened. The <code>points:</code> section indicates that we&apos;re defining the layout of the keyboard itself. The <code>zones:</code> section allows us to define several different &quot;groups&quot; of keys. These can be named anything you&apos;d like. I&apos;ve gone with <code>matrix</code> in this example since we&apos;re defining a keyboard matrix, but you could just as easily name it <code>mykeyboard</code> or <code>steve</code>. An Ergogen keyboard can have multiple zones. We&apos;ve defined the basic keyboard matrix for now, but we&apos;ll come back and add a thumb zone later.</p><p>Inside of our <code>matrix:</code>, I&apos;ve defined <code>column:</code> and <code>row:</code> sections. These are fixed names in Ergogen, and let our config file know how many up-down and left-right key groups we&apos;d like.</p><p>The names of the rows and columns themselves aren&apos;t fixed. You&apos;re often see <code>pinky</code>, <code>ring</code>, <code>middle</code>, <code>index</code>, and <code>inner</code> in community Ergogen configs, but everyone&apos;s has their own preferences. I&apos;ve called the column with my tab key the <code>outer</code> column, but just as often you&apos;ll find folks calling it <code>pinky2</code>, <code>stretch</code>, or something similar. Likewise, <code>mod</code>, <code>bottom</code>, <code>home</code>, <code>top</code>, and <code>num</code> are popular row terms, but you can define them as anything you&apos;d like.</p><p>Let&apos;s create a completely different set of points just to drive this all home.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-2.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="238" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-2.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-2.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml" tabindex="0"><code>points:
  zones:
    da_board:
      columns:
        foo:
        bar:
        florp:
        pings:
      rows:
        tom:
        dick:
        harry:
</code></pre><!--kg-card-end: html--><p>If you&apos;re scouring the Ergogen documentation for some property that everyone seems to be using which you can&apos;t seem to find the definition of, it&apos;s probably a user-definable property name. It may take some time for you to get a feeling for what&apos;s a strict name and what&apos;s just a community convention.</p><p>Back to our original board definition, our matrix currently has a few too many keys. This 5x6 grid is perfectly symmetrical, but we don&apos;t want any keys underneath the <code>Left Shift</code> and <code>Z</code> keys. Let&apos;s rectify that now.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-3.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="377" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-3.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-3.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="13-15,17"><code>points:
  zones:
    matrix:
      columns:
        outer:
          rows:
            mod:
              skip: true
        pinky:
          rows.mod.skip: true
        ring:
        middle:
        index:
        inner:
      rows:
        mod:
        bottom:
        home:
        top:
        num:
</code></pre><!--kg-card-end: html--><p>There we go! We&apos;re still missing a thumb, but our weird ergonomic keyboard is starting to take shape. As you can see I- Wait, what the heck? I used two completely different methods of hiding those keys!</p><p>We&apos;re adding our first real property to this board and I&apos;m already introducing some YAML shortcuts. As you can see with the <code>outer:</code> column, we&apos;ve added a new <code>rows:</code> attribute. This tells the config, &quot;Hey, I&apos;m going to start defining properties pertaining to the intersection of the <code>outer</code> column and a specific row.&quot; Nesting <code>mod:</code> underneath <code>rows:</code> lets Ergogen know we&apos;re specifically targeting the key at the overlap of the outer column and the mod row. Finally we can get to the actual property at hand. <code>skip: true</code> lets Ergogen know that we&apos;d like to skip adding an outer-mod key to our layout.</p><p>This one property takes up a decent amount of space in our config. We had to nest <code>skip: true</code> inside of <code>mod:</code> inside of <code>rows:</code>. Rather than having to type all that out and make an increasingly nested file, we can leverage YAML&apos;s dot notation. In the <code>pinky:</code> column, you can see that we simply use <code>rows.mod.skip: true</code> to achieve the same effect as all those indented attributes. You don&apos;t need to use dot notation if you prefer indentations, but it&apos;s important to know that folks didn&apos;t suddenly decide to use <code>reallyLongVariableNames</code> if you&apos;re reading other people&apos;s Ergogen configs.</p><p>We still need to add a thumb to our keyboard, but it&apos;s also looking rather <em>square</em> compared to the original Sofle. The Sofle keyboard has this neat &quot;curl&quot; effect where the keys in each column are slightly staggered to accommodate the shape of one&apos;s hand. Let&apos;s add a column stagger now.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-4.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="376" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-4.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-4.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="18"><code>points:
  zones:
    matrix:
      columns:
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key:
            stagger: 5
        middle:
        index:
        inner:
      rows:
        mod:
        bottom:
        home:
        top:
        num:
</code></pre><!--kg-card-end: html--><p>Our man&apos;s moving up in the world! And by &quot;our man&quot;, I mean the <code>ring</code> column is shifted up 5mm. Remember, anything without units in Ergogen is understood to be millimeters.</p><p>You can use units in these properties as well. Let&apos;s send the <code>middle</code> column for a ride.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-5.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="507" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-5.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-5.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="20-21"><code>points:
  zones:
    matrix:
      columns:
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key:
            stagger: 5
        middle:
          key:
            stagger: 2ky
        index:
        inner:
      rows:
        mod:
        bottom:
        home:
        top:
        num:
</code></pre><!--kg-card-end: html--><p>Dang! Adding <code>key.stagger: 2ky</code> moved the <code>middle</code> column up two whole Choc key heights over the <code>ring</code> column. It&apos;s important to note that the stagger property is in relation to the column before it. <code>middle</code> is 2ky taller than our <code>ring</code> column, but our ring column was already 5mm taller than our <code>pinky</code> column. This means that <code>middle</code> is 2ky + 5mm taller than our <code>pinky</code> column. You can also see that <code>index</code> and <code>inner</code> are both in line with <code>middle</code>&apos;s last position. The <code>index</code> and <code>inner</code> columns are assumed to have a stagger of 0 right now, so they simply continue from <code>middle</code>&apos;s starting position.</p><p>Now that we&apos;ve had our fun, let&apos;s create a slightly more reasonable layout.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-6.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="394" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-6.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-6.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="17-18,20-21,23-24,26-27"><code>points:
  zones:
    matrix:
      columns:
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key:
            stagger: 5
        middle:
          key:
            stagger: 2.5
        index:
          key:
            stagger: -2.5
        inner:
          key:
            stagger: -2.5
      rows:
        mod:
        bottom:
        home:
        top:
        num:
</code></pre><!--kg-card-end: html--><p>There&apos;s our familiar Sofle shape! (I just eyeballed these stagger values based off the existing Sofle keyboard PCBs.) It&apos;s worth noting that most properties in Ergogen accept negative values. You may have noticed all these stagger properties are inside of <code>key:</code> attributes. We could collapse these with the same dot notation as before, but our config&apos;s still pretty readable at the moment. Now then, before we get to the thumb keys, let&apos;s do a little bit of housekeeping.</p><h2 id="choc-spacing">Choc Spacing</h2><p>Our board is going to leverage those Kailh Choc switches we mentioned in the units section. Ergogen defaults to using 19mm x 19mm MX switches by default, so we need to add a small change to our config in order to space our keys out correctly.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-7.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="366" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-7.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-7.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="11-13"><code>points:
  zones:
    matrix:
      key:
        padding: 1ky
        spread: 1kx
      columns:
      	...
      rows:
      	...
</code></pre><!--kg-card-end: html--><p>Tada! Our board looks... weird and cramped. In this step, we went ahead and added a new global <code>key</code> definition to our <code>matrix</code> zone. <code>padding: 1ky</code> defines the vertical space between each key, and <code>spread: 1kx</code> defines the horizontal space between each key. We set up these proxy units as copies of the Choc key sizes, so these attributes give each space 17mm of vertical space, and 18mm of horizontal space.</p><p>So why are the top and bottom edges overlapping, and the left and right edges are literally on top of each other? Unfortunately, <a href="https://ergogen.xyz/">ergogen.xyz</a> only renders MX-sized 19mm x 19mm key switch as part of its <code>demo.dxf</code> preview. Things might look a little cramped at the moment, but we&apos;ll be able to verify our spacing during some of the later steps.</p><blockquote>Update! Part 2 of this guide teaches you how to create custom outlines that let you better preview Choc-spaced keys. However, <a href="https://ergogen.xyz/">ergogen.xyz</a> now supports custom preview variables! You can set <code>$default_width</code> and <code>$default_height</code> in the <code>units:</code> section to adjust the <code>demo.dxf</code> preview. These variables only adjust the web preview, so the rest of what I previewed in Part 2 is still useful!</blockquote><p>Just a quick aside, Ergogen v3 lacked the global <code>key:</code> definition within a zone. The <code>spread:</code> property needed to be applied manually to every column. Just something to keep in mind when browsing old configs.</p><h2 id="splayed-out">Splayed Out</h2><p>The Sofle keyboard we&apos;re mimicking sticks to a traditional column stagger. For example&apos;s sake however, let&apos;s take a look at the popular <code>splay:</code> property.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-8.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="397" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-8.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-8.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="17"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer:
          rows.mod.skip: true
        pinky:
          key:
            splay: -4
          rows.mod.skip: true
        ring:
          key:
            stagger: 5
        middle:
          key:
            stagger: 2.5
        index:
          key:
            stagger: -2.5
        inner:
          key:
            stagger: -2.5
      rows: ...
</code></pre><!--kg-card-end: html--><p>Splay allows you to angle an entire row of keys. In this case, we used <code>key.splay: -4</code> inside of the <code>pinky:</code> column to angle it four degrees to the right. Again, you can use positive or negative degrees here. This property is traditionally used when angling pinky keys out to the side of the keyboard. Much like stagger, columns next to a splayed column will continue to be aligned to that angle.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-9.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="377" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-9.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-9.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="15,19,23"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer:
          key:
            splay: 8
          rows.mod.skip: true
        pinky:
          key:
            splay: -4
          rows.mod.skip: true
        ring:
          key:
            splay: -4
            stagger: 5
        middle:
          key:
            stagger: 2.5
        index:
          key:
            stagger: -2.5
        inner:
          key:
            stagger: -2.5
      rows: ...
</code></pre><!--kg-card-end: html--><p>Ergogen makes it nice and easy to achive splayed out pinky nirvana.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-10.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="378" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-10.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-10.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="33"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer:
          key:
            splay: 8
          rows.mod.skip: true
        pinky:
          key:
            splay: -4
          rows.mod.skip: true
        ring:
          key:
            splay: -4
            stagger: 5
        middle:
          key:
            stagger: 2.5
        index:
          key:
            stagger: -2.5
        inner:
          key:
            rotate: -4
            stagger: -2.5
      rows: ...
</code></pre><!--kg-card-end: html--><p>Another v3 to v4 migration note worth calling attention to is that v3&apos;s <code>rotate</code> property was renamed to <code>splay</code>. v4 has it&apos;s own new <code>rotate</code> property which works slightly differently. In Ergogen v4, <code>splay</code> rotates a column as a single group, and <code>rotate</code> curves the keys out in a fan like approach. You can see it in the <code>inner.key.rotate: -4</code> section of this latest example.</p><p>Now that we&apos;ve given a quick demonstration of splay, let&apos;s get back to our Sofle-inspired design. Once you&apos;ve deleted the splay and rotate examples, we can finally tackle the thumbs.</p><h2 id="thumbs-up">Thumbs Up</h2><p>Ergonomic mechanical keyboards will often include a section known as a &quot;thumb cluster&quot; or a &quot;thumb fan&quot;. The Sofle layout doesn&apos;t have a significant cluster of keys around the user&apos;s thumb, but the layer key and the spacebar key do have a slight curve to them. In this section we&apos;ll be defining and aligning this new thumb cluster, but first a bit of house keeping.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1_10.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="356" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1_10.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1_10.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="26"><code>points:
  zones:
    matrix:
      key:
        padding: 1ky
        spread: 1kx
      columns:
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key.stagger: 5
        middle:
          key.stagger: 2.5
        index:
          key.stagger: -2.5
        inner:
          rows.mod.skip: true
          key.stagger: -2.5
      rows:
        mod:
        bottom:
        home:
        top:
        num:
</code></pre><!--kg-card-end: html--><p>To start with, let&apos;s hide the inner column&apos;s mod key. This will give us room to place our curved thumb keys.</p><p>This config file&apos;s getting a little long now, so may haven noticed <code>...</code> in the code blocks a few times now. That&apos;s just shorthand for collapsing something we covered in an earlier section. (The line numbering may get a little wonky, try not to worry about it too much.)</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-11.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="371" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-11.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-11.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="25-33"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer: ...
        pinky: ...
        ring: ...
        middle: ...
        index: ...
        inner: ..
      rows:
        mod:
        bottom:
        home:
        top:
        num:
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      columns:
        layer:
        space:
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>Now this is interesting. I&apos;ve gone ahead and defined a second zone of keys. <code>thumbs:</code> is another user-definable name. This is a particular small two-by-one group of keys. I&apos;ve gone ahead and called the columns <code>space</code> and <code>layer</code>, and given the row a name of <code>cluster</code>. Technically with a one row layout like this you can omit the <code>rows</code> section entirely if you want to make your config a smaller. I&apos;ve also added a <code>key</code> section with the same Choc spacing defaults.</p><p>I never told Ergogen where to put these keys, so it just defaulted to inserting them into the first free space it could find at the bottom left of the layout. It&apos;s a little hard to see which two keys are part of our cluster. Let&apos;s move them around for a better view.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-12.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="501" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-12.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-12.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="34"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer: ...
        pinky: ...
        ring: ...
        middle: ...
        index: ...
        inner: ...
      rows:
        mod:
        bottom:
        home:
        top:
        num:
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      columns:
        layer:
        space:
      rows:
        cluster:
          shift: [0, -2ky]
</code></pre><!--kg-card-end: html--><p>Ergogen provides us some convenient methods for shifting keys around. In this most recent example, I moved the entire row two whole key heights lower than its default position. Now we can more easily see the <code>thumb</code> zone that we just defined. If we wanted to get it over towards the thumb area I could just use <code>shift: [5kx,0]</code> to move it over five key lengths, but Ergogen provides a better method of placing keys.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-13.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="364" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-13.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-13.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="29-31"><code>points:
  zones:
    matrix:
      key: ...
      columns:
        outer: ...
        pinky: ...
        ring: ...
        middle: ...
        index: ...
        inner: ...
      rows:
        mod:
        bottom:
        home:
        top:
        num:
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
        space:
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>Here&apos;s a new property <em>and</em> a new syntax. The <code>anchor</code> property tells Ergogen where the starting point for this zone should be. <code>ref:</code> is pretty straightforward. It&apos;s a reference of where the anchor should be placed. <code>matrix_inner_mod</code> is something we haven&apos;t seen yet though. This is Ergogen&apos;s way of referencing a specific point (AKA a key) on our keyboard. The first part refers to the key&apos;s zone (<code>matrix</code> in this case), then the next part of the variable is the key&apos;s column, and finally the last section is the row. Keep in mind all three of these variables are user-definable, so if you see some underscore-separated variables in other people&apos;s configs with terms that you don&apos;t recognize, it&apos;s because they chose those names for their specific config. In this example, we&apos;ve placed the anchor position for the thumb keys where our hidden <code>matrix_inner_mod</code> key would have gone.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-14.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="368" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-14.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-14.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="20"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
        space:
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>Let&apos;s give our thumbs a bit of breathing room for the next step. Ergogen properties can be used throughout your config where they makes sense. In this case, let&apos;s shift our anchor over 2mm and down 2mm.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-16.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="396" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-16.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-16.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="24"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
          key:
            splay: -15
        space:
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>Here we&apos;ve added a -15 degree splay to our <code>layer</code> key. The <code>space</code> key continues off this new rotated position. </p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-17.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="406" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-17.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-17.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="27"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
          key:
            splay: -15
        space:
          key:
            splay: -15
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>This time we&apos;ll also add a -15 degree splay to the <code>space</code> key. It&apos;s looking good, but it&apos;s not quite aligned yet. There&apos;s a lot of overlap between these two keys.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-18.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="411" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-18.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-18.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="28"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
          key:
            splay: -15
        space:
          key:
            splay: -15
            shift: [2,-2]
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>There we have it! We&apos;ll need to double check when we have a true Choc layout preview later, &#xA0;but this seems like a pretty good first draft. All the <code>shift</code> column needed was a quick <code>shift: [2, -2]</code> to shift the key over 2mm and down 2mm. We&apos;re <em>just</em> about there, but our spacebar doesn&apos;t look quite right just yet. The Sofle uses a 1.5 width key for the spacebars. Thankfully Ergogen has just such the property for us.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-19.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="430" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-19.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-19.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="27"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
          key:
            splay: -15
        space:
          key:
          	width: 1.5kx
            splay: -15
            shift: [2,-2]
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>Whoops. We&apos;ve got 1.5 <em>wide</em> keycaps, but we need a 1.5 <em>tall</em> keycap here. It turns out the nice thing about working with rectangular components is that you can rotate them pretty easily. -15 degrees + 90 degrees is 75 degrees. Let&apos;s update that <code>splay</code> now.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen1-20.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="800" height="408" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen1-20.png 600w, https://flatfootfox.com/content/images/2023/04/Ergogen1-20.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-line="44-45"><code>units:
  kx: cx
  ky: cy
  px: kx + 2
  py: ky + 2
points:
  zones:
    matrix:
      key:
        padding: 1ky
        spread: 1kx
      columns:
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key.stagger: 5
        middle:
          key.stagger: 2.5
        index:
          key.stagger: -2.5
        inner:
          rows.mod.skip: true
          key.stagger: -2.5
      rows:
        mod:
        bottom:
        home:
        top:
        num:
    thumbs:
      key:
        padding: 1ky
        spread: 1kx
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        layer:
          key.splay: -15
        space:
          key:
            width: 1.5kx
            splay: 75
            shift: [2,-2]
      rows:
        cluster:
</code></pre><!--kg-card-end: html--><p>There&apos;s our completed layout! We&apos;ve gone from zero to ergonomic keyboard keyboard in under 50 lines of text. Of course, this is just one half of the keyboard. We still need to figure out where we&apos;re going to go from here.</p><h2 id="to-split-or-not-to-split">To Split or Not To Split?</h2><p>Split keyboards are popular in the ergonomic keyboard space. Since they&apos;re two separate pieces, you can pull them apart and place them wherever makes the most sense on your desk. There&apos;s a bit more complexity involved however. You need to bridge the two halves of the keyboard with a headphone-style TRRS jack or incorporate wireless capabilities into your design. Additionally, many split designs also rely on a &quot;reversible&quot; PCB design. This lets you use the same circuit board for both the left and right half of the keyboard, but introduces some complexity into routing all the traces on the board.</p><p>For simplicity&apos;s sake, I&apos;m going to stick with a single piece unibody design for this keyboard. Each half of the keyboard be a part of the same PCB, with the microcontroller resting in the middle. This will make the rest of the examples a bit easier to follow, but that means we only have a single half of our keyboard at the moment. Let&apos;s rectify that.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-24-at-10.31.42-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="1240" height="470" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-24-at-10.31.42-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Screenshot-2023-02-24-at-10.31.42-PM.png 1000w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-24-at-10.31.42-PM.png 1240w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="22-24"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space: ...
      rows:
        cluster: ...
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
</code></pre><!--kg-card-end: html--><p><em>Mirror mirror on the config, who&apos;s the fairest of them all?</em> Adding a <code>mirror</code> section immediately creates a flipped copy of your board. The <code>ref</code> and <code>distance</code> properties are used for placement. In this case, the two <code>matrix_inner_num</code> keys are 2.5 key widths apart. Everything&apos;s looking good so far, but let&apos;s see if we can make the board a bit more ergonomic. That is ostensibly why we&apos;re here after all.</p><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-24-at-10.35.39-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)" loading="lazy" width="1242" height="598" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-24-at-10.35.39-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Screenshot-2023-02-24-at-10.35.39-PM.png 1000w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-24-at-10.35.39-PM.png 1242w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0" data-start="8" data-line-offset="8" data-line="22"><code>points:
  zones:
    matrix:
      key: ...
      columns: ...
      rows: ...
    thumbs:
      key: ...
      anchor: ...
      columns:
        layer: ...
        space: ...
      rows:
        cluster: ...
  rotate: -15
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx

</code></pre><!--kg-card-end: html--><p>Adding <code>rotate: -15</code> into our points section rotates our entire keyboard by -15 degrees. Since we&apos;ve mirrored the keyboard, the other side has been rotated 15 degrees to match.</p><h2 id="end-of-part-1">End of Part 1</h2><!--kg-card-begin: html--><pre class="language-yaml line-numbers" tabindex="0"><code>units:
  # Proxy Spacing Variables
  kx: cx
  ky: cy
  # Padding Variables
  px: kx + 2
  py: ky + 2
points:
  zones:
    # The primary 6x4 key matrix, plus 3 modifiers.
    matrix:
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      columns:
        # Hide the first two mods and the last mod.
        # Provide a Sofle-like column stagger.
        outer:
          rows.mod.skip: true
        pinky:
          rows.mod.skip: true
        ring:
          key.stagger: 5
        middle:
          key.stagger: 2.5
        index:
          key.stagger: -2.5
        inner:
          rows.mod.skip: true
          key.stagger: -2.5
      rows:
        # Four main rows, one partial row.
        mod:
        bottom:
        home:
        top:
        num:
    # Thumb cluster for Layer and Space keys.
    thumbs:
      # Choc spacing
      key:
        padding: 1ky
        spread: 1kx
      # Place thumbs where the inner mod would go.
      anchor:
        ref: matrix_inner_mod
        shift: [2, -2]
      columns:
        # Fan thumbs out by -15 degrees.
        layer:
          key.splay: -15
        # Spacebar uses a 1.5 wide key.
        space:
          key:
            width: 1.5kx
            splay: 75
            shift: [2,-2]
      rows:
        # Thumbs only have one row.
        cluster:
  # Mirror keyboard halves with a moderate rotation.
  rotate: -15
  mirror: &amp;mirror
    ref: matrix_inner_num
    distance: 2.5kx
</code></pre><!--kg-card-end: html--><p>That does it for Part 1 of this guide! You can see now how powerful Ergogen can be for rapidly iterating on custom keyboard designs. Adding or subtracting rows is as easy as tweaking a line of text, and unit variables provide us with a flexible design we can redefine over time.</p><p>Now that we&apos;ve got the basic layout defined, stay tuned for: <a href="https://flatfootfox.com/ergogen-part2-outlines/">Let&apos;s Design A Keyboard With Ergogen v4: Outlines (Part 2)</a>.</p>]]></content:encoded></item><item><title><![CDATA[Let's Design A Keyboard With Ergogen v4: Introduction]]></title><description><![CDATA[In this new series, I walk through the process of creating an ergonomic mechanical keyboard design with the help of Ergogen v4.]]></description><link>https://flatfootfox.com/ergogen-introduction/</link><guid isPermaLink="false">6403aa121914912295540583</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sun, 02 Apr 2023 20:11:52 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-04-02-at-4.23.07-PM-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Screenshot-2023-04-02-at-4.23.07-PM-1.jpg" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction"><p>Howdy and welcome to a new series on ergonomic mechanical keyboard design! Over the course of the next few articles, I&apos;m going to walk through the process of creating an ergonomic keyboard design from scratch using the <a href="https://github.com/ergogen/ergogen">Ergogen</a> keyboard layout generator. The end result will be a PCB design file we can finish in KiCAD before sending off to a PCB fabricator.</p><p><a href="https://github.com/ergogen/ergogen">Ergogen</a> is a one of those passion project that has really grow into its own. It began as a tool to aid D&#xE9;nes B&#xE1;n in the development of his <a href="https://zealot.hu/absolem/">Absolem</a> keyboard. After aiding B&#xE1;n in the creation of <em>one</em> specific keyboard, but he suddenly <a href="https://kbd.news/Declarative-keyboard-design-with-Ergogen-v4.0-1814.html">found himself</a> in possession of a tool that could allow anyone to create <em>any</em> keyboard layout. Over the course of the next three years, Ergogen has evolved from an opinionated set of scripts for one user to a project with a dedicated following.</p><p>The keyboard designed in this series will be the second full keyboard I&apos;ve created in Ergogen. I&apos;m by no means as prolific as a <a href="https://www.youtube.com/@BenVallack">Ben Vallack</a> in this space, but I enjoyed the process of creating <a href="https://flatfootfox.com/the-chonkv-keyboard">my first keyboard</a> enough to put a bit of extra work in when it came to documenting the creation of this next one. This is by no means meant to be a set of comprehensive documentation for Ergogen, and is instead designed primarily to give readers a basic understanding of what the tool&apos;s like to use.</p><p>I have been planning writing this set of articles for a while now. Ergogen&apos;s a nice piece of software to work with, but it can have something of a rocky onboarding process. Depending on what you&apos;re looking to do, you often need to reference the tool&apos;s <a href="https://docs.ergogen.xyz">documentation</a>, various <a href="https://www.youtube.com/watch?v=M_VuXVErD6E">YouTube guides</a>, and an assortment of best-practice GitHub repos. I&apos;m still carrying a torch for long form written how-tos, but what really lit a fire under me was the release of Ergogen v4.</p><p>Ergogen v4 made <a href="https://kbd.news/Declarative-keyboard-design-with-Ergogen-v4.0-1814.html">several breaking changes</a> to Ergogen&apos;s syntax. Now in addition to piecing together the required info, you also need to parse those pieces through the <a href="https://github.com/tsteffek/Ergogen-V4-Migration-Guide">v4 migration guide</a>. It&apos;s <em>a lot</em>, and I know I would have appreciated an end-to-end example when getting started with Ergogen.</p><p>So here you go.</p><h2 id="a-bit-of-background">A Bit Of Background</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Sofle-Angle-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="1000" height="750" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Sofle-Angle-1.png 600w, https://flatfootfox.com/content/images/2023/03/Sofle-Angle-1.png 1000w" sizes="(min-width: 720px) 720px"></figure><p>Let&apos;s back up for a second. This series is a design guide for how to create your own custom ergonomic mechanical keyboard. If you&apos;re not quite sure what those are, I recommend taking a look at my review of the <a href="https://flatfootfox.com/a-review-of-the-sofle-choc/">Sofle Choc keyboar</a>d. The review is ostencibly about one specific keyboard, but the writeup ballooned in scope and the first half serves as a general zero-to-ergonomic-mechanical-keyboards introduction.</p><p>Most importantly, it covered many of the aspects that seperate standard mechanical keyboards from their &quot;ergonomic&quot; counterparts. Ergogen is an opinionated tool, and it&apos;s designed primarily to create ergonomic &quot;column stagger&quot; layouts. That is to say, keyboards where all of the keys in a particular column (<code>1</code>-<code>Q</code>-<code>A</code>-<code>Z</code>, etc.) are aligned together in a straight line. You can technically force Ergogen to do a classic row stagger, but it&apos;s not what it was built for and other tools may be better suited for traditional keyboard layouts.</p><p>So if some of the terms used in this guide seem a bit confusing, I highly recommend going back and checking out that <a href="https://flatfootfox.com/a-review-of-the-sofle-choc/">Sofle Choc review</a>. Additionally, <a href="https://www.reddit.com/r/ErgoMechKeyboards/">/r/ergomechkeyboards</a> is a good resource to discover what&apos;s going on in this particular niche of clacky keyboards. Like most things in 2023, Ergogen also has an active <a href="https://discord.gg/DbCfZfZ">Discord</a> for specific questions.</p><h2 id="so-what-is-ergogen">So What Is Ergogen?</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-8.56.29-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="911" height="389" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-27-at-8.56.29-AM.png 600w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-8.56.29-AM.png 911w" sizes="(min-width: 720px) 720px"></figure><p>Whoops. I probably should have explained that earlier. Ergogen, as per it&apos;s <a href="https://github.com/ergogen/ergogen">Github page</a>, &quot;aims to provide a common configuration format to describe ergonomic 2D layouts and generate automatic plates, cases, as well as un-routed PCBs for them.&quot; In it&apos;s most simple form, Ergogen is a set of scripts designed to turn text files into keyboard design files. You give it a config file describing a keyboard, and it will output a trace-less PCB file and some .dxf / .stl files you can use to get started when creating a case. Ergogen is designed to get you out of graphical CAD tools and fiddly alignment controls, letting you focus on parametrically defining a keyboard layout down to the last millimeter.</p><p>Ergogen config files are based on YAML. For the uninitiated, YAML is a data-serialization language designed to allow actual human beings to author structured data without having to spend too much time fussing around with brackets and quotation marks. (You may know it as &quot;<em>Yet Another Markup Language</em>&quot;, although they&apos;ve recently pivoted to &quot;<em>YAML Ain&apos;t Markup Language</em>&quot; to emphasize its focused on structuring data instead of documents.) If you have familiarity with formats like JSON, you should feel right at home with YAML. Just know that in lieu of brackets, YAML uses indentation to indicate grouped blocks of data. If you start getting errors, make sure to double check your tabs or spaces.</p><p>Once you have your Ergogen .yaml file ready to go, you need some way to process it. Ergogen is a NodeJS based project, which means it&apos;s fairly straightforward to get it running locally on your machine. Once you have Node installed, you just need to run the Node Package Manger&apos;s install scrip on your local command line with <code>npm i -g ergogen</code>. After that point, you can parse your local Ergogen file with <code>ergogen input.yaml -o output_folder</code>.</p><p>If you don&apos;t have Node installed or are generally weary of command lines, there&apos;s also a web-based version of Ergogen. This site lets you paste in an Ergogen config file and then download the generated outputs right from your browser. Ergogen community member Cache and Ceoloide have done an excellent job of adding live previews to <a href="https://ergogen.xyz">ergogen.xyz</a>, letting you quickly itterate through layouts during the early parts of your design process. This site has been updated to Ergogen v4, so even longtime Ergogen enthusiasts are starting to make the pivot to the new syntax changes.</p><blockquote>Update: Ceoloide&apos;s done an incredible job of updating the web based version of Ergogen. It now features the ability to import external footprints, KiCAD previews, Github integration, and more. Previous versions of this guide referenced the <a href="https://ergogen.ceoloide.com/">ergogen.ceoloide.com</a> version of the site, but all of his changes have been rolled back into the official <a href="https://ergogen.xyz/">ergogen.xyz</a> site.</blockquote><h2 id="the-anatomy-of-an-ergogen-config">The Anatomy of an Ergogen Config</h2><p>Creating a new Ergogen config is as simple as opening <a href="https://ergogen.xyz">ergogen.xyz</a> and clearing the text on the left side of the screen. You can also open up your favorite text editor and create <code>your-keyboard-name.yaml</code>. (It&apos;s alright, I can give you a minute to think a good name for your new board.) Even if you&apos;re going to use the web versions, it&apos;s a good idea to save your files offline when you&apos;re done tweaking it. The web page will try to keep your edits stored locall in your browser, but you never want to lose hours of work if something goes wrong.</p><p>Ergogen has five primary sections:</p><h3 id="units-covered-in-part-1">Units (Covered in <a href="https://flatfootfox.com/ergogen-part1-units-points/">Part 1</a>)</h3><p>This is a short section of your Ergogen config where you can define custom units. If you find yourself constantly using the same numbers over and over in your config, this is where you can assign a variable to them.</p><h3 id="points-covered-in-part-1">Points (Covered in <a href="https://flatfootfox.com/ergogen-part1-units-points/">Part 1</a>)</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-9.24.58-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="1466" height="726" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-27-at-9.24.58-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-27-at-9.24.58-AM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-9.24.58-AM.png 1466w" sizes="(min-width: 720px) 720px"><figcaption>Points define the overall layout of the keyboard.</figcaption></figure><p>Points is where the real magic happens. A &quot;Point&quot; in Ergogen is the [x,y] position of a single key. So the &quot;Points&quot; section is the place where you actually get to define the custom layout of your keyboard. Rather than having to set an explicit [x,y] position for every key on your board, Ergogen has custom definitions for quickly creating entire columns, rows, and thumb clusters.</p><p>Points themselves aren&apos;t saved as an Ergogen export, but are used as references for the next few sections.</p><h3 id="outlines-covered-in-part-2">Outlines (Covered in <a href="https://flatfootfox.com/ergogen-part2-outlines/">Part 2</a>)</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-9.25.25-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="1464" height="744" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-27-at-9.25.25-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-27-at-9.25.25-AM.png 1000w, https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-9.25.25-AM.png 1464w" sizes="(min-width: 720px) 720px"><figcaption>Outlines provide a border for the keyboard.</figcaption></figure><p>The Outline section allows users to define the shape of their keyboard. This is done by creating a variety of vector shape definitions. These outlines can reference the points we created earlier, so it&apos;s simple to define a shape such as, &quot;Draw a border around all my keys with a 3mm padding on each edge.&quot; The outlines defined in this section can be referenced later on by both the PCBs and Cases sections.</p><p>Outlines can also be exported by Ergogen as .dxf files that can be use in graphics or CAD applications.</p><h3 id="pcbs-covered-in-part-3">PCBs (Covered in <a href="https://flatfootfox.com/ergogen-part3-pcbs/">Part 3</a>)</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/03/Screenshot-2023-03-27-at-9.26.44-AM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="2000" height="1013" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Screenshot-2023-03-27-at-9.26.44-AM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Screenshot-2023-03-27-at-9.26.44-AM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Screenshot-2023-03-27-at-9.26.44-AM.png 1600w, https://flatfootfox.com/content/images/size/w2400/2023/03/Screenshot-2023-03-27-at-9.26.44-AM.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Ergogen&apos;s output is an unrouted KiCAD PCB with footprints for all the required parts.</figcaption></figure><p>If Points are where the magic happens, PCBs are the star of the show. Creating a circuit board we can send off for manufacturing is the whole reason we&apos;re here after all. The PCB section has a few different things going on. First of all, you need to import an outline to give shape to the new PCB. Next you need to assign a variety of component footprints. The Points section defines where each key should go, but we still need to specify what sort of key switch footprint we need on the board. This is also where we can add component definitions and footprints for other parts like the microcontroller and its reset button. Finally, we&apos;ll need to define the &quot;Nets&quot; for our components. These are definitions used by the PCB to indicate that Key A needs to connect to Pin B.</p><p>PCBs are exported by Ergogen as a KiCAD PCB file. KiCAD typically uses a &quot;Project&quot; structure to organize files. These projects will often include a schematic file defining how components are designed to connect in addition to the PCB file. Since Ergogen has already handled defining these nets, it foregoes the project file and the schematic and only exports the KiCAD PCB file.</p><h3 id="cases-covered-in-part-4">Cases (Covered in <a href="https://flatfootfox.com/ergogen-part4-footprints-cases/">Part 4</a>)</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/Ergogen-Case-1.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="2000" height="781" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Ergogen-Case-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Ergogen-Case-1.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/04/Ergogen-Case-1.png 1600w, https://flatfootfox.com/content/images/2023/04/Ergogen-Case-1.png 2189w" sizes="(min-width: 720px) 720px"><figcaption>Ergogen makes it easy to throw together a quick case.</figcaption></figure><p>This last section is entirely optional. Many custom keyboard designs will rely on a bare PCB and apply rubber bumpers directly to the bottom of the circuit board. If you have access to a 3D printer though, it can be nice to add a bit of color and stability to your design. The Cases section allows you to add depth to any of your outlines. You simply define how tall you want the piece to be, and Ergogen will create the associated 3D model.</p><p>There are some basic operations for adding and subtract case parts from one another. For example, you can define the bottom plate of your case, define several screw holes, and then subtract the screw hole portions from the bottom plate.</p><p>Ergogen v3 previously exported cases files in the .stl lingua franca format of 3D printing. Due to some technical issues with the .stl file creation library, v4 is currently exporting cases as .jscad files. If you&apos;d like to convert these into .stl files, you can use sites like <a href="https://openjscad.xyz/">openjscad.xyz</a> or their <a href="https://www.npmjs.com/package/@jscad/cli">NPM package</a>.</p><h3 id="what-ergogen-doesnt-do-for-you-covered-in-the-finale">What Ergogen Doesn&apos;t Do For You (Covered in the <a href="https://flatfootfox.com/ergogen-part5-kicad-firmware-assembly/">Finale</a>)</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.27.39-PM.png" class="kg-image" alt="Let&apos;s Design A Keyboard With Ergogen v4: Introduction" loading="lazy" width="1146" height="726" srcset="https://flatfootfox.com/content/images/size/w600/2023/04/Screenshot-2023-04-16-at-12.27.39-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/04/Screenshot-2023-04-16-at-12.27.39-PM.png 1000w, https://flatfootfox.com/content/images/2023/04/Screenshot-2023-04-16-at-12.27.39-PM.png 1146w" sizes="(min-width: 720px) 720px"><figcaption>The finished PCB after routing in KiCAD.</figcaption></figure><p>At the end of this process, you&apos;ll have an <em>unrouted</em> PCB file. If you&apos;ve never made a PCB before, routing is the process of drawing traces to connect two points on a circuit board. All those lines criss-crossing a PCB are physical electrical wires. Most importantly, they can&apos;t overlap or cross one another.</p><p>For geeks who typical work in code, the realities of physics placing limitations on one&apos;s project is a jarring discovery. Automatic routing tools exist, but they often come with their own issues or are part of paid CAD software. Connecting all of the components on one&apos;s keyboard is like trying to solve a hundred wandering salesmen problems on something slightly larger than an index card.</p><p>After Ergogen&apos;s done its work, you&apos;ll need to roll up your sleeves and start routing your circuit board in KiCAD. KiCAD is a capable piece of open source CAD software, but it&apos;s not without its own learning curve. If you used some early versions of <a href="https://www.gimp.org">GIMP</a> or <a href="https://inkscape.org">Inkscape</a>, you&apos;ll have a rough idea for the sort of UI you&apos;re in for.</p><p>Once you&apos;ve finished routing your board, you can send it off to a PCB fabrication service. KiCAD supports exporting to the industry standard Gerber file format, so you shouldn&apos;t have any trouble getting your new keyboard manufactured. Unless you really shell out for express shipping it will take about two weeks for you to receive your new PCBs. That time is in line with many keyboard part sellers, so you can order all the switches, microcontrollers, and keycaps you need at this time.</p><p>The last step is creating a keyboard firmware for your new board. The <a href="http://qmk.fm">QMK</a> and <a href="http://zmk.dev">ZMK</a> open source keyboard firmwares use the same column and row matrix approach as Ergogen so it shouldn&apos;t be too difficult to get your new firmware created. There&apos;s plenty of existing configurations to reference, and you&apos;ve got plenty of time to tackle the firmware while your PCBs are waiting to arrive.</p><h2 id="what-ill-be-building-in-this-guide">What I&apos;ll Be Building In This Guide</h2><p>Good artists borrow, and great artists steal. In this guide, I&apos;m going to be creating a keyboard loosely based off <a href="https://josefadamcik.github.io/SofleKeyboard/">Josef Adam&#x10D;&#xED;k&apos;s Sofle keyboard</a>. It&apos;s a 6x4+5 column staggered layout that I&apos;ve grown quite fond of, and should be a useful layout to mimic when showing off Ergogen&apos;s features. While the Sofle Choc offers a Choc switch compatible version of this keyboard, there isn&apos;t a Choc <em>spaced</em> version of the Sofle yet. So this guide&apos;s a totally selfish excuse for me to recreate this board with Choc spacing and claim it was for site content. (Update: Adam&#x10D;&#xED;k&apos;s working on a <a href="https://josef-adamcik.cz/electronics/sofle-unsplit-stana-keyboard.html">unibody Choc-spaced Sofle variant</a> now!)</p><p>Now that you know what we&apos;ll be tackling, let&apos;s hop into Ergogen and get started. I&apos;ll see you over in <a href="https://flatfootfox.com/ergogen-part1-units-points/">Let&apos;s Design A Keyboard With Ergogen v4: Units &amp; Points (Part 1)</a>.</p>]]></content:encoded></item><item><title><![CDATA[The ChonkV Keyboard]]></title><description><![CDATA[<p>The ChonkV is a 58-key Choc keyboard based off Brickbot&apos;s excellent <a href="https://github.com/brickbots/chocV">chocV</a> keyboard. It adds a number row, an additional outer column, and thumb keys in the style of the <a href="https://shop.keyboard.io/products/keyboardio-atreus">Atreus</a> keyboard.</p><p>This keyboard was designed largely as a way of learning the <a href="https://docs.ergogen.xyz/">Ergogen</a> keyboard layout generator software.</p>]]></description><link>https://flatfootfox.com/the-chonkv-keyboard/</link><guid isPermaLink="false">64234929191491229554118d</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Wed, 29 Mar 2023 15:47:12 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/03/ChonkVPlaydate.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/03/ChonkVPlaydate.jpg" alt="The ChonkV Keyboard"><p>The ChonkV is a 58-key Choc keyboard based off Brickbot&apos;s excellent <a href="https://github.com/brickbots/chocV">chocV</a> keyboard. It adds a number row, an additional outer column, and thumb keys in the style of the <a href="https://shop.keyboard.io/products/keyboardio-atreus">Atreus</a> keyboard.</p><p>This keyboard was designed largely as a way of learning the <a href="https://docs.ergogen.xyz/">Ergogen</a> keyboard layout generator software. I was pretty happy with my previous keyboard, the split Sofle Choc, but this new keyboard design allowed me to test a variety of concepts I&apos;d been curious about experimenting with. The ChonkV has the same 58 key count as the Sofle Choc, but its unibody design makes it a bit more portable. This board also has true Choc spacing, and is my first time working with the Nice!Nano wireless microcontroller. While it&apos;s not a true ortholinear block, this is my first time dabbling with a board that drops the usual column stagger.</p><p>There&apos;s a few existing board designs that also may have checked these boxes. The keyboard community has putting out several interesting <a href="https://reviung.com/build-guide/391/">Reviung</a> variants, and the Atreus also comes close to this design. I&apos;ve always liked the look of the chocV however, and wanted to try my own spin at the design. This board&apos;s not nearly as smol, but I like it. It&apos;s chonky. It&apos;s a chonky chocV. The <a href="https://github.com/ImStuBTW/chonkv">ChonkV</a>.</p><h2 id="features">Features</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/ChonkVCloseUp.jpeg" class="kg-image" alt="The ChonkV Keyboard" loading="lazy" width="1663" height="1247" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/ChonkVCloseUp.jpeg 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/ChonkVCloseUp.jpeg 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/ChonkVCloseUp.jpeg 1600w, https://flatfootfox.com/content/images/2023/03/ChonkVCloseUp.jpeg 1663w" sizes="(min-width: 720px) 720px"></figure><ul><li>58 key layout featuring number rows, outer columns, three modifiers on each side of the keyboard, raise and lower keys, and Atreus-style thumb keys for enter and space.</li><li>Kailh Choc v1 Switches.</li><li>Supports through-hole switch sholdering or Kailh Choc hotswap sockets.</li><li>Choc switch spacing. (Has been bested with MBK keycaps.)</li><li>Designed for the Nice!Nano wireless Microcontroller.</li><li>Also supports the Nice!View display. (Nice!View requires an additional wire to be run from the display&apos;s CS pin to one of the Nice!Nano&apos;s extra internal pins.)</li><li>JST battery connector.</li><li>RST pushbutton.</li><li>Physical power switch.</li><li>Includes designs for a Horizon/ChocV style PCB backplate as well as a more traditional 3D printed case.</li></ul><h2 id="ergogen-files">Ergogen Files</h2><p><em>Just an FYI for those looking to use this as a reference to learn Ergogen. This library leverages Ergogen 3, and several custom footprints that can be found in <a href="https://github.com/ImStuBTW/ergogen">my fork repo</a>. Ergogen 4 made several breaking changes to the syntax in December of 2022, so make sure you check which version you&apos;re using if you reference these config files for your own project.</em></p><h3 id="chonkvyaml">chonkv.yaml</h3><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/KiCAD-View.png" class="kg-image" alt="The ChonkV Keyboard" loading="lazy" width="2000" height="845" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/KiCAD-View.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/KiCAD-View.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/KiCAD-View.png 1600w, https://flatfootfox.com/content/images/size/w2400/2023/03/KiCAD-View.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>This is the main file for the ChonkV PCB. It is designed with choc spacing, and has a 3mm padding around the edge of the keyboard. The microcontroller is mounted in the middle of the keyboard, along with a reset button and JST header. There&apos;s a small bit of PCB art by the thumbs. Running this config file through Ergogen will generate the ChonkV PCB, the board&apos;s outlines, as well as some 3D printing .stl case files.</p><h3 id="chonkvcaseyaml">chonkv_case.yaml</h3><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Simple-Case.png" class="kg-image" alt="The ChonkV Keyboard" loading="lazy" width="2000" height="699" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Simple-Case.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Simple-Case.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Simple-Case.png 1600w, https://flatfootfox.com/content/images/size/w2400/2023/03/Simple-Case.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>This file was used in the creation of a fairly straightforward keycoard case. It uses 2M standoffs to support the PCB, and gives it a small border outside of the premiter. This config file is seperate from the main chonkv.yaml due to Ergogen limitations on &quot;glue&quot; outlines. It creates an outline that is a few mm larger than the main PCB file.</p><p>Unfortunately, since this case design is split between chonkv.yaml and chonkv_case.yaml, Ergogen can&apos;t put together all the finished pieces for us. You&apos;ll need to import them into some CAD software like TinkerCAD to get the final design output. Or you can just download it from this repo of course.</p><p>One thing you may notice is that the whole for the standoffs goes all the way through the 3D model. This is supposed to be a low profile case, so the metal standoffs are designed to sit flush with the bottom of the case.</p><h3 id="chonkvbackplateyaml">chonkv_backplate.yaml</h3><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/Complex-Case.png" class="kg-image" alt="The ChonkV Keyboard" loading="lazy" width="2000" height="700" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/Complex-Case.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/Complex-Case.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/Complex-Case.png 1600w, https://flatfootfox.com/content/images/size/w2400/2023/03/Complex-Case.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>This was a largely failed experiment. The original chocV keyboard included designs for a second inert PCB that would screw onto the bottom of the main PCB to give the board some extra stability and shiled the exposed metal legs of the soldered components. I was always fond of this design, but it was limited to through-hole designs. I came up with some choc hotswap footprints with a cutout for the hotswap sockets, but the resulting cuts were large, complex, and covered most of the board. I haven&apos;t tried submitting them to a PCB fab, but I assume they&apos;d try to include an extra charge this backplate. On top of that, the hotswap sockets stick out about 2mm on the bottom of a board, and most PCBs are about 1.8mm thick. I&apos;d like to itterate on this concept some day (or just commit to a through-hole design), but I&apos;m tabling this concept for now.</p><p>The backplate design wasn&apos;t a complete waste however. I was able to include the backplate design in the 3D printed case I created with chonkv_case.yaml, so the resulting 3D printed case is now a bit more sturdy and less echoy.</p><h2 id="finished-files">Finished Files</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/PCB-Render.png" class="kg-image" alt="The ChonkV Keyboard" loading="lazy" width="2000" height="847" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/PCB-Render.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/PCB-Render.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/PCB-Render.png 1600w, https://flatfootfox.com/content/images/size/w2400/2023/03/PCB-Render.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>If you don&apos;t want to go through the build process yourself, you can always download the files found in <a href="https://github.com/ImStuBTW/chonkv">the &quot;outputs&quot; folder on GitHub</a>. It has a zipped Gerbers file, the complex case .stl, and a simplified case .stl. The .stl files have been split into left and right halves in case you have a 3D printer with a smaller print volume.</p><h2 id="build-of-materials">Build of Materials</h2><figure class="kg-card kg-image-card"><img src="https://flatfootfox.com/content/images/2023/03/ChonkVNoCaps.jpeg" class="kg-image" alt="The ChonkV Keyboard" loading="lazy" width="1663" height="1247" srcset="https://flatfootfox.com/content/images/size/w600/2023/03/ChonkVNoCaps.jpeg 600w, https://flatfootfox.com/content/images/size/w1000/2023/03/ChonkVNoCaps.jpeg 1000w, https://flatfootfox.com/content/images/size/w1600/2023/03/ChonkVNoCaps.jpeg 1600w, https://flatfootfox.com/content/images/2023/03/ChonkVNoCaps.jpeg 1663w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><table class="post-table" style="margin-top: 16px;">
<tr class="post-table-header">
<th style="border-top-right-radius: 0px;">Part</th>
<th>Amount</th>
<th style="border-top-right-radius: 16px;">Price (Total)</th>
</tr>
<tr>
<td><a href="https://jlcpcb.com">ChonkV PCB Fab Via JLCPCB (With Shipping)</a></td>
<td>1</td>
<td>$28.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/controllers/nice-nano-v2-wireless-controller/">Nice!Nano Microcontroller</a></td>
<td>1</td>
<td>$22.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/niceview-power-efficient-lcd-display/">Nice!View Sharp Memory Display</a></td>
<td>1</td>
<td>$19.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/switches/choc/kailh-choc-low-profile-switches/">Kailh Choc v2 Switches</a></td>
<td>6 (58 Keys Total)</td>
<td>$30.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/1n4148-diodes-through-hole-smd/">1N4148 Diodes (SMD)</a></td>
<td>6 (58 Diodes Total)</td>
<td>$2.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/kailh-choc-hot-swap-sockets/">Kailh Choc Hotswap Sockets</a></td>
<td>6 (58 Sockets Total)</td>
<td>$10.00 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/power-switch/">Power Switch</a></td>
<td>1</td>
<td>$0.50 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/reset-switch/">Reset Switch (6x3mm, THD)</a></td>
<td>1</td>
<td>$0.50 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/mill-max-315-sockets-3320-pins-for-pro-micro/">Mill Max Sockets &amp; Pins</a></td>
<td>1</td>
<td>$7.50 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/microcontroller-socket-medium-profile/">Medium Profile Controller Socket</a></td>
<td>1</td>
<td>$0.50 USD</td>
</tr>
<tr>
<td><a href="https://42keebs.eu/shop/parts/components/mill-max-315-sockets-3320-pins-for-pro-micro/">Additional Mill Max Pins (For Nice!View)</a></td>
<td>1</td>
<td>$3.50 USD</td>
</tr>
<tr>
<td><a href="https://www.aliexpress.us/item/2251832866999242.html">JST Header (2P)</a></td>
<td>1</td>
<td>$4.00 USD</td>
</tr>
<tr>
<td><a href="https://mkultra.click/mbk-legend-keycaps/">Choc v1 Keycaps</a></td>
<td>1</td>
<td>$75.00 USD</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B0137KTPP0">100 mAh LiPo Battery (Left Pos.) LP401230</a></td>
<td>1</td>
<td>$12.00 USD</td>
</tr>

</table><!--kg-card-end: html--><p>You may be able to get some of the parts cheaper (or at least in bulk) on <a href="https://www.aliexpress.us/">Aliexpress</a>. <a href="https://42keebs.eu">42Keebs</a> has good prices on the <a href="https://nicekeyboards.com/nice-nano/">Nice!Nano</a> and the <a href="https://nicekeyboards.com/nice-view/">Nice!View</a>, and you can pick up a lot of other parts while you&apos;re at it. Batteries you&apos;ll need to get domestically, and keycap avalability is subject to change. You should be able to build this keyboard for about $225 USD, give or take some shipping costs.</p>]]></content:encoded></item><item><title><![CDATA[How To Mimic QMK’s CG_TOGG or AG_TOGG OS Key Switching Behavior In ZMK]]></title><description><![CDATA[ZMK doesn't have a built in feature to allow it to swap keyboard modifier mappings, but we can fake it with some creative uses of layers.]]></description><link>https://flatfootfox.com/how-to-mimic-qmks-cg_togg-or-ag_togg-os-key-switching-behavior-in-zmk/</link><guid isPermaLink="false">63f503827a20c14ec07fef48</guid><category><![CDATA[DIY Project]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sun, 12 Mar 2023 21:31:00 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/ChonkVMods-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/ChonkVMods-2.jpg" alt="How To Mimic QMK&#x2019;s CG_TOGG or AG_TOGG OS Key Switching Behavior In ZMK"><p>Custom mechanical keyboards have long been split into two camps: Wired keyboards running the open source QMK firmware, and closed source Bluetooth keyboards running a proprietary firmware. Bluetooth support introduces all sorts of messy power requirements, licensing issues, and other technical overhead that historically hasn&#x2019;t meshed well with the barebones Arduino Pro Micro / ATmega32U4 infrastructure that powers the vast majority of QMK keyboards. There were always high-powered alternatives like the ESP32 microcontroller, but none of them really made inroads into the hobbyist keyboard space.</p><p>That is until the <a href="https://nicekeyboards.com/nice-nano">Nice!Nano</a> burst onto the scene. It features a Nordic nRF52840 microcontroller with native Bluetooth support, and is low power enough to work in wireless keyboard contexts. The Nice!Nano shares a footprint with the Arduino Pro Micro, meaning it can be used by many of the existing DIY keyboard PCBs.</p><p>The one thing it couldn&#x2019;t take advantage of however is <a href="http://qmk.fm">QMK</a>. The popular open source keyboard firmware does not have support for wireless connectivity, and most likely won&apos;t be adding it in the future due to a variety of architectural and licensing issues.. This has left wireless enthusiasts to turn to the alternative open source <a href="https://zmk.dev">ZMK</a> keyboard firmware. ZMK was built from the ground up with wireless support in mind, and philosophically very similar to QMK. It&#x2019;s still a relatively new project however, so not every QMK feature has a direct ZMK equivalent.</p><p>If you use a ZMK keyboard on multiple operating systems, one such gap you may have run into is the ability to quickly switch your keyboard&apos;s hotkeys to match your operating system&apos;s paradigm.</p><h2 id="os-hotkey-differences">OS Hotkey Differences</h2><p>When Apple and IBM originally designed the keyboards for their systems, they made slightly different decisions when it came to the nomenclature and layout of keyboard modifier keys. IBM (and later every Window-based system) would use <code>Control</code>, <code>Windows</code>, and <code>Alt</code>, while Apple settled on <code>Control</code>, <code>Option</code>, and <code>Command</code>. These keys all send the same codes to the computer, Apple just swaps <code>Alt</code> for <code>Opt</code>, and <code>Win</code> for <code>Cmd</code>. In operating system agnostic instances (or when chatting with Linux folks), <code>Win</code> will sometimes be substituted for <code>GUI</code> or <code>Super</code>.</p><p>Besides the names, there&apos;s two small differences between systems. Windows machines order their modifier keys <code>Ctrl</code>, <code>Win</code>, <code>Alt</code>, while Macs order their keys <code>Ctrl</code>, <code>Opt</code>, <code>Cmd</code>. This isn&apos;t just a slight rejiggering of lesser-used commands either. On Windows machines, <code>Ctrl</code> is the primary hotkey for most common system tasks. On Macs, it&apos;s the <code>Cmd</code> key. So &quot;Undo&quot; on a Windows PC is <code>Ctrl+Z</code>, while on a Mac it&apos;s <code>Cmd+Z</code>.</p><p>Windows users rely on their pinkies for most shortcuts, while Mac users rely on their thumbs. Using Windows (somehow) on a MacBook keyboard is a non-issue, but trying to use MacOS on a Windows keyboard is a <em>terrible</em> experience. The muscle memory for all of your basic hotkeys is broken, and your thumb needs to make an awkward stretch over to the Windows key. It&apos;s not a great time.</p><p>To rectify this, most keyboard manufactures include some sort of software option or toggle switch which remaps the position of <code>Win</code> and <code>Alt</code> on keyboards. This is generally a great solution, although Windows users will inevitably mix up <code>Cmd</code> and <code>Opt</code> on the rare time they need to use <code>Alt</code> or <code>Win</code> on a Mac-style keyboard.</p><p>On ergonomic keyboards like the Sofle Choc I recently reviewed, you&apos;ll often find a slightly different situation. These keyboards will typically try to locate several useful modifier keys around the natural resting place for their thumb. If you&apos;re on Windows, you set it to <code>Ctrl</code>. If you&apos;re on MacOS, you set it to <code>Cmd</code>. If you&apos;re regularly switching between different operating systems, it&apos;s vital that you have some way of changing the modifier triggered by these thumb keys. </p><h2 id="os-hotkey-switching-in-qmk">OS Hotkey Switching in QMK</h2><p>QMK offers exactly this sort of hotkey-switching functionality. Both QMK and ZMK allow users to completely customize their keyboard&apos;s layout. If you know you&#x2019;re going to be spending all of your time on one operating system, you can simply flash a Windows or MacOS style layout to your keyboard. If you&#x2019;re regularly working with multiple operating systems on the same keyboard however, you need some way of toggling your modifier layout. QMK of course solves this through, what else, a hotkey.</p><p>QMK has a set of what it calls &#x201C;Magic Keycodes&#x201D; that can alter the current state of a keyboard&#x2019;s setup. The <code>MAGIC_TOGGLE_ALT_GUI</code> (<code>AG_TOGG</code>) keycode switches the position of <code>Alt</code> and <code>Win/Cmd</code>. Meanwhile, the <code>MAGIC_TOGGLE_CTL_GUI</code> (<code>CG_TOGG</code>) keycode switches the position of <code>Ctrl</code> and <code>Win/Cmd</code> for ergonomic keyboards. Once you&apos;ve assigned these keycodes to a key on your keyboard (or assigned it to a hotkey combination on a layer), all you need to do is tap the key and it will seamlessly toggle between these two behaviors.</p><p>These magic keycodes also come in &#x201C;Swap&#x201D; and &#x201C;Unswap&#x201D; varieties. Instead of toggling back and forth, these commands allow you to create dedicated &#x201C;MacOS&#x201D; or &#x201C;Windows&#x201D; hotkeys on your keyboard. The toggle behavior is usually enough for basic setups, by the swap and unswap behaviors can be useful for including in macros.</p><p>Overall it&#x2019;s a nice straightforward piece of functionality. If you&#x2019;re swapping systems frequently, working with cross-OS virtual machines, or using a KVM, these magic keycodes help keep your keyboard in line with your operating system. If your keyboard has a display, you can even reference its current state on the display.</p><h2 id="os-hotkey-switching-in-zmk">OS Hotkey Switching in ZMK</h2><p>ZMK currently does not have any out of the box support for hotkey switching. Thankfully it&#x2019;s fairly easy to fake QMK&#x2019;s magic keycode toggle behavior. What we&#x2019;d like to do is be able to have the keyboard provide one set of modifier behavior, tap a single keycode, and then have the keyboard exhibit a different set of modifier behavior from that point forward. We can accomplish this by getting a little creative with layers.</p><figure class="kg-card kg-code-card"><pre><code class="language-c">keymap {
  compatible = &quot;zmk,keymap&quot;;

  default_layer {
    bindings = &lt;
      &amp;kp GRAVE &amp;kp N1 &amp;kp N2    &amp;kp N3   &amp;kp N4   &amp;kp N5                   &amp;kp N6 &amp;kp N7   &amp;kp N8    &amp;kp N9    &amp;kp N0   &amp;kp MINUS
      &amp;kp ESC   &amp;kp Q  &amp;kp W     &amp;kp E    &amp;kp R    &amp;kp T                    &amp;kp Y  &amp;kp U    &amp;kp I     &amp;kp O     &amp;kp P    &amp;kp BSPC
      &amp;kp TAB   &amp;kp A  &amp;kp S     &amp;kp D    &amp;kp F    &amp;kp G                    &amp;kp H  &amp;kp J    &amp;kp K     &amp;kp L     &amp;kp SEMI &amp;kp SQT
      &amp;kp LSHFT &amp;kp Z  &amp;kp X     &amp;kp C    &amp;kp V    &amp;kp B                    &amp;kp N  &amp;kp M    &amp;kp COMMA &amp;kp DOT   &amp;kp FSLH &amp;kp RSHFT
                       &amp;kp LCTRL  &amp;kp LALT &amp;kp LGUI &amp;mo 1  &amp;kp RET &amp;kp SPACE &amp;mo 2  &amp;kp RGUI &amp;kp RALT  &amp;kp RCTRL
    &gt;;
  };

  lower_layer {
    bindings = &lt;
      &amp;trans &amp;kp F1    &amp;kp F2    &amp;kp F3      &amp;kp F4   &amp;kp F5                 &amp;kp F6    &amp;kp F7   &amp;kp F8    &amp;kp F9    &amp;kp F10  &amp;kp F11
      &amp;trans &amp;kp N1    &amp;kp N2    &amp;kp N3      &amp;kp N4   &amp;kp N5                 &amp;kp N6    &amp;kp N7   &amp;kp N8    &amp;kp N9    &amp;kp N0   &amp;kp F12
      &amp;trans &amp;kp EXCL  &amp;kp AT    &amp;kp HASH    &amp;kp DLLR &amp;kp PRCNT              &amp;kp CARET &amp;kp AMPS &amp;kp ASTRK &amp;kp LPAR  &amp;kp RPAR &amp;kp PIPE
      &amp;trans &amp;kp EQUAL &amp;kp MINUS &amp;kp KP_PLUS &amp;kp LBRC &amp;kp RBRC               &amp;kp LBKT  &amp;kp RBKT &amp;kp SEMI  &amp;kp COLON &amp;kp BSLH &amp;trans
                       &amp;trans    &amp;trans      &amp;trans   &amp;trans   &amp;trans &amp;trans &amp;mo 3     &amp;trans   &amp;trans    &amp;trans
    &gt;;
  };

  upper_layer {
    bindings = &lt;
      &amp;trans &amp;trans  &amp;trans    &amp;trans      &amp;trans &amp;trans                 &amp;trans    &amp;trans   &amp;trans   &amp;trans    &amp;trans &amp;trans
      &amp;trans &amp;kp INS &amp;kp PSCRN &amp;kp K_CMENU &amp;trans &amp;kp SLCK               &amp;kp PG_UP &amp;trans   &amp;kp UP   &amp;trans    &amp;trans &amp;kp DEL
      &amp;trans &amp;trans  &amp;trans    &amp;trans      &amp;trans &amp;kp CLCK               &amp;kp PG_DN &amp;kp LEFT &amp;kp DOWN &amp;kp RIGHT &amp;trans &amp;trans
      &amp;trans &amp;trans  &amp;trans    &amp;trans      &amp;trans &amp;trans                 &amp;trans    &amp;kp HOME &amp;trans   &amp;kp END   &amp;trans &amp;trans
                     &amp;trans    &amp;trans      &amp;trans &amp;mo 3    &amp;trans &amp;trans &amp;trans    &amp;trans   &amp;trans   &amp;trans
    &gt;;
  };

  mod_layer {
    bindings = &lt;
      &amp;bt BT_CLR  &amp;bt BT_SEL 0 &amp;bt BT_SEL 1 &amp;bt BT_SEL 2 &amp;bt BT_SEL 3 &amp;bt BT_SEL 4               &amp;trans &amp;trans       &amp;trans     &amp;trans       &amp;trans &amp;trans
      &amp;kp K_SLEEP &amp;mac_bt      &amp;win_bt      &amp;trans       &amp;trans       &amp;trans                     &amp;trans &amp;trans       &amp;trans     &amp;trans       &amp;trans &amp;trans
      &amp;tog 1      &amp;trans       &amp;trans       &amp;trans       &amp;trans       &amp;trans                     &amp;trans &amp;kp C_VOL_DN &amp;kp C_MUTE &amp;kp C_VOL_UP &amp;trans &amp;trans
      &amp;trans      &amp;trans       &amp;trans       &amp;trans       &amp;trans       &amp;trans                     &amp;trans &amp;kp C_PREV   &amp;kp C_PP   &amp;kp C_NEXT   &amp;trans &amp;trans
                               &amp;trans       &amp;trans       &amp;trans       &amp;trans       &amp;trans &amp;trans &amp;trans &amp;trans       &amp;trans     &amp;trans
    &gt;;
  };
};</code></pre><figcaption>A standard Mac-specific layout.</figcaption></figure><p>For this example, let&#x2019;s assume we&#x2019;ve got a fairly standard multi-layer setup. The base layer is a straightforward QWERTY layer, then the user has a Symbol layer for special characters, a Navigation layer for arrow keys, and an Adjustment layer for things like managing Bluetooth profiles.</p><p>In this example, the user has set their keyboard with a Mac-style <code>Ctrl</code>, <code>Opt</code>, <code>Cmd</code> layout by default. First, let&#x2019;s add a Windows-specific layer. Copy your base QWERTY layer and swap the <code>Ctrl</code> and <code>Cmd</code> hotkeys. </p><figure class="kg-card kg-code-card"><pre><code class="language-c">keymap {
  compatible = &quot;zmk,keymap&quot;;

  default_layer {
    bindings = &lt;
      &amp;kp GRAVE &amp;kp N1 &amp;kp N2    &amp;kp N3   &amp;kp N4   &amp;kp N5                   &amp;kp N6 &amp;kp N7   &amp;kp N8    &amp;kp N9    &amp;kp N0   &amp;kp MINUS
      &amp;kp ESC   &amp;kp Q  &amp;kp W     &amp;kp E    &amp;kp R    &amp;kp T                    &amp;kp Y  &amp;kp U    &amp;kp I     &amp;kp O     &amp;kp P    &amp;kp BSPC
      &amp;kp TAB   &amp;kp A  &amp;kp S     &amp;kp D    &amp;kp F    &amp;kp G                    &amp;kp H  &amp;kp J    &amp;kp K     &amp;kp L     &amp;kp SEMI &amp;kp SQT
      &amp;kp LSHFT &amp;kp Z  &amp;kp X     &amp;kp C    &amp;kp V    &amp;kp B                    &amp;kp N  &amp;kp M    &amp;kp COMMA &amp;kp DOT   &amp;kp FSLH &amp;kp RSHFT
                       &amp;kp LCTRL  &amp;kp LALT &amp;kp LGUI &amp;mo 2  &amp;kp RET &amp;kp SPACE &amp;mo 3  &amp;kp RGUI &amp;kp RALT  &amp;kp RCTRL
    &gt;;
  };
      
  win_layer {
    bindings = &lt;
      &amp;kp GRAVE &amp;kp N1 &amp;kp N2   &amp;kp N3   &amp;kp N4    &amp;kp N5                   &amp;kp N6 &amp;kp N7    &amp;kp N8    &amp;kp N9    &amp;kp N0   &amp;kp MINUS
      &amp;kp ESC   &amp;kp Q  &amp;kp W    &amp;kp E    &amp;kp R     &amp;kp T                    &amp;kp Y  &amp;kp U     &amp;kp I     &amp;kp O     &amp;kp P    &amp;kp BSPC
      &amp;kp TAB   &amp;kp A  &amp;kp S    &amp;kp D    &amp;kp F     &amp;kp G                    &amp;kp H  &amp;kp J     &amp;kp K     &amp;kp L     &amp;kp SEMI &amp;kp SQT
      &amp;kp LSHFT &amp;kp Z  &amp;kp X    &amp;kp C    &amp;kp V     &amp;kp B                    &amp;kp N  &amp;kp M     &amp;kp COMMA &amp;kp DOT   &amp;kp FSLH &amp;kp RSHFT
                       &amp;kp LGUI &amp;kp LALT &amp;kp LCTRL &amp;mo 2  &amp;kp RET &amp;kp SPACE &amp;mo 3  &amp;kp RCTRL &amp;kp RALT  &amp;kp RGUI
    &gt;;
  };

  lower_layer {
    bindings = &lt;
      &amp;trans &amp;kp F1    &amp;kp F2    &amp;kp F3      &amp;kp F4   &amp;kp F5                 &amp;kp F6    &amp;kp F7   &amp;kp F8    &amp;kp F9    &amp;kp F10  &amp;kp F11
      &amp;trans &amp;kp N1    &amp;kp N2    &amp;kp N3      &amp;kp N4   &amp;kp N5                 &amp;kp N6    &amp;kp N7   &amp;kp N8    &amp;kp N9    &amp;kp N0   &amp;kp F12
      &amp;trans &amp;kp EXCL  &amp;kp AT    &amp;kp HASH    &amp;kp DLLR &amp;kp PRCNT              &amp;kp CARET &amp;kp AMPS &amp;kp ASTRK &amp;kp LPAR  &amp;kp RPAR &amp;kp PIPE
      &amp;trans &amp;kp EQUAL &amp;kp MINUS &amp;kp KP_PLUS &amp;kp LBRC &amp;kp RBRC               &amp;kp LBKT  &amp;kp RBKT &amp;kp SEMI  &amp;kp COLON &amp;kp BSLH &amp;trans
                       &amp;trans    &amp;trans      &amp;trans   &amp;trans   &amp;trans &amp;trans &amp;mo 4     &amp;trans   &amp;trans    &amp;trans
    &gt;;
  };

  upper_layer {
    bindings = &lt;
      &amp;trans &amp;trans  &amp;trans    &amp;trans      &amp;trans &amp;trans                 &amp;trans    &amp;trans   &amp;trans   &amp;trans    &amp;trans &amp;trans
      &amp;trans &amp;kp INS &amp;kp PSCRN &amp;kp K_CMENU &amp;trans &amp;kp SLCK               &amp;kp PG_UP &amp;trans   &amp;kp UP   &amp;trans    &amp;trans &amp;kp DEL
      &amp;trans &amp;trans  &amp;trans    &amp;trans      &amp;trans &amp;kp CLCK               &amp;kp PG_DN &amp;kp LEFT &amp;kp DOWN &amp;kp RIGHT &amp;trans &amp;trans
      &amp;trans &amp;trans  &amp;trans    &amp;trans      &amp;trans &amp;trans                 &amp;trans    &amp;kp HOME &amp;trans   &amp;kp END   &amp;trans &amp;trans
                     &amp;trans    &amp;trans      &amp;trans &amp;mo 4    &amp;trans &amp;trans &amp;trans    &amp;trans   &amp;trans   &amp;trans
    &gt;;
  };

  mod_layer {
    bindings = &lt;
      &amp;bt BT_CLR  &amp;bt BT_SEL 0 &amp;bt BT_SEL 1 &amp;bt BT_SEL 2 &amp;bt BT_SEL 3 &amp;bt BT_SEL 4               &amp;trans &amp;trans       &amp;trans     &amp;trans       &amp;trans &amp;trans
      &amp;kp K_SLEEP &amp;mac_bt      &amp;win_bt      &amp;trans       &amp;trans       &amp;trans                     &amp;trans &amp;trans       &amp;trans     &amp;trans       &amp;trans &amp;trans
      &amp;tog 1      &amp;trans       &amp;trans       &amp;trans       &amp;trans       &amp;trans                     &amp;trans &amp;kp C_VOL_DN &amp;kp C_MUTE &amp;kp C_VOL_UP &amp;trans &amp;trans
      &amp;trans      &amp;trans       &amp;trans       &amp;trans       &amp;trans       &amp;trans                     &amp;trans &amp;kp C_PREV   &amp;kp C_PP   &amp;kp C_NEXT   &amp;trans &amp;trans
                               &amp;trans       &amp;trans       &amp;trans       &amp;trans       &amp;trans &amp;trans &amp;trans &amp;trans       &amp;trans     &amp;trans
    &gt;;
  };
};</code></pre><figcaption>An enhanced keymap that allows you to swap <code>Cmd</code> and <code>Ctrl</code> for a Windows-specific layout.</figcaption></figure><p>At this point, you should have the following layers:</p><ul><li>Layer 0: Mac</li><li>Layer 1: Windows</li><li>Layer 2: Symbol</li><li>Layer 3: Navigation</li><li>Layer 4: Adjust</li></ul><p>Go ahead and update your <code>Raise</code> and <code>Lower</code> keys to skip over the Windows layer for now. The left thumb should go straight to Layer 2, and your right thumb should go to Layer 3. They&apos;re the <code>&amp;mo 2</code> and <code>&amp;mo 3</code> commands you see in the center of each keymap.</p><p>At this point, your keyboard should be working as it usually does. The Windows layer exists, but it&#x2019;s being completely ignored. The Symbol, Nav, and Adjust layers are being applied on top of your Mac layer.</p><p>So what we need to do now is somehow swap out the base Layer 0 Mac layer with the Layer 1 Windows layer. Thankfully, ZMK has support for this. Its &#x201C;Toggle Layer&#x201D; keycode enables a layer until the layer is manually disabled. Critically however, this still allows you to use the standard &#x201C;Momentary Layer&#x201D; behavior to get to your Symbol, Nav, and Adjust layers.</p><p>Add a <code>&amp;tog 1</code> keycode to an unused key on your keymap. The `Tab` key on the Adjust layer is usually a good candidate. (You can see I already went ahead and did that on the earlier code embed.)</p><p>Now if you press <code>Raise+Lower+Tab</code>, your base layer will shift from Layer 0 to Layer 1. This can be used for much more advanced keyboard configurations (shifting from Qwerty to Colemak for instance), but in this case the only change we made between these two layers is the order of the modifier keys. Presto, we&apos;re now using <code>Ctrl</code> as our primary modifier instead of <code>Cmd</code>. The thumb keys are still configured to <code>&amp;mo 2</code> and <code>&amp;mo 3</code>, so we can still enable the Symbol, Nav, and Adjust layers. To switch back to Mac-style keys, simply press <code>Raise+Lower+Tab</code> again.</p><p>This approach does have a few limitations over QMK. First and foremost, the keyboard will reset back to its default layer when you restart or unplug the device. On QMK, the magic keycodes persist after power cycling. Additionally, you need to create a unique layer to <code>&amp;tog</code> to for each specific behavior you&#x2019;re looking to implement. If you wanted to simulate both<code>AG_TOGG</code> and <code>CG_TOGG</code> simultaneously, your layer definitions will start to balloon significantly.</p><h2 id="integrating-os-hotkey-switching-with-zmk-bluetooth-profiles">Integrating OS Hotkey Switching With ZMK Bluetooth Profiles</h2><p>This <code>Raise+Lower+Tab</code> approach works well for situations like virtual machines and KVMs, but what if you&#x2019;re actually using the bluetooth capabilities of ZMK to switch between two physical Mac and Windows devices? You can press ZMK&apos;s <code>&amp;bt BT_SEL</code> keycode and then our <code>&amp;tog</code> command individually, but ZMK&apos;s macro capabilities can easily automate this process.</p><figure class="kg-card kg-code-card"><pre><code class="language-c">macros {
  mac_bt: mac_bt {
    label = &quot;mac_bt&quot;;
    compatible = &quot;zmk,behavior-macro&quot;;
    #binding-cells = &lt;0&gt;;
    bindings
      = &lt;&amp;macro_tap &amp;bt BT_SEL 0&gt;
      , &lt;&amp;macro_tap &amp;tog 0&gt;
    ;
  };
  
  win_bt: win_bt {
    label = &quot;win_bt&quot;;
    compatible = &quot;zmk,behavior-macro&quot;;
    #binding-cells = &lt;0&gt;;
    bindings
      = &lt;&amp;macro_tap &amp;bt BT_SEL 1&gt;
      , &lt;&amp;macro_tap &amp;tog 1&gt;
    ;
  };
};</code></pre><figcaption>Macro definitions for switching layouts and devices at the same time.</figcaption></figure><p>Define a pair of macros at the top of your keymap file. Assuming your Mac is on BT 0 and your Windows machine is on BT1, you should easily be able to create a <code>mac_bt</code> and <code>win_bt</code> pair of macros to switch to each device. We&apos;ll use <code>&lt;&amp;macro_tap&gt;</code> to activate the same exact keycodes as before.</p><p>You can replace the original Bluetooth profile hotkeys on your keymap with these macros, but my Adjust layer had plenty of spare keys for them. It&apos;s easy enough to slot the macro-version of those commands underneath the original keys. You can call the macros with <code>&amp;mac_bt</code> or <code>&amp;win_bt</code>. (Again, I didn&apos;t bother hiding these from our enhanced keymap up above.) You may still want to keep around the original OS toggle hotkey on <code>Tab</code> just in case things get out of sync.</p><h2 id="conclusion">Conclusion</h2><p>In the absence of official ZMK support for OS modifier switching, these layer tricks should help you straddle the world between operating systems. Hope this helped someone in a similar situation to me!</p>]]></content:encoded></item><item><title><![CDATA[A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)]]></title><description><![CDATA[I take a look at the split ergonomic Sofle Choc keyboard, and accidentally write eight thousand words about mechanical keyboard basics.]]></description><link>https://flatfootfox.com/a-review-of-the-sofle-choc/</link><guid isPermaLink="false">63bc4c337a20c14ec07fe90d</guid><category><![CDATA[Review]]></category><dc:creator><![CDATA[FlatFootFox]]></dc:creator><pubDate>Sun, 19 Feb 2023 19:51:29 GMT</pubDate><media:content url="https://flatfootfox.com/content/images/2023/06/Sofle-Front-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://flatfootfox.com/content/images/2023/06/Sofle-Front-1.jpg" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)"><p>Say hello to the <a href="https://choc.brianlow.com">Sofle Choc</a>. This is Brian Low&apos;s low profile variant of Josef Adam&#x10D;&#xED;k&apos;s <a href="https://josefadamcik.github.io/SofleKeyboard/">Sofle</a> split mechanical keyboard. It features <a href="https://mkultra.click/choc-switches">Kailh Choc</a> switches, a staggered column layout, and <a href="https://qmk.fm">QMK</a> support. If it&#x2019;s not already clear, I&#x2019;ve officially fallen off the deep end of custom keyboards, and I&#x2019;m dragging you along for the ride.</p><p>Mechanical keyboards are having a bit of a moment. There&#x2019;s always been a passionate undercurrent of techy individuals with strong opinions on the input devices they use daily, but the internet&#x2019;s finally done its thing and brought these people together. Communities like Reddit&#x2019;s <a href="https://www.reddit.com/r/mechanicalkeyboards">/r/mechanicalkeyboards</a> and <a href="https://www.reddit.com/r/ErgoMechKeyboards/">/r/ErgoMechKeyboards/</a> are more than happy to help ratchet up your level of keyboard nerdery, and there&#x2019;s dozens of niche Discords for enthusiasts to discuss their latest builds. Even mainstream companies like <a href="https://www.logitech.com/en-us/products/keyboards/mx-mechanical-mini-mac.920-010831.html">Logitech</a> and <a href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini">Razer</a> have started to offer up their own takes the latest mechanical keyboard trends for the clacky curious who aren&#x2019;t looking to lose afternoons to wiki pages and sticky posts.</p><p>So, how did we get here? More importantly, where did all my keys go?</p><h2 id="the-basics">The Basics</h2><p>The subject of mechanical keyboard switches has been detailed extensively, so I&#x2019;ll try to keep this brief. <code>[Editor&apos;s Note: Whoops.]</code> If you haven&#x2019;t sought out an expensive aftermarket keyboard, you&#x2019;re most likely typing on your laptop keyboard or whatever came with your last desktop computer in 2006.</p><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Membrane_keyboard.jpg" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="800" height="583" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Membrane_keyboard.jpg 600w, https://flatfootfox.com/content/images/2023/02/Membrane_keyboard.jpg 800w" sizes="(min-width: 720px) 720px"><figcaption>A rubber membrane keyboard. (Via <a href="https://commons.wikimedia.org/wiki/File:Membrane_keyboard.jpg">Wikipedia</a>.)</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>Cheap keyboard typically use what&#x2019;s known as &quot;membrane&quot; or &#x201C;rubber dome&#x201D; switches. The keyboard&#x2019;s manufacturer prints a circuit board with dozens of contact pads on it, and then stretches out a thin piece of conductive rubber on top. When you push down on the plastic key cap, it squishes the rubber against the circuit board, the circuit is closed, and the signal is sent. It&#x2019;s a cheap and effective way to build a keyboard, but it often feels &#x201C;mushy&#x201D;. &#xA0;It&#x2019;s not clear when the rubber is actually going to make contact, and it can take a while for things to bounce back.</p><p>On the laptop side of things, manufactures employ rather impressive &#x201C;scissor switches&#x201D; to build absurdly thin portable keyboards. They&#x2019;re a marvel of modern industrial design, but they also are generally lacking in the physical feedback department. They key has such little distance between its resting state and its fully pushed position that it can be difficult to tell when a key has been let go and is ready to type again.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Cherry_MX_--_opened-_2.jpg" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="800" height="600" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Cherry_MX_--_opened-_2.jpg 600w, https://flatfootfox.com/content/images/2023/02/Cherry_MX_--_opened-_2.jpg 800w" sizes="(min-width: 720px) 720px"><figcaption>There popular Cherry MX switch. (Via <a href="https://commons.wikimedia.org/wiki/File:Cherry_MX_--_opened,_2.jpg">Wikipedia</a>.)</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>Mechanical keyboard switches eschew these cost cutting and miniaturization trends. They take inspiration from the keyboard designs of the early decades of computing and rely on discrete, chunky components. Each key has its own physical switch sporting a large spring mechanism and a noticeable amount of key travel.</p><p>The vast majority of mechanical keyboard switches mimic or outright clone the Cherry corporation&#x2019;s perennial &quot;MX&quot; switch. These keyboard switches are now sold by dozens of manufacturers in a bewildering array of varieties, and choosing the right one for you can be a little intimidating for newcomers.</p><p>Mechanical keyboards are perhaps most famous for their &#x201C;clicky&#x201D; style key switches. These switches produce an audible &quot;Click!&quot; sound and send a small vibration through the key when the switch has been pushed enough to send its command. Interestingly, mechanical key switches don&apos;t require that you push the key down all of the way. Switches only require you push them down about half of their height before the command is actually sent. Once you hear the click, you know you can let go and get ready to press the key again. (Of course, there&apos;s nothing stopping you from pushing the key down fully if you&apos;d like.) The immediate physical and audio feedback of clicky MX switches makes them particularly popular with PC gamers.</p><p>They are a little difficult to use in close proximity with other human beings however. It&apos;s hard to overstate just how loud a clicky keyboard can be once you get deep into a typing session. Most software development teams have a story about someone who tried to bring a clicky keyboard into an open floor plan office with disastrous results. Clicky keyboards are not exactly discrete, which is why the &#x201C;tactile&#x201D; switch is a popular alternative.</p><p>Tactile switches forego the audible click when the key is activated. Instead they attempt to recreate the physical sensation of the click without any actual noise. Once the key switch has been pushed halfway down, you&apos;ll feel a slight &quot;bump&quot; in the key letting you know that the signal has been sent and you can let go of the key. It provides a typing experience similar to a clicky key, but with significantly less noise. Trust me, your desk mates will thank you.</p><p>Finally, &#x201C;linear&#x201D; switches don&#x2019;t have any specific behavior halfway through the keypress when the signal is sent. They just have a smooth continuous press, and are generally the most quiet of the bunch. The lack of any physical feedback isn&apos;t everyone&apos;s cup of tea, but for plenty of typists, just seeing the letter appear on the screen is more than enough. Their understated typing experience is often popular for users making the initial switch over to mechanical keyboards who don&apos;t want to adjust to too many changes at once.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/9key-34_1.jpg" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1049" height="700" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/9key-34_1.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/9key-34_1.jpg 1000w, https://flatfootfox.com/content/images/2023/02/9key-34_1.jpg 1049w" sizes="(min-width: 720px) 720px"><figcaption>A simple 9-key switch tester next to some noise dampening O-rings. (Via <a href="https://www.wasdkeyboards.com/wasd-9-key-cherry-mx-switch-tester.html">WASD</a>.)</figcaption></figure><p>Beyond this switch behavior, one needs to decide on how heavy an &#x201C;activation force&#x201D; they&#x2019;d like their keys to have. Switches are usually built with physical springs, and those springs can offer up varying amounts of resistance to the user&apos;s key presses. The activation force simply describes how many grams of pressure it takes to overcome this resistance and push a key down. Most manufactures at a minimum offer a &#x201C;heavy&#x201D; and &#x201C;light&#x201D; option for their key switches. One switch may take 70 grams of force to press, while their lighter option may only takes 50 grams. The more bespoke manufactures will often offer up a wider gradient of weight options.</p><p>Those are the two big switch decisions you need to make when buying a mechanical keyboard. What type of behavior do you want your switches to have, and how much resistance do you want them to offer. Manufacturers occasionally will offer some variants based on how noise-dampened the switch is, but generally your decision will just revolve around those two different axis.</p><p>You&#x2019;d be forgiven if things looked far more complicated than that however. Rather than directly printing a switch&#x2019;s characteristic on the plastic itself, manufacturers typically chose to produce differently colored switch stems in order to tell their different types of keys apart. Blue stems are light and clicky. Clear stems are heavy and tactile. Red stems are light and linear. The myriad of switch color options out there are really just codings for those two more basic choices.</p><p>Keyboards are physical objects, and it&#x2019;s difficult to describe via text or video the merits of one switch over another. When buying your first mechanical keyboard, it&apos;s worth trying out a few different key types before you make your decision. This is easy if you have some exceptionally geeky friends with a variety of switch tastes, but generally one just needs to bite the bullet and buy a switch tester with a variety of sample keys. Once you know which switch you&#x2019;re going to go with, you&apos;ll then need to pick your keyboard layout.</p><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/IBM_Model_M.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="800" height="335" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/IBM_Model_M.png 600w, https://flatfootfox.com/content/images/2023/02/IBM_Model_M.png 800w" sizes="(min-width: 720px) 720px"><figcaption>Surely you don&apos;t need <em>all</em> those keys, right? (Via <a href="https://www.wasdkeyboards.com/wasd-9-key-cherry-mx-switch-tester.html">Wikipedia</a>.)</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>Most desktop keyboards are based off a <a href="https://en.wikipedia.org/wiki/Model_M_keyboard">40 year old IBM PC standard</a> and feature over a hundred keys. (The exact number varies based on where in the world you happen to be.) There&#x2019;s a lot of residual cruft that&#x2019;s built up over the years, and there&#x2019;s arguments to be made that you don&#x2019;t <em>really</em> need a <code>Pause / Break</code> key on a modern keyboard.</p><p>There&#x2019;s a variety of keyboard layouts which help slim down the classic design. The popular &#x201C;Tenkeyless&#x201D; design helps free up some desk space by dropping your keyboard&#x2019;s number pad. (It doesn&apos;t have the ten number pad keys. Ten-key-less. Get it?) Things get a bit more drastic from there. &#x201C;75%&#x201D; keyboards take the tenkeyless design and usually pull the arrow keys in for a more compact block, and &#x201C;65%&#x201D; designs drop the Function row entirely. Finally, &#x201C;60%&#x201D; keyboards take the minimalism and get rid of the arrow keys entirely.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Drop-Keyboards.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="820" height="807" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Drop-Keyboards.png 600w, https://flatfootfox.com/content/images/2023/02/Drop-Keyboards.png 820w" sizes="(min-width: 720px) 720px"><figcaption>A few keyboard layouts from <a href="http://drop.com">Drop.com</a>.</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>There&apos;s endless variety on these basic layouts. A few have been canonized like the tenkeyless, but your keyboard layout of choice will boil down to personal taste. Laptop users may be familiar with ditching the number pad, but a lot of users may be less comfortable with the idea of needing to rely on function keys and modifiers just to tap and arrow key.</p><p>There&#x2019;s no need to do anything too drastic at first. Grab a key switch tester, think about how often you use certain keys, and then buy something prebuilt off the shelf from a company like <a href="https://www.wasdkeyboards.com">WASD</a> or <a href="http://keychron.com">Keychron</a>. It&#x2019;ll set you back about $150 to figure out if these sorts of keyboards are for you. If your starter board starts to go stale, you can even buy a set of cheap keycaps to liven it up.</p><h2 id="getting-geeky">Getting Geeky</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/3qtshz50r0h51.jpg" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="2000" height="1017" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/3qtshz50r0h51.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/3qtshz50r0h51.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2023/02/3qtshz50r0h51.jpg 1600w, https://flatfootfox.com/content/images/size/w2400/2023/02/3qtshz50r0h51.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>The <a href="https://keeb.io">Keeb.io</a> Quefrency, a custom built split keyboard.</figcaption></figure><p>At this point you&#x2019;ve got a nice sturdy keyboard. It had a few more buying decisions than picking up a Logitech keyboard from Best Buy, but it&#x2019;s suspiciously close to a standard consumer transaction. Where&#x2019;s the <em>hobby</em> aspect come into play?</p><p>Well, you may have noticed me use the word &#x201C;prebuilt&#x201D; to describe the entry level keyboards in the last section. You can buy a keyboard that&#x2019;s fully assembled and ready to go, but it&#x2019;s also possible to buy and assemble a keyboard out of individual parts.</p><p>A mechanical keyboard is comprised of a few types of components. There&#x2019;s the microcontroller at the heart of the keyboard, the actual PCB that houses all the keys, the individual key switches, the keycaps for the switches, and often a case for the keyboard.</p><p>The primary benefit you get from building your own keyboard from scratch is that you&#x2019;ve got a much larger pool of switches to chose from. Most prebuilt manufactures only offer a half dozen key options from one or two brands. If you&#x2019;re assembling your own keyboard, you can start dabbling with boutique key switch manufactures. Companies like <a href="http://zealpc.net">ZealPC</a> and <a href="https://drop.com">Drop</a> specialize in making exceptionally quiet or particularly clicky keys that can fit in any standard MX formfactor board.</p><p>The actual DIY boards themselves vary in complexity. Some of them are incredibly straightforward. Many large keyboard manufactures will offer <a href="https://drop.com/buy/drop-ctrl-barebones-mechanical-keyboard?defaultSelectionIds=969701">switch-less versions</a> of their most popular boards. You need to add the switches yourself, but everything else is already assembled for you. On the opposite end of the spectrum, boutique manufacturers and hobbyists will use the flexibility of small-batch runs to get experimental with the form factors and feature sets of their keyboards. These boards are usually a bit more barebones, requiring the builder to solder in an Arduino microcontroller and other ancillary support hardware. The scene now has a myriad of <a href="https://drop.com/buy/drop-alt-mechanical-keyboard?defaultSelectionIds=966466%2C966468">RGB LED lit keyboards</a>, <a href="https://keeb.io/collections/split-keyboards">split keyboards</a>, and even <a href="https://fingerpunch.xyz/product/faux-fox-keyboard-v2/">keyboards with integrated trackpads</a>. As long as you can get past an exorbitant price tag, there&#x2019;s probably a keyboard out there for you.</p><p>Speaking of prices, you know you&#x2019;re in for trouble when you start hearing phrases like &#x201C;<a href="https://www.etsy.com/market/artisan_keycap">Artisan Keycaps</a>&#x201D;. Keycaps are the component that&#x2019;s the easiest to swap out on a mechanical keyboard, so there are countless keycap sets ready to meet whatever theme or aesthetic you&#x2019;re going for.</p><p>&#x2026;eventually. The hobbyist keycap scene often works on a group buy model. Buyers will pool their money together and preorder a keycap set before the manufacturing process has actually begun. Popular keycap sets will often go out of stock for the better part of the year, or occasionally only ever get one print run.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/01/Sofle-Profile.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1726" height="1768" srcset="https://flatfootfox.com/content/images/size/w600/2023/01/Sofle-Profile.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/01/Sofle-Profile.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/01/Sofle-Profile.png 1600w, https://flatfootfox.com/content/images/2023/01/Sofle-Profile.png 1726w" sizes="(min-width: 720px) 720px"><figcaption>A profile diagram from /u/gtderEvan on <a href="https://www.reddit.com/r/MechanicalKeyboards/comments/j484j5/keycap_profiles_i_compiled_a_direct_comparison/">Reddit</a>.</figcaption></figure><p>In addition to different color schemes, keycaps can also offer several different shape options for DIY keyboards. These &quot;profiles&quot; range from the familiar sloped shapes you&apos;ve likely experienced the vast majority of keyboards you&apos;ve encountered, to a more flat keyboard shapes for those looking to switch things up. (If you&apos;re trying to find your off the shelf keyboard&apos;s profile on the diagram, chances are you&apos;re on a Cherry or OEM board.)</p><p>Finally, many keyboards will offer a case. These can be simple pieces of plastic, machined aluminum, or even community 3D printed designs. Cases aren&#x2019;t strictly necessary however. Some of the more custom keyboards will just put rubber feet on the bottom of the bare PCB.</p><p>Put this all together, and you&#x2019;re ready to order parts from a half-dozen manufacturers. A typical hobbyist build could include around $100 USD in parts from <a href="http://keeb.io">Keeb.io</a> to build their split <a href="https://keeb.io/collections/quefrency-split-staggered-65-keyboard/products/quefrency-60-65-split-staggered-keyboard-1">Quefrency</a> board, another $100 USD for quiet <a href="https://zealpc.net/collections/all-products/products/zilent?variant=5894817710118">Zilent</a> switches from <a href="http://zealpc.net">ZealPC</a>, and around $50 to $100 USD on a set of keycaps. Make sure to budget another $100+ USD for an acrylic case unless you&#x2019;re happy with rubber feet or know someone with a 3D printer. After an evening of soldering, you&#x2019;ll have a nice personalized keyboard worthy of running off and showing <a href="http://reddit.com/r/mechanicalkeyboards">/r/mechanicalkeyboard</a>.</p><h2 id="software-shenanigans">Software Shenanigans</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-15-at-4.48.36-PM.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1361" height="907" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-15-at-4.48.36-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Screenshot-2023-02-15-at-4.48.36-PM.png 1000w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-15-at-4.48.36-PM.png 1361w" sizes="(min-width: 720px) 720px"><figcaption>QMK&apos;s Keymap Configurator GUI</figcaption></figure><p>Keyboards aren&#x2019;t known for their intelligence. The earliest keyboards simply knew how to send basic serial signals before making the switch to simple USB commands. Even some enthusiast keyboards continue this barebones tradition. WASD&#x2019;s mechanical keyboards have a basic USB connection, and only offer customization by exposing a set of physical toggle switches on the bottom of the keyboard to adjust settings like Mac and Windows keymaps.</p><p>Increasingly however, keyboards are beginning to house some legitimate processing power. Managing RGB LEDs is not a simple task, and additional components like OLED screens require some real intelligence on the keyboard itself.</p><p>There&#x2019;s two ways you can manage these newfound capabilities: Built into the keyboard, or with client side software drivers. Most mainstream gaming keyboards generally go with this later approach. Logitech and Razer have all sorts of over the top software suites letting you accomplish complex feats like syncing the backlights of your keyboard with your current hero in Overwatch. It&#x2019;s a fine approach when you&#x2019;re looking for deep integration between software and a keyboard, but it does introduce a few unusual edge cases when switching between machines or dealing with particularly finicky hardware or software comparability.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-16-at-6.13.24-PM.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="2000" height="1497" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-16-at-6.13.24-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Screenshot-2023-02-16-at-6.13.24-PM.png 1000w, https://flatfootfox.com/content/images/size/w1600/2023/02/Screenshot-2023-02-16-at-6.13.24-PM.png 1600w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-16-at-6.13.24-PM.png 2042w" sizes="(min-width: 720px) 720px"><figcaption>Once you reach a certain point in the mechanical keyboard hobby, delving into config files becomes enviable.</figcaption></figure><p>The enthusiast mechanical keyboard scene has generally gravitated towards keyboards that manage their unique functionality on the keyboard itself. Rather than needing to rely on a specific software driver, the user can simply leverage &#xA0;built-in hotkeys to cycle through features like advanced RGB LED light patterns.</p><p>Conceptually this groks a bit better with the idea of a keyboard being a self contained peripheral. No matter which system you plug your keyboard into, it will behave the same. All of the fancy lighting and custom macros are obscured away from the host machine, and no matter how complicated your device is, it still just appears as a standard keyboard.</p><p>The downside of this approach is that it usually limits the amount of customization available to you. A Keychron keyboard for instance may have 20 different light patterns programmed into it, but you&#x2019;re usually stuck with those preloaded patterns. If you were using software drivers on something like a Razer keyboard, you can go wild and say, create a backlight pattern where the letters of your partner&#x2019;s name are colored differently. On keyboards with fixed firmwares, you&apos;re stuck with the out of the box experience.</p><p>To help mitigate this issue, enthusiast keyboards have just started integrating an entire reprogrammable microcontroller. It turns out there&#x2019;s very few things in the embedded electronics world that can&#x2019;t be solved by just strapping an Arduino to the side of it.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/ArduinoProMicro.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/ArduinoProMicro.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/ArduinoProMicro.png 1000w, https://flatfootfox.com/content/images/2023/02/ArduinoProMicro.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>An Arduino Pro Micro in it&apos;s natural habitat: Laying on a desk next to some bottle caps.</figcaption></figure><p>The <a href="https://www.sparkfun.com/products/12640">Arduino Pro Micro</a> and its ATmega32U4 microprocessor has become the de facto standard for hobbyist keyboards. Pair it with the open source <a href="http://qmk.fm">QMK keyboard firmware</a>, and you can get a mechanical keyboard to do just about anything. QMK can control RGB LEDs, manage LCD screens, and provide a myriad of macro key behavior. It can be a little intimidating edit C config files and compiling your own firmware binary, but thankfully tools like the <a href="https://config.qmk.fm/#/">QMK Configurator</a> and <a href="http://caniusevia.com">VIA</a> have provided useful GUIs for those who are only up for moderate amounts of tinkering.</p><p>Proprietary keyboard firmwares are becoming increasingly rare, but it&#x2019;s still worth double checking that the wired keyboard you have your eye on runs QMK. Custom Bluetooth keyboard firmwares are still fairly common for prebuilt boards, but open source options have started to crop up on the DIY side. The <a href="https://nicekeyboards.com/nice-nano">Nice!Nano</a> microcontroller is a drop-in wireless replacement for the Arduino Pro Micro, and its wireless <a href="http://zmk.dev">ZMK</a> firmware is philosophically similar to QMK.</p><h2 id="hot-swap-fever">Hot-Swap Fever</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Hotswap.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1229" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Hotswap.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Hotswap.png 1000w, https://flatfootfox.com/content/images/2023/02/Hotswap.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>A row of hotswap sockets waiting for their switches.</figcaption></figure><p>When looking at the overall cost of a mechanical keyboard, the key switches are always the deceptively expensive part. The board&#x2019;s about $50 USD, the keycaps are around $50-100 USD, and the key switches are $5-12 USD for a pack of 10 switches. That&#x2019;s not <em>too</em> bad, right? Well, most keyboards have between 60 and 110 keys. On the low end, you&#x2019;ll be able to outfit a small board with standard Cherry MX red switches for under $50. If you have a larger board, or go for something a bit more expensive like the <a href="https://zealpc.net/products/zilent">ZealPC Zilent</a> switches, suddenly you&#x2019;re spending $100+ USD on just the switches for your build.</p><p>And you might not even like them! As I mentioned earlier, you generally need to buy a key switch tester to get a feel for which type of key you may prefer. There&#x2019;s a big difference between having one sample key to tap with your index finger and having an entire board to experiment with. You might spend hundreds of dollars on a build, solder the keys into place, and realize you don&#x2019;t actually like them. It&#x2019;s a harrowing proposition for both first time builders and experienced folks who just like to experiment.</p><p>Wouldn&apos;t it be great if you didn&apos;t need to commit to a switch type when building a keyboard? Well, it turns out you don&apos;t have to worry about permanently soldering switches that aren&apos;t your cup of tea anymore. In the past few years, keyboards have started to incorporate the option of including so-called &quot;hotswap sockets&quot;. The sockets are small pieces of plastic and metal that act like Game Boy cartridge slots for your key switches. They slot completely into place via friction alone, and are easy enough to pull out if you&apos;re not satisfied with them. If you bought a bunch of Red switches and it turns out you&#x2019;re more of a Blue fan, all you need to do is buy a new set of switches. You can skip the process and sunk cost of having to re-buy and re-solder an entire second keyboard.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/KailhSockets.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="491" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/KailhSockets.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/KailhSockets.png 1000w, https://flatfootfox.com/content/images/2023/02/KailhSockets.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>Choc PCB footprints supporting soldered switches, hotswap switches, or both. The flexible footprints usually come at the cost of LED support. (Via <a href="https://github.com/daprice/keyswitches.pretty">keyswitches.pretty</a>)</figcaption></figure><p>Hotswap support isn&#x2019;t universal on keyboard PCBs at the moment, but it&#x2019;s becoming more common. It&#x2019;s possible to create a keyboard with support for both soldering and hot swapping, although adding additional functionality like per-key lighting can become slightly more complicated. The hotswap sockets themselves cost about $15 USD for 100 sockets, so it&#x2019;s not exorbitantly expensive to add this functionality to a keyboard who&#x2019;s design you&#x2019;re on the fence about. Even for enthusiasts who know exactly what switch type they prefer, it&apos;s still nice to invest in 100 solid key switches and move those around as you experiment with different board layouts.</p><h2 id="ridin%E2%80%99-low">Ridin&#x2019; Low</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/RoMac-1.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/RoMac-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/RoMac-1.png 1000w, https://flatfootfox.com/content/images/2023/02/RoMac-1.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>A variety of Kailh Choc v1 switches and keycaps on the RoMac macro pad.</figcaption></figure><p>Alright, it&apos;s time for the real hardcore nonsense. Making a bespoke custom mechanical keyboard is great, but you know what&#x2019;s even better? Making one that&#x2019;s <a href="https://www.urbandictionary.com/define.php?term=Smol">smol</a>. Get enough nerds in an online community together, and eventually someone will try to optimize the living daylights out of that community&apos;s tech and put it in a tiny package. It happened with the <a href="https://www.reddit.com/r/sffpc/">small formfactor PC community</a>, and it&#x2019;s happened here too.</p><p>Low profile keyboards have switches that are somewhere between laptop keys and traditional mechanical keyboard switches. They still have a bit of travel to them, but not a <em>ton</em>. The activation force needed to push a low profile switch is usually less than that of a full sized keyboard as well, so they&#x2019;re popular options with folks looking to minimize repetitive stress in their daily computing.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/CherryChoc.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="964" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/CherryChoc.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/CherryChoc.png 1000w, https://flatfootfox.com/content/images/2023/02/CherryChoc.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>A Cherry MX switch compared to a Kailh Choc. (Via /u/songcq on <a href="https://www.reddit.com/r/MechanicalKeyboards/comments/7nlw1e/kailh_low_profile_compared_with_cherry/">Reddit</a>.)</figcaption></figure><p>The most popular key switch for low profile keyboards is the Kailh Choc. This switch has both a v1 and v2 variety, and interestingly enough, the community has mostly championed the original v1 switch. The v2 switch has a similar design, but chose to use a cross-shaped MX style switch stem. This is great for maintaining compatibility with 99% of existing keycap sets&#x2026; but you know what else is really tall? <em>99% of existing keycap sets!</em></p><p>Kailh Choc v1 keycaps are usually small, flat, and chiclet-style. There aren&apos;t a ton of options out there at the moment. If you like keycaps with legends, your options are: <a href="https://mkultra.click/mbk-legend-keycaps/">Black, white, gray</a>, and <a href="https://www.littlekeyboards.com/collections/keycaps/products/mbk-glow-keycaps">black with shine through letters</a>. That&#x2019;s it. <a href="https://fkcaps.com/keycaps/mbk/legend-extended">Blue&#x2019;s coming later in 2023</a>. For blank keycaps, you can at least purchase them in a <a href="https://mkultra.click/mbk-factory-colors/">variety of colors</a>.</p><p>Despite the small ecosystem, these low profile keys are versatile enough to fit a variety of designs. The caps are available in the standard <code>1u</code> square, as well as longer <code>1.5u</code> and <code>2u</code> sizes. The lack of legend options is a little frustrating, but most of these boards are small enough that it&apos;s not a dealbreaker. You&#x2019;re already having to map the <code>=</code> key to <code>Fn+Z</code>. At a certain point you just need to start remembering which key does what.</p><h2 id="why-the-sofle-choc">Why The Sofle Choc?</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-RGB.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-RGB.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-RGB.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-RGB.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>So much for trying to keep the intro brief.</figcaption></figure><p>Would you look at that! Three thousand words later, and we&#x2019;re finally ready to discuss the keyboard we set out to talk about.</p><p>The <a href="https://josefadamcik.github.io/SofleKeyboard/">Sofle</a> is a split ergonomic keyboard design originally created by Josef Adam&#x10D;&#xED;k. There&apos;s a couple things to unpack there. Most obviously, this keyboard has two distinct halves connected by a headphone-style TRRS cable. People have found that typing with both of your arms pointed forward puts a bit less stress on your wrists than the typical typing posture of bowing your arms together at a 45 degree angle. This isn&apos;t the only ergonomic bit the Sofle has going on however.</p><p>A standard keyboard has rows that are slightly offset. The <code>X</code> key isn&apos;t directly below the <code>S</code> key for instance. There&apos;s a stagger to their rows. This can lead to odd hand twisting when a key doesn&apos;t obviously line up with any of your finger&apos;s normal resting position. Is it the responsibility of your ring finger to slide down from <code>S</code> to type <code>X</code>, or should your middle finger curl in from the <code>D</code> to tap the <code>X</code>?</p><p>Everyone&#x2019;s heard that anecdote about modern keyboard layouts hailing from designs intended to slow down typing and stop typewriter jams, right?</p><!--kg-card-begin: html--><div class="post-pull-left"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/planck.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1260" height="383" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/planck.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/planck.png 1000w, https://flatfootfox.com/content/images/2023/02/planck.png 1260w" sizes="(min-width: 720px) 720px"><figcaption>If the Sofle&apos;s 58 column-staggered keys look daunting, wait till you see the 43 ortholinear keys on the Planck. (Via <a href="http://olkb.com">OLKB</a>.)</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>Some keyboard enthusiasts have started moving away from this classic &#x201C;Row Staggered&#x201D; layout. &#x201C;Ortholinear&#x201D; keyboards like the <a href="https://ergodox-ez.com/pages/planck">Planck</a> take this to the extreme, and have designs which perfectly align every key on a horizontal and vertical axis. There&apos;s no confusion about which finger should be sliding down to tap the <code>X</code> on this style keyboard layout.</p><p>The Sofle doesn&#x2019;t go quite as far as an orthlinear layout, and instead opts for a &#x201C;Column Staggered&#x201D; layout. In this type of layout, all of the rows are lined up, so your <code>X</code> key is directly under your <code>S</code> key, but the columns have a slight stagger to them. This tries to acknowledge the natural curl of a human hand, hence the Sofle&apos;s ergonomic description. You still get the nice benefit of the <code>X</code> key being a quick slide of the finger under the <code>S</code> key, but you don&apos;t need to adhere to the Ortholinear&apos;s strict straight lines.</p><!--kg-card-begin: html--><div class="post-pull-right"><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/sofle_keyboard.jpg" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1900" height="1068" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/sofle_keyboard.jpg 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/sofle_keyboard.jpg 1000w, https://flatfootfox.com/content/images/size/w1600/2023/02/sofle_keyboard.jpg 1600w, https://flatfootfox.com/content/images/2023/02/sofle_keyboard.jpg 1900w" sizes="(min-width: 720px) 720px"><figcaption>The Sofle also comes in a standard MX variant if you&apos;re not looking to take the low profile plunge. (Via <a href="https://josefadamcik.github.io/SofleKeyboard/">Josef Adam&#x10D;&#xED;k</a>.)</figcaption></figure><!--kg-card-begin: html--></div><!--kg-card-end: html--><p>The original <a href="https://josefadamcik.github.io/SofleKeyboard/">Sofle</a> design has several variants. The <a href="https://choc.brianlow.com">Sofle Choc</a> board we&#x2019;re looking at today is a riff created by Brian Low. It introduces Choc hotswap sockets, and retains the per-key RGB LEDs first introduced in the Sofle RGB.</p><p>The Sofle Choc checked a lot of boxes for me. When I first started exploring building a new keyboard, I wanted something that was a significant enough departure from my earlier <a href="https://keeb.io/collections/quefrency-split-staggered-65-keyboard/products/quefrency-60-65-split-staggered-keyboard-1">Keeb.io Quefrency</a> build. It was a split keyboard too, but it had a traditional row stagger layout, and the backlight LEDs weren&#x2019;t individually addressable. The combination of the Sofle&#x2019;s new layout, the per-switch RGB LEDs, and the low profile Choc switches were enough to make me consider building another keyboard. It didn&#x2019;t hurt that the Sofle Choc would also give me a good excuse to experiment with OLED screens on a keyboard.</p><h2 id="building-the-sofle-choc">Building The Sofle Choc</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Build.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1112" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Build.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Build.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Build.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>A dozen hotswap sockets waiting for their keys.</figcaption></figure><p>Outside of commissioning someone to build it for you, the Sofle Choc is only available as a DIY project. Whether you buy a full kit or source the parts separately, you&#x2019;re in for a soldering project that will take up the better part of an afternoon.</p><p>Soldering is a bit of an intimidating skill to pick up. You&#x2019;re working with temperatures that can melt metal, there&#x2019;s a lot of <em>stuff</em> you need to buy, and you can brick your project if you make a mistake. It doesn&#x2019;t take <em>too</em> much practice to gain a bit of confidence however, and introductory soldering irons are cheaper than you&#x2019;d think.</p><p>Keyboards are actually a surprisingly good place to practice soldering. They usually don&#x2019;t employ advanced soldering techniques (although the Sofle dabbles with one), and due to the nature of a keyboard, everything&#x2019;s nice and spaced out. I wouldn&#x2019;t recommend <em>learning</em> how to solder on a keyboard however. An <a href="https://www.sparkfun.com/products/14681">intro soldering kit</a> will set you back about $60 USD, and a simple <a href="https://www.adafruit.com/product/73">&#x201C;learn to solder&#x201D; project</a> with a few LEDs and buttons will generally cost about $10-20 USD. It&#x2019;s worth the superfluous extra expense to get the hang of things before diving straight into your keyboard. Each half of the Sofle has 29 keys on it, and if you botch one of them, you&#x2019;ll have to start dealing with cumbersome de-soldering or other hacks to try and salvage your board.</p><p>The complete &#x2248;$140 USD <a href="https://choc.brianlow.com">kit</a> for the Sofle Choc comes with: The PCBs, the hotswap sockets, diodes, LEDs, two Arduino Pro Micro controllers, two OLED screens, sockets for the microcontrollers and screens, rotary encoders and knobs, TRRS plugs, a TRRS cable, a reset switch, and some rubber feet. You need to purchase the <a href="https://www.littlekeyboards.com/collections/keyboard-switches/products/kailh-choc-low-profile-switches">Choc switches</a> (&#x2248;$40 USD) and <a href="https://www.littlekeyboards.com/collections/new-products/products/mbk-glow-keycaps?variant=40390395658307">keycaps</a> (&#x2248;$70 USD) separately.</p><p>Brian Low&#x2019;s <a href="https://choc.brianlow.com/pages/build">build guide</a> for the Sofle Choc is one of the more thorough guides on the internet. He walks through every step in detail and includes plenty of pictures. He&#x2019;s even got a few nice touches, like making sure your first step to label which side is &#x201C;up&#x201D; on your two identical PCBs.</p><p>The first step of building the Sofle may be one of the more intimidating on paper. The Sofle leverages SMD surface mount diodes in its keyboard design. Most beginner soldering focuses on &#x201C;through hole&#x201D; components. As the name implies, these are components with long &#x201C;legs&#x201D; that you slide through metal holes on a PCB. You then fill the hole with solder, and a circuit connection is made. Surface mount components are a bit more fiddly to work with. They instead only rely on small metal &#x201C;pads&#x201D; resting on the top of a keyboard. You lay the component down and then apply solder to the pad to make sure the diode lays flat.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Diode.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Diode.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Diode.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Diode.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>I <em>may</em> have had to use a hard drive magnet to find a diode after dropping it on the carpet.</figcaption></figure><p>I had previously avoided SMD soldering. It&#x2019;s more precise, more fiddly, and usually requires a more expensive soldering iron with good temperature control. The surface mount diodes on the Sofle didn&#x2019;t give me too much trouble however. If you&#x2019;re a competent through hole solderer and are turned off by the idea of SMD components, try not to worry about it too much. Just make sure you have a good pair of <a href="https://www.amazon.com/Yakamoz-Precision-Non-Conductive-Resistant-Anti-Magnetic/dp/B07V6G4V72/">reverse-action tweezers</a>. These bad boys stay clamped shut by default, and make it <em>way</em> easier to work with diodes the side of a grain of rice.</p><p>Next come the hotswap sockets. These are also technically surface mount, but the pads you solder them to are comically large. It&#x2019;s honestly difficult to use too much solder here. The sockets deal with some amount of physical stress, so you can have a heavy hand with your solder and give them a bit extra support.</p><p>The last surface mount component is the per-key LED backlighting. These are also another beginner-friendly SMD soldering experience. The SK6812 Mini-E LEDs have long legs on them, and the board has small holes cut out for the light emitting part of the LEDs. It&#x2019;s obvious when they&#x2019;re seated correctly or when something isn&apos;t quite right and needs fixing.</p><p>Next comes the microcontrollers. The Sofle Choc is designed around the Arduino Pro Micro. This is a board which has been cloned numerous times. You can use any Pro Micro compatible board, such as the popular Elite-C microcontroller. The Elite-C and some more recently manufacturers Pro Micros have USB-C instead of Micro USB on them, so think about what type of connection you&#x2019;d like to use for your keyboard before you buy the microcontroller.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Socket.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Socket.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Socket.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Socket.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>Nothing&apos;s worse than realizing your $250 USD keyboard is broken because of a permanently soldered $10 USD part.</figcaption></figure><p>Microcontrollers can be soldered to the keyboard directly, but most people recommend &#x201C;socketing&#x201D; your controllers. This is a process of putting a female socket onto your keyboard itself, and a set of male pin headers onto the microcontroller. If something happens to your microcontroller and you need to replacer it, it&#x2019;s much easier to remove a socketed controller and slot in a new one. Also, if you end up making more than one keyboard, you can move the relatively expensive microcontroller between boards instead of making redundant investments.</p><p>Brian once again has a good guide here. The community has standardized around &#x201C;machine pin&#x201D; headers due to their low height. When building a mechanical keyboard, just make sure you pay attention to the orientation of the microcontroller. The community typically mounts microcontrollers face down for aesthetic reasons, but the practice isn&apos;t universal. The OLED screens goes through a similar socketing process.</p><p>After that, you just need to solder a few simple through hole components. The reset switch, TRRS connector and encoders should all be pretty straightforward after all of those SMD components. Keeping a roll of blue painter&#x2019;s tape around can help make sure the components continue to lay flat as you flip the board over.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Case.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Case.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Case.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Case.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>The Sofle works fine with just a set of bumpons, but a case is a great way to add a bit of color.</figcaption></figure><p>At this point you can start slotting in the key switches. The Sofle Choc comes with a switch plate to add a bit of stability to the board, but it doesn&#x2019;t have a traditional case. Instead they just give you a few rubber feet to apply to the bottom of the PCB. It&apos;s a bit minimal, but the keyboard is attractive enough to stand out on its own. If you have a 3D printer however, there&#x2019;s a few options at your disposal. <a href="https://www.thingiverse.com/thing:5138904">Lytedev</a> on Thingiverse created a nice low profile case for the Choc variant of the Sofle, and I&#x2019;ve got <a href="https://www.thingiverse.com/thing:5443846">a fork</a> with support for threaded screw inserts.</p><p>The last step is to flash the keyboard firmware to the microcontrollers. This will either be trivial or daunting depending on your prior experience with Arduinos. QMK is well documented and is easy enough to get compiling locally, but thankfully several precompiled builds also exist for the Sofle. GUI tools like the QMK Toolbox help streamline the process of uploading new images to one&#x2019;s board. You can even skip fiddling with QMK config files and use a VIA image if you&#x2019;d like to leverage the community&#x2019;s burgeoning graphical key remapping tool.</p><h2 id="using-the-sofle-choc">Using the Sofle Choc</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Hand.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Hand.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Hand.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Hand.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>The Sofle Choc nicely fits one&apos;s hand.</figcaption></figure><p>Even for folks who haven&apos;t fallen down the mechanical keyboard rabbit hole, it&apos;s hard not to notice that keyboards are getting smaller. Companies like Apple are shipping their desktop iMac computers with tenkeyless keyboards, and mainstream manufacturers like Logitech have more than a few &quot;75%&quot; layout offerings at this point.</p><p>My old Quefrency took things one step further. It&#x2019;s 65% design dropped the Function row and squished the arrow keys and most of the navigation keys up against the right side of the keyboard. Thankfully keycap vendors have started to offer smaller shift keys to make these layouts a bit less cumbersome to build than they were in the past.</p><p>The next step always seemed like a doozy for me though. 60% boards like the <a href="https://www.annepro.net/products/anne-pro-2">Anne Pro</a> or the <a href="https://vortexgear.store/products/the-new-pok3r-rgb">Pok3r</a> ditch the arrow keys entirely. The idea is that you hold down a laptop-style FN key in order to use the &quot;superfluous&quot; keys that their layouts dropped. Depending on the keyboard, your arrow keys would either become a WASD-style cluster over on IJKL, or they&#x2019;d lean into an old school vi-style HJKL row.</p><p>It always looked like a cumbersome arrangement to me. Full disclosure, I&#x2019;ve never owned one of these classic 60% keyboards, but if I was so nervous about 61-key layouts, how did I end up on a 58-key board?</p><p>Well, it all comes down to thumb keys and layers. On a classic small-scale keyboard designs, you&#x2019;ll often need to hide certain keys behind an <code>Fn</code> key. If your laptop doesn&#x2019;t have a <code>Delete</code> key for instance, you&#x2019;ll need to rely on <code>Fn+Backspace</code> to achieve the same outcome. Most of the time these <code>Fn</code> keys are squished in with <code>Ctrl</code>, <code>Alt</code>, and <code>Win / Cmd</code> on one or both sides of the spacebar. (Update: It turns out the Pok3r lets you use <code>Caps Lock</code> as an <code>Fn</code> toggle, which does sound a bit more comfortable than the <code>Fn</code> key next to the left <code>Alt</code>.)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Thumb.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="400" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Thumb.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Thumb.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Thumb.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>The Sofle&apos;s thumb keys gives you quick access to system modifiers, layer switching, and the spacebar. All without having to awkwardly contort your hand.</figcaption></figure><p>QMK-based ergo mech keyboards take this concept to the extreme. They&#x2019;ll have <em>multiple</em> function keys. Rather than just referring to these keys as <code>Fn1</code>, <code>Fn2</code>, etc., QMK uses a &quot;layers&quot; metaphor. Keyboards can stack multiple layers of additional key functionality on top of the base layout depending on which <code>Fn</code>-style keys are being held down. The Sofle for instance has a &quot;Symbol&quot; layer, a &quot;Navigation&quot; layer, and an &quot;Adjustments&quot; layer. You get to these other key functions by holding down <code>Fn</code>-like keys that are usually referred to as <code>Raise</code> and <code>Lower</code>.</p><p>The documentation of QMK has the full details if you&apos;re interested, but suffice it to say, the Sofle has some well thought out ways of accessing the keys it has dropped. This was actually the <a href="https://josef-adamcik.cz/electronics/in-search-of-the-best-custom-keyboard-layout.html">impetus</a> for the Sofle keyboard itself. Adam&#x10D;&#xED;k had tried using the popular 42-key Corne keyboard, and wanted a few more keys to make a more comfortable layout.</p><p>The Sofle puts the <code>Raise</code> and <code>Lower</code> layer keys where your thumbs naturally rest. Unlike a lot of laptop keyboards, you&apos;re not put in the awkward situation of remembering where they put the <code>Fn</code> key. It&apos;s not a clumsy, &#x201C;Now did they put it between <code>Alt</code> and <code>Win</code>, or <code>Win</code> and <code>Spacebar</code>?&#x201D; situation. They&apos;re just bam, right there, always under your left and right thumbs.</p><p>This basically solved my arrow key dilemma. The Sofle also uses <code>IJKL</code> for the arrow keys, but all you have to do to switch over to that mode is hold down the <code>Raise</code> key by your right thumb. Thanks to the keyboard&#x2019;s column staggered layout, the arrows don&#x2019;t even feel weird. The <code>I</code> and <code>K</code> keys are right on top of each other, so pressing &quot;up&quot; and&quot; down&quot; feels just as normal as a standard set of arrow keys. <code>J</code> and <code>L</code> are staggered slightly from the <code>K</code> key, but they&apos;re staggered in an equal amounts they still mirror each other. The act of moving around a document still feels familiar, you just have to adjust your &quot;shift your right hand a few inches to the left before arrowing&quot; muscle memory to &quot;push your right thumb down before arrowing&quot;.</p><p>The switch took surprisingly little time to adjust to. If you&#x2019;re interested in this style of split ergonomic keyboard but not quite ready to make the jump to an arrow-key free life however, you&apos;re not completely out of luck. The unusually asymmetrical <a href="https://afternoonlabs.com/breeze/">Afternoon Breeze</a> keyboard has a similar split ergonomic layout as the Sofle but it maintains a traditional navigation cluster. It doesn&apos;t have per-key RGB LEDs however, and in the end the light show won out. I&#x2019;m happy with my choice, but the option&#x2019;s still there if you&#x2019;re on the fence.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-16-at-6.15.40-PM.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1354" height="1632" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Screenshot-2023-02-16-at-6.15.40-PM.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Screenshot-2023-02-16-at-6.15.40-PM.png 1000w, https://flatfootfox.com/content/images/2023/02/Screenshot-2023-02-16-at-6.15.40-PM.png 1354w" sizes="(min-width: 720px) 720px"><figcaption>My personal keymap.</figcaption></figure><p>Using a layer for some extended symbols and brackets took a bit of getting used to. I never appreciated just how much <code>-</code> and <code>_</code> come up in my day to day life. That particular key quickly got promoted to the one unclaimed slot next to my <code>0</code> key, but most of the other math symbols have taken some time to adjust to. I only do a moderate amount of Excel work in my life, but any time I fire it up I need to take a half-beat to remember that <code>=</code> is <code>Lower+Z</code> and <code>+</code> is <code>Lower+C</code>. Brackets like <code>{ }</code> and <code>[ ]</code> somehow took me less time to adjust to. It&#x2019;s kind of nice having them symmetrically positioned near one&#x2019;s index fingers.</p><p>The biggest shift when moving to one of these column staggered or ortholinear keyboards is that they usually don&apos;t have a great place for the <code>Enter</code> key. The bracket keys and special symbols like <code>\</code> usually get shuffled around on a symbol layer, but <code>&apos;</code> and <code>&quot;</code> have too engrained of a muscle memory to get shunted off the pinky row. This means the <code>Enter</code> key needs to find a new home, and more often than not it ends up as either the right <code>Shift</code> key or one of the <code>spacebar</code>-style thumb keys.</p><p>I went with this later approach for my Sofle layout. My left thumb is <code>Enter</code>, and my right thumb is <code>Spacebar</code>. There was definitely a transition period, but I started to feel at home on the Sofle after a week or two of continued use. I had a few amusing moments on work screen shares where I needed to type a character I had lost track of, but those moments went away pretty quickly. Just be careful when typing in an IM window during the transition period. There were more than a few IM messages that were sent a little early thanks to the new <code>Enter</code> key position. Before I knew it though, the Sofle was just another keyboard to me.</p><p>The one interesting aspect I was curious about (and maybe a little worried to be honest) was how had it would be to transition <em>back</em> to a traditional row-staggered keyboard layout. I&#x2019;m still going to be on my laptop some of the time, and thankfully the Sofle hasn&#x2019;t ruined portable computers for me. There seems to be enough working space in my head to manage at least two keyboard layouts without too much trouble.</p><h2 id="so-is-it-ergonomic">So Is It Ergonomic?</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Trackball.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="628" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Trackball.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Trackball.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Trackball.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>&quot;My pointing device has a footprint roughly the size of one half of my keyboard,&quot; is a totally normal description of one&apos;s desk, right?</figcaption></figure><p>Probably? I&#x2019;m not a doctor, but I haven&#x2019;t had as much wrist trouble after a long typing session with the Sofle as my older Quefrency keyboard. Despite the Quefrency&#x2019;s split design, I&#x2019;d often end up just pushing the two halves together. That&#x2019;s not really an option with the Sofle, so I naturally let them stay further apart.</p><p>I made the classic &quot;changing two variables at once&quot; mistake when looking to improve my desk situation. Around the same time I switched to the Sofle, I also bought a large Kensington Expert trackball. I feel like it probably made more of an impact when it came to sitting at my desk for hours a day, but everyone will have their own personal solutions when it comes to improving their ergonomics. </p><p>Also: <em>Hey</em>, sit up straight!</p><p>I ended up liking the Choc switches a lot more than I thought I would. Their low-travel nature ties out my hands a bit less than my heavy Zilent switches on the Quefrency. If you&apos;re looking to reduce the stress on your hands, you can get some astonishingly light switch options. I&#x2019;m not sure I&#x2019;d recommend immediately jumping on the 35g Red Pro switches to start with, but they&#x2019;re a bit like typing on air once you get used to them. If they&apos;re not your cup of tea, no harm no foul. This keyboard&apos;s got hotswap sockets, remember?</p><h2 id="bells-whistles">Bells &amp; Whistles</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Solfe-OLED.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Solfe-OLED.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Solfe-OLED.png 1000w, https://flatfootfox.com/content/images/2023/02/Solfe-OLED.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>My current hue saturation values, in case you were curious. That&apos;s worth a screen, right?</figcaption></figure><p>I&#x2019;ve mentioned several times now that I specifically bought the Sofle Choc due to the keyboard&apos;s per-switch RGB LEDs. It&#x2019;s the entire reason I went with this board, and they&#x2019;re fine.</p><p>That&apos;s it. RGB LEDs are fine. There&apos;s some neat cycling rainbow patterns one can enable, but they mostly just look nice in pictures. QMK has support for some really engaging interactive effects, such as strobing the lights in time with your current WPM typing speed, but if you&apos;re a touch typist you&apos;re not going to be staring down at your keyboard while you type. The interactive patterns are a hoot, but they also generally leave your keyboard unlit when you&apos;re not typing. With a few months of hindsight now, I mostly just leave my Sofle with a solid purple backlighting that matches the trim of the case.</p><p>The OLED screens on the keyboard likewise look nice, but I haven&#x2019;t taken the time to investigate them as much as I should have. You need to get pretty in the weeds of QMK in order to do the more impressive readouts, so right now it&#x2019;s mostly a verification that the keyboard&#x2019;s plugged in. I&#x2019;ve got my board set up to toggle between Mac and Windows modifier layouts, so it&#x2019;s also nice being able to see which OS my keyboard&#x2019;s currently set to. It&#x2019;s my own fault for not leveraging these fully, but again, this is a keyboard and you don&#x2019;t tend to look down at it too much.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Knob-3.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Knob-3.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Knob-3.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Knob-3.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>K n o b s !</figcaption></figure><p>Finally there&#x2019;s the rotary encoders. AKA the knobs. The knobs were a <em>must</em> when I bought the Quefrency, and I wanted to carry that over into the Sofle. They&#x2019;re <em>knobs! <strong>On a keyboard!</strong></em> Come on!</p><p>Okay, I have to admit, they only get a moderate amount of use. Since my Quefrency days, I&apos;ve had my rotary encoders mapped to my system&apos;s volume and media keys. They work well for this use case, but it turns out that the Sofle&apos;s default keymap also has pretty good volume and media hotkeys. <code>Raise + IJKL</code> give you quick access to the keyboard&apos;s arrow keys, and Adam&#x10D;&#xED;k decided to put the volume controls on <code>Raise + Lower + IJKL</code>. If you hold both of your thumbs and push &quot;left and right&quot;, you raise and lower the volume. <code>S</code>hift your fingers down one row, and surprise, there&apos;s your media controls.</p><p>The Sofle Choc was a pretty maximalist build, and it helped me figure out what my priorities are for future keyboards. Rotary encoders aren&#x2019;t the must-have I was making them out to be, and RGB backlighting is once again a nice to have. The advanced functionality that has honestly seen the most amount of use is the basic QMK support. I&apos;ve gone ahead and created a few different macros for things like switching devices on my KVM. It&apos;s hard to deny how nice the <a href="https://www.littlekeyboards.com/products/mbk-glow-keycaps">MBK Glow</a> keycaps look with the purple backlighting, but I may save some money on future builds and skip the per-key LEDs if the keycap ecosystem expands their aesthetic options.</p><h2 id="conclusion">Conclusion</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://flatfootfox.com/content/images/2023/02/Sofle-Angle-1.png" class="kg-image" alt="A Review of the Sofle Choc (Or: A Slow Decent Into Mechanical Keyboard Nerdery)" loading="lazy" width="1600" height="1200" srcset="https://flatfootfox.com/content/images/size/w600/2023/02/Sofle-Angle-1.png 600w, https://flatfootfox.com/content/images/size/w1000/2023/02/Sofle-Angle-1.png 1000w, https://flatfootfox.com/content/images/2023/02/Sofle-Angle-1.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>The Sofle Choc is a great leaping off point into the world of ergo mech keyboards.</figcaption></figure><p>I guess I should have seen this coming, but I never pictured myself becoming a <em>Weird Keyboard Person</em>. My first mechanical keyboard build was mostly a way to pass the time researching and building something during the early days of Covid. I fully expected the Sofle to be <em>way too much</em> and eventually retreat retreat back to my Quefrency.</p><p>I&apos;ve been pleasantly surprised however. The Sofle Choc is a great keyboard! It&apos;s a wonderful entry point into this crazy world of low-profile ergonomic mechanical keyboards. I&#x2019;ve definitely gotten bit by the mechanical keyboard bug, and I&#x2019;m already pondering what my next move may be. I still use a decent number of number keys and modifiers in my day to day work, but the ultra-minimal 42 and 38 key keyboards do have some attractive compactness to them. I&#x2019;m not sure if I&#x2019;m ready to make that jump just yet, but it&#x2019;s certainly within the realm of possibility in the way that it wasn&#x2019;t before. Maybe I&apos;ll research designing my own custom keyboard PCB.</p><p>I hope this was a useful writeup! There are a lot of &#x201C;Intro to Mechanical Keyboard&#x201D; guides out there, and plenty of hyper-enthusiast forum posts and Github readme.md files floating around, but I feel like it can often be tricky to transition from the former into the later. I enjoy writing these brain-dump &quot;How did I get here?&quot; pieces to try and connect those dots. Hopefully this gave you a few new terms to Google if nothing else.</p><p>The Sofle Choc can be purchased as a full kit from <a href="https://choc.brianlow.com">Brian Low</a>. The PCB and other components can also be purchased piecemeal from <a href="https://mkultra.click/sofle-choc-split-keyboard-kit/">MKUltra</a> in the US and <a href="https://42keebs.eu/shop/kits/pro-micro-based/sofle-v2-hotswap-split-ergo-50-kit-black/">42Keebs</a> in the EU.</p>]]></content:encoded></item></channel></rss>