<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://karlb.xyz/feed.xml" rel="self" type="application/atom+xml" /><link href="https://karlb.xyz/" rel="alternate" type="text/html" /><updated>2025-12-05T21:29:44+00:00</updated><id>https://karlb.xyz/feed.xml</id><title type="html">Karl B</title><subtitle>A personal website and sandbox</subtitle><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><entry><title type="html">Making dithered PCB art for KiCad</title><link href="https://karlb.xyz/guides/kicad/dithered-pcb-art/" rel="alternate" type="text/html" title="Making dithered PCB art for KiCad" /><published>2021-05-20T13:00:00+00:00</published><updated>2021-05-20T13:00:00+00:00</updated><id>https://karlb.xyz/guides/kicad/dithered-pcb-art</id><content type="html" xml:base="https://karlb.xyz/guides/kicad/dithered-pcb-art/"><![CDATA[<p>When I decided to make an alternative design for the bottom of the <a href="https://karlb.xyz/kbic65/">KBIC65</a> I eventually settled on trying my hand at creating a <a href="">dithered image</a> for my bottom PCB. This was a little trickier than I expected to get looking like I wanted but I really like the end result. When researching how to do it I had a hard time finding a good tutorial so I thought it might be worth sharing how I did it in the end, so you can produce something nice faster than me. The technique I use to scale and dither the image can be used for other types of engraving or printing, for example laser etching.</p>

<p>The general workflow is as follows</p>
<ol>
  <li>Pick an image and crop away whitespace you do not want</li>
  <li>Resize the image to correspond to the manufacturing resolution</li>
  <li>Use a dithering tool to create a dithered binary version of the image</li>
  <li>Use <a href="https://www.kicad.org/">KiCad</a> bitmap2component to create a footprint from the dithered image</li>
  <li>Import footprint to your project</li>
  <li>Place it as mask or silkscreen</li>
  <li>Order PCB</li>
  <li>Enjoy!</li>
</ol>

<p>At least in the best of worlds.</p>

<h2 id="pick-an-image">Pick an image</h2>
<p>Settle on an image to use, crop it to only the part you want to place on the PCB. I settled on a <a href="https://svs.gsfc.nasa.gov/13641">NASA Solar Dynamics Observatory</a> image.</p>

<p><img src="/assets/images/sun/color_1200.png" width="600" /></p>

<h2 id="resize">Resize</h2>
<p><a href="https://jlcpcb.com/">JLCPCB</a> and probably most other hobby-friendly PCB manufacturers can print at a resolution of about 0.15 mm, which is equivalent to about 169 DPI. JLCPCB <a href="https://jlcpcb.com/capabilities/Capabilities">actually a bit better</a>, but 0.15 mm gives some margin. This means you should try to use 169 DPI or less and I used 169 DPI. Resize your image so that the resolution of the image at your selected DPI gives you the size you want on the board. I wanted my sun to be approximately 90 mm high so I resized to 600px high, which results in an image 90.2 mm high at 169 DPI.</p>

<p><strong>Note</strong> If you want to create dithered art for some other tool, like a laser etcher, you simply just have to figure out the size of the smallest dot or line you can make, which is what I refer to as resolution, and calculate the corresponding DPI.</p>

<p><img src="/assets/images/sun/grayscale_600.png" width="600" /></p>

<h2 id="dither">Dither</h2>
<p>Use a dithering tool to dither your image and create a dithered copy. I strongly recommend <a href="https://29a.ch/ditherlicious/">Ditherlicious</a> but you can look around for other tools you have handy. I also played around with dithering in Corel PaintShop Pro 2019, but didn’t like the result as much, and I believe Photoshop should have some tools for dithering. Once you have rendered your dithered image you should know that it might look funny, or not accurate, if you look at it using less screen pixels than the size of the image.</p>

<p><img src="/assets/images/sun/grayscale_600-dithered.png" width="600" /></p>

<h2 id="create-and-import-footprint-in-kicad">Create and import footprint in KiCad</h2>
<ul>
  <li>Open your KiCad project and then open Convert Image, a.k.a. the bitmap2component tool.</li>
  <li>Import your dithered image, select Negative if necessary, pick either Front Silk Screen or Front Solder Mask and enter your chosen DPI. Click export and put it into a new folder that will become a new KiCad footprint library for you.</li>
  <li>In Pcbnew or your KiCad project, open Preferences &gt; Manage footprint libraries</li>
  <li>Add your new folder as a footprint library</li>
  <li>Import your new PCB art footprint onto your PCB</li>
</ul>

<p><img src="/assets/images/sun/kicad_footprint.png" width="600" /></p>

<h2 id="iterate">Iterate</h2>
<p>Iterate, I played a lot with different dithering tools, changing the image contrast and exposure before conversion etc. The bitmap2component tool does not import dithered image exactly but blends pixels together, therefore I would recommend generating a few variants and comparing them in KiCad and possibly the 3D viewer. Personally, I think the resolution or separation of dots looks better in real life than what the footprint in KiCad did.</p>

<p><strong>Warning</strong> Please note that these images requires quite a bit of processing from KiCad. Updating the 3D view especially, which took about 1-2 min for me on a semi-decent workstation.</p>

<h2 id="manufacture">Manufacture</h2>
<p>Final result after ordering from JLCPCB with black solder mask and ENIG finish.
<img src="/assets/images/sun/pcb_sun_final.jpg" width="600" /></p>

<p>And with a little more context on the back of the KBIC65.
<img src="/assets/images/sun/pcb_bottom_4M.jpg" width="800" /></p>

<h2 id="related-links">Related links</h2>
<ul>
  <li>I found <a href="https://hackaday.io/project/176400/files">this project on Hackaday.io</a> where the creator has tested printing different patterns to test the resolution. TL;DR if I was printing on silkscreen (instead of doing a copper mask) I would aim for 0.10 mm resolution.]</li>
  <li>You can also go crazy and do <a href="https://pixel.curious.supplies/blog/pcb_art/">dithered full color PCB art</a>.</li>
  <li>Some <a href="http://dangerousprototypes.com/forum/index.php?topic=4452.0#p43684">dithered PCB art experiments and discussion</a> I used when figuring out my process</li>
  <li><a href="https://git.jaseg.de/gerbolyze.git/about/">Gerbolyze</a>: Alternative tool I have not tried that adds a dithered image straight to the gerber files</li>
</ul>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="guides" /><category term="kicad" /></entry><entry><title type="html">Automatically generate gerbers from KiCad using GitHub actions and KiBot</title><link href="https://karlb.xyz/guides/kicad/kicad-github-action/" rel="alternate" type="text/html" title="Automatically generate gerbers from KiCad using GitHub actions and KiBot" /><published>2021-05-20T13:00:00+00:00</published><updated>2021-05-20T13:00:00+00:00</updated><id>https://karlb.xyz/guides/kicad/kicad-github-action</id><content type="html" xml:base="https://karlb.xyz/guides/kicad/kicad-github-action/"><![CDATA[<p>To generate gerbers, the production files used to order PCBs, can be a bit tedious in KiCad. For my mechanical keyboard project I have three different PCBs and it doesn’t feel worth generating and zipping the files every time you do some change. Thankfully, there is an automation tool for KiCad, called <a href="https://github.com/INTI-CMNB/kibot">KiBot</a>, and a <a href="https://github.com/marketplace/actions/kicad-exports">GitHub Action wrapper called kicad-export</a> for it so that you can easily create automated workflows that will do all that work for you, straight on GitHub with every push of code!</p>

<p>The kicad-export documentation has a good example, but if you are unfamiliar with GitHub Actions (like myself), there are a few tweaks that might be worth doing. You can <a href="https://github.com/b-karl/KBIC65/blob/main/.github/workflows/generate_gerbers.yml">find my current workflow file here.</a></p>

<h2 id="create-a-kibot-configuration">Create a KiBot configuration</h2>

<p>To run kicad-export we are going to need a KiBot configuration file that tells KiBot what to do. I use JLCPCB to manufacture my PCBs and the KiBot repository has <a href="https://github.com/INTI-CMNB/KiBot/blob/master/docs/samples/JLCPCB.kibot.yaml">an example configuration for JLCPCB</a>. However, for a mechanical keyboard and running it as a GitHub Action workflow we can simplify things a bit.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">kibot</span><span class="pi">:</span>
  <span class="na">version</span><span class="pi">:</span> <span class="m">1</span>

<span class="na">outputs</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">JLCPCB_gerbers</span>
    <span class="na">comment</span><span class="pi">:</span> <span class="s">Gerbers compatible with JLCPCB</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">gerber</span>
    <span class="na">dir</span><span class="pi">:</span> <span class="s">gerbers</span>  
    <span class="na">options</span><span class="pi">:</span> <span class="nl">&amp;gerber_options</span>
      <span class="na">exclude_edge_layer</span><span class="pi">:</span> <span class="no">true</span>
      <span class="na">exclude_pads_from_silkscreen</span><span class="pi">:</span> <span class="no">true</span>
      <span class="na">plot_sheet_reference</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">plot_footprint_refs</span><span class="pi">:</span> <span class="no">true</span>
      <span class="na">plot_footprint_values</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">force_plot_invisible_refs_vals</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">tent_vias</span><span class="pi">:</span> <span class="no">true</span>
      <span class="na">use_protel_extensions</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">create_gerber_job_file</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">disable_aperture_macros</span><span class="pi">:</span> <span class="no">true</span>
      <span class="na">gerber_precision</span><span class="pi">:</span> <span class="m">4.6</span>
      <span class="na">use_gerber_x2_attributes</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">use_gerber_net_attributes</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">line_width</span><span class="pi">:</span> <span class="m">0.1</span>
      <span class="na">subtract_mask_from_silk</span><span class="pi">:</span> <span class="no">true</span>
    <span class="na">layers</span><span class="pi">:</span>
      <span class="c1"># Usually there are no inner layers required for a keyboard PCB,</span>
      <span class="c1"># if you do have inner layers, you need to add additional lines here</span>
      <span class="pi">-</span> <span class="s">F.Cu</span>
      <span class="pi">-</span> <span class="s">B.Cu</span>
      <span class="pi">-</span> <span class="s">F.SilkS</span>
      <span class="pi">-</span> <span class="s">B.SilkS</span>
      <span class="pi">-</span> <span class="s">F.Mask</span>
      <span class="pi">-</span> <span class="s">B.Mask</span>
      <span class="pi">-</span> <span class="s">Edge.Cuts</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">JLCPCB_drill</span>
    <span class="na">comment</span><span class="pi">:</span> <span class="s">Drill files compatible with JLCPCB</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">excellon</span>
    <span class="na">dir</span><span class="pi">:</span> <span class="s">gerbers</span>
    <span class="na">options</span><span class="pi">:</span>
      <span class="na">pth_and_npth_single_file</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">pth_id</span><span class="pi">:</span> <span class="s1">'</span><span class="s">-PTH'</span>
      <span class="na">npth_id</span><span class="pi">:</span> <span class="s1">'</span><span class="s">-NPTH'</span>
      <span class="na">metric_units</span><span class="pi">:</span> <span class="no">false</span>
      <span class="na">output</span><span class="pi">:</span> <span class="s2">"</span><span class="s">%f%i.%x"</span>
</code></pre></div></div>

<p>This config generates gerbers for the layers specified above and the drill file. Normally KiBot could zip these together as well, but since the workflow artifact is naturally zipped there is no need to do this in KiBot. Store the file somewhere in your repository.</p>

<h2 id="create-a-github-action-workflow">Create a GitHub Action workflow</h2>

<p>Once the KiBot config is ready, we can integrate it into a workflow. First step in the workflow file is to set a name and some triggers, the example for kicad-export triggers on changes to .sch and .kicad_pcb file but I think it’s good to expand it a bit.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">name</span><span class="pi">:</span> <span class="s">Generate Gerber files</span>

<span class="na">on</span><span class="pi">:</span>
  <span class="na">push</span><span class="pi">:</span>
    <span class="na">paths</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">**.sch'</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">**.kicad_pcb'</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">.github/**.yml'</span> <span class="c1"># Trigger on changes to the workflow file</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">**.kibot.yml'</span> <span class="c1"># Trigger on changes to the KiBot config file used in the workflow</span>

  <span class="c1"># Repeat for PRs</span>
  <span class="na">pull_request</span><span class="pi">:</span> 
    <span class="na">paths</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">**.sch'</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">**.kicad_pcb'</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">.github/**.yml'</span>
    <span class="pi">-</span> <span class="s1">'</span><span class="s">**.kibot.yml'</span>

  <span class="c1"># To allow for manual triggering from the Action console, add workflow_dispatch</span>
  <span class="na">workflow_dispatch</span><span class="pi">:</span>
    <span class="na">inputs</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span>
        <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Workflow</span><span class="nv"> </span><span class="s">run</span><span class="nv"> </span><span class="s">name'</span>
        <span class="na">required</span><span class="pi">:</span> <span class="no">false</span>
        <span class="na">default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Manual</span><span class="nv"> </span><span class="s">test</span><span class="nv"> </span><span class="s">run'</span>

</code></pre></div></div>

<p>Now we have made sure the workflow gets triggered, let’s add a job!</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>      
  <span class="na">pcb</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v2</span>
    <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">nerdyscout/kicad-exports@v2.3.1</span>
      <span class="na">with</span><span class="pi">:</span>
        <span class="na">config</span><span class="pi">:</span> <span class="s">kicad/jlcpcb_gerbers.kibot.yml</span>
        <span class="na">dir</span><span class="pi">:</span> <span class="s">pcb</span>
        <span class="c1"># The following lines find the schema and PCB files, here it assumes your KiCad project is located in kicad/pcb</span>
        <span class="na">schema</span><span class="pi">:</span> <span class="s1">'</span><span class="s">kicad/pcb/*.sch'</span> 
        <span class="na">board</span><span class="pi">:</span> <span class="s1">'</span><span class="s">kicad/pcb/*.kicad_pcb'</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">upload results</span>
      <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/upload-artifact@v2</span>
      <span class="na">with</span><span class="pi">:</span>
        <span class="na">name</span><span class="pi">:</span> <span class="s">pcb</span>
        <span class="na">path</span><span class="pi">:</span> <span class="s">pcb</span>
</code></pre></div></div>

<p>In my project, I have three separate KiCad project and I add them as separate jobs. This way they are run independently and in parallell, saving some time making sure things are nice and compartmentalized.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Maybe generating an automated workflow for generating gerbers feels unnecessary for hobby hardware projects since you are not likely to produce many actual prototypes. For my mechanical keyboard project I am done with v1.0 and have had it manufactured, but feel like I can start tackling some known areas of improvmement even if I will not have them prototyped any time soon. This workflow helps make these improvements accessible to other who might want to try to have it produced, and of course myself if I have more manufactured in the future.</p>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="guides" /><category term="kicad" /></entry><entry><title type="html">KBIC65 build log</title><link href="https://karlb.xyz/projects/mechanical-keyboards/kbic65/kbic65-build-log/" rel="alternate" type="text/html" title="KBIC65 build log" /><published>2021-05-20T13:00:00+00:00</published><updated>2021-05-20T13:00:00+00:00</updated><id>https://karlb.xyz/projects/mechanical-keyboards/kbic65/kbic65-build-log</id><content type="html" xml:base="https://karlb.xyz/projects/mechanical-keyboards/kbic65/kbic65-build-log/"><![CDATA[<h2 id="overview-of-build-steps">Overview of build steps</h2>

<ul>
  <li>Prepare nice!nano
    <ul>
      <li>Set up ZMK and generate uf2 file</li>
      <li>Load firmware with keymap</li>
    </ul>
  </li>
  <li>Prepare foam/rubber layers (optional)
    <ul>
      <li>Attach plate foam</li>
      <li>Cut out neoprene sheet</li>
    </ul>
  </li>
  <li>Prepare bottom plate
    <ul>
      <li>Attach rubber feet</li>
      <li>Attach spacers to align components</li>
    </ul>
  </li>
  <li>Prepare PCB
    <ul>
      <li>Solder on diodes</li>
      <li>Socket nice!nano</li>
      <li>Test PCB</li>
    </ul>
  </li>
  <li>Prepare and attach stabilizers
    <ul>
      <li>Stabilizer foam / band-aid mod</li>
      <li>Clipping (not necessary)</li>
      <li>shrink tube mod (reverted after testing)</li>
      <li>Lube</li>
      <li>Attach stabilizers</li>
    </ul>
  </li>
  <li>Assemble plate-PCB package
    <ul>
      <li>Attach and solder on switches</li>
      <li>Test assembled module</li>
    </ul>
  </li>
  <li>Assemble keyboard without battery</li>
  <li>Test keyboard</li>
  <li>Add battery</li>
  <li>Test again (now with Bluetooth!)</li>
  <li>Put on keycaps</li>
  <li>Enjoy!</li>
  <li>Remember you were supposed to put on am acrylic window, order it and wait</li>
</ul>

<h2 id="recommended-components">Recommended components</h2>

<ul>
  <li>1 KBIC65 PCB</li>
  <li>1 KBIC65 bottom plate</li>
  <li>1 KBIC65 switch plate</li>
  <li>1 KBIC65 2 mm acrylic window</li>
  <li>1 <a href="https://nicekeyboards.com/nice-nano/">nice!nano</a></li>
  <li>70 <a href="https://en.wikipedia.org/wiki/1N4148_signal_diode">1N4148 diodes</a></li>
  <li>6 domed rubber feet</li>
  <li>24 M2 x 4 mm brass bolts</li>
  <li>8 M2 x 10 mm female-female brass standoffs</li>
  <li>4 M2 x 15 mm female-female brass standoffs</li>
  <li>4 M2 x 3 mm male-female brass standoffs</li>
  <li>70 MX-style switches</li>
</ul>

<p>Bolts and standoffs are most easily acquired via AliExpress, at least in Sweden where I am.</p>

<p>And if you want to put in foam</p>

<ul>
  <li>3-5 mm bottom-PCB foam or rubber (there is 3 mm clearance, 5 mm requires cutting out holes around pins sticking down). I used <a href="https://www.swedol.se/neoprengummipg-1001022.html">3 mm neoprene</a> plus some leftover plate foam on the sides to seal it.</li>
  <li><a href="https://kbdfans.com/collections/keyboard-foam/products/kbdfans-module-foam">Plate-PCB foam</a></li>
</ul>

<h2 id="prepare-nicenano">Prepare nice!nano</h2>

<p>I had been looking at how to create a custom wireless keyboard for a while. My initial research suggested using an Adafruit Feather BLE with QMK, such as the <a href="https://github.com/Nicell/Dissatisfaction-65">Dissatisfaction65 by Nicell</a>, but luckily just a few months earlier Nicell himself had created the nice!nano controller, which is a ProMicro footprint Arduino close with Bluetooth. Even better, I found there was a relatively new keyboard firmware project called <a href="https://zmkfirmware.dev/">ZMK</a>, that addressed a bunch of the issues that QMK has with wireless. The two primary issues resolved by ZMK is (1) more battery-efficient scanning algorithms to improve battery life and (2) a license that is compatible with the Bluetooth libraries since QMK is not legally compatible with the libraries required to run Bluetooth chips.</p>

<p>In addition, however, ZMK has learned a lot from how QMK is used and also improved other aspects of the project, such as minimal user repositories that hosts your personal keymap and keyboard configurations and that then builds the ZMK firmware using GitHub Actions. A really neat setup in my opinion. Of course, they still don’t have VIA or something like the QMK web tool, but in my case I was building my own PCB and matrix and therefore would need to dig into some code either way.</p>

<p>ZMK has pretty good documentation, but it also helped looking at other ZMK user repositories. My recommended reading guide order someone new to ZMK and that would like to replicate my work would be</p>

<ol>
  <li><a href="https://zmkfirmware.dev/docs/">Read the introduction</a></li>
  <li><a href="https://zmkfirmware.dev/docs/faq">Read the FAQ and understand the difference between board and shield</a></li>
  <li><a href="https://zmkfirmware.dev/docs/user-setup">Set up a ZMK user repo</a></li>
  <li><a href="https://zmkfirmware.dev/docs/development/new-shield/">Create a new shield</a></li>
</ol>

<p>I then used the <a href="https://github.com/zmkfirmware/zmk/tree/main/app/boards/shields/nibble">Nibble ZMK shield</a> as a reference, there are probably better options though since the Nibble has an extra column to the left, a multiplexer for the matrix and support for rotary encoders, all of which I didn’t need for my build.</p>

<p>I then created a first keymap, pushed to my <a href="https://github.com/b-karl/zmk-config">personal config repo</a> and with some <a href="https://github.com/b-karl/zmk-config/actions">ZMK GitHub Actions magic</a> I could download a uf2 file to flash my nice!nano with.</p>

<p>The nice!nano was super-easy to flash with a new firmware since it uses a bootloader that makes it show up as a mass-storage device. Then it is simple copy-paste or drag-and-drop of the new .uf2 file to the device and once the transfer is complete it automatically flashes itself and voilà, a new keyboard is detected.</p>

<h2 id="prepare-foam-and-rubber">Prepare foam and rubber</h2>

<h3 id="plate-foam">Plate foam</h3>

<p>This is my second keyboard build, my first was a KBD75v2 kit from KBDfans. For that build I got <a href="https://kbdfans.com/collections/keyboard-foam/products/kbdfans-module-foam">plate foam</a> and I had enough leftover to also cover this build. The modular plate foam is most easily placed using a tweezer to avoid deforming the pieces to much before the glue touches the plate. I also tried to keep the surrounding edges clean since they will be visible from the sides.</p>

<p><img src="/assets/images/kbic65_build_log/20210405_201929.jpg" /></p>

<p>Unfortunately, I was a little too eager with covering everything. It turned out when I was assembling the plate and PCB  that some of the foam I had put in around the stabilizers was pressing on them, so I had to disassemble my work so far and clean up all the foam above and below the stabilizer mounts and along the stabilizer wire.</p>

<h3 id="case-foamrubber">Case foam/rubber</h3>

<p>To add some weight and sound dampening without impeding the wireless signal too much, I decided to add a <a href="https://www.swedol.se/neoprengummipg-1001022.html">3 mm thick neoprene rubber</a> cutout between the PCB and the bottom plate. I took one of my spare PCBs and used it to draw the outline on my neoprene sheet and then I used a carpet knife and a hole puncher to create the shape.</p>

<p><img src="/assets/images/kbic65_build_log/20210405_201821.jpg" /></p>

<h4 id="some-notes-on-silencing-a-mechanical-keyboard-or-controlling-sound-profile">Some notes on silencing a mechanical keyboard (or controlling sound profile)</h4>

<p>Doing some research on how to dampen the sound of the keyboard (since I want to use it at my office in the future without pissing off my colleagues) the factors that I have understood to be most important, and think makes sense from my limited experience with two keyboards are the following</p>

<ul>
  <li>Use a silent linear, silent tactile, linear or tactile switch (on order of most to least silent), a clicky switch is by definition not silent.</li>
  <li>Weight is one of the most important factors, the heavier the better so metal cases are better than plastic ones. This goes in conflict with a wireless build so I opted to aim to make the keyboard as heavy as possible without using metals that might shield the Bluetooth signal.</li>
  <li>Put the keyboard on a soft desk mat.</li>
  <li>Fill up hollow spaces in the keyboard with foam, rubber or some other material. Foam makes most sense usually since it probably has the least impact on the flexibility and motion of the plate and thus the give with each keystroke.</li>
  <li>Use a softer plate material, aluminum is usually considered OK among metal but brass and steel might cause ping sounds.</li>
  <li>Band-aid mod stabilizers and possibly shrink tube mod them.</li>
  <li>Lube stabilizers</li>
  <li>Lube switches</li>
</ul>

<p>If you have done all of the above and want to try something else, you can try - Putting O-rings on the key cap stems. The idea with this is that it will dampen the sound when bottoming out, but it might also make the keys feel more mushy and reduces key travel somewhat. If and how well it works also depends on your key cap profile and materials. This mod is a very loaded subject on r/mk and I think it has very little impact compared to the points above.</p>

<ul>
  <li>Fill larger keycaps, or if you’re extreme all keycaps, with foam to remove and reverb inside the keycap. This mod is most commonly done for the space bar.</li>
</ul>

<h4 id="choice-of-case-foam">Choice of case foam</h4>

<p>Since I wanted my case foam to both be a good sound absorber and provide as much weight as possible the options I found most suitable were:</p>

<ul>
  <li>Sorbothane: Expensive and hard to get in a good size if you have an open case design as my first iteration will be</li>
  <li>Butyl rubber or similar: Used for sound deadening in cars and the best alternative I found was something like <a href="https://www.amazon.com/Dynamat-11101-Dynaliner-Self-Adhesive-Deadener/dp/B001KM9C4C">Dynamat Dynaliner</a>. Issues with this was once again price but I also read that it can smell quite a bit and it takes a while before the smell goes away, which again is maybe not the best choice with an open case design. The benefit would, however, be that it is probably the heaviest of the options around.</li>
  <li>High-density EVA foam: Relatively cheap but dense foam commonly used for cosplay and role playing.</li>
  <li>Neoprene rubber: Also relatively cheap and available.</li>
</ul>

<p>Comparing these I ruled out sorbothane and butyl rubber, leaving HD-EVA and neoprene. Out of these I then looked up the common densities of these materials and neoprene won by a small margin so I settled on neoprene.</p>

<h2 id="prepare-bottom-plate">Prepare bottom plate</h2>

<p>As they always say in keyboard build videos, start with putting rubber feet on your case to protect it from scratches. In addition, it will also be nice to occasionally use the bottom and neoprene sheet as a base when working with the PCB and plate.</p>

<p>For screws and spacers I wanted them to be in brass, or look like golden brass at least. This was a bit tricky to find in Sweden, but I eventually learned that Amazon is a pretty good source for random screws and I picked up <a href="https://www.amazon.se/gp/product/B087N3Z4RY/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&amp;psc=1">this kit</a>, giving me some flexibility if I want to play with the mounting. I attached 10 mm spacers to the bottom and then put the neoprene on for the moment. The neoprene feels like a good soft surface to rest the PCB once diodes, controller and switches are soldered in.</p>

<p><img src="/assets/images/kbic65_build_log/20210405_201831.jpg" />
<img src="/assets/images/kbic65_build_log/20210405_202032.jpg" /></p>

<h2 id="prepare-pcb">Prepare PCB</h2>

<p>There is no real test like getting something to run in real life. I ran checks in KiCad when developing my PCB and in addition, JLCPCB do probe testing to check the PCB. I could, of course, have messed up something more fundamental in my design that wouldn’t be caught in any of these checks.</p>

<p>To get the PCB up and running required two general steps</p>

<ul>
  <li>Attach the nice!nano (which I did by socketing it so I can remove it easily if I want).</li>
  <li>Solder in diodes for all switches.</li>
</ul>

<p>This is essentially just a bunch of soldering and ended up like this for me:</p>

<p><img src="/assets/images/kbic65_build_log/20210405_002633.jpg" /></p>

<p>The tricky part, compared to soldering switches is that these joints are very visible and since the are on one long line, any inconsistencies show easily. I initially tried bending multiple diodes together when they where still in their package tape but I don’t think it really worked better than just bending them one by one with my hands. This was also partially due to the footprint I selected for the diode essentially requiring the diode legs to be bent as close to the diode as possible.</p>

<p>One thing I would be more careful about if I did it again would be to try to be consistent with the amount of solder I used and the amount of time I spent heating up the solder and components. One of the aesthetic issues with the final result is that the solder came through from the back of the board and filled part of the front for several diodes, but not all, and this is probably the inconsistency that bothers me the most.</p>

<h2 id="prepare-and-attach-stabilizers">Prepare and attach stabilizers</h2>

<p>For stabilizers I got <a href="https://keygem.store/products/durock-screw-in-stablizer-v2-set?_pos=4&amp;_sid=b89e1c812&amp;_ss=r">Durock screw-in stabilizers v2</a> with transparent plastic and brass/golden metal details. It was the stabs I could find that I think would go best with the rest of my build (black, white and gold).</p>

<h3 id="6u-stabilizer">6u stabilizer</h3>

<p>For my first build with this PCB I wanted to use a 6u space bar to allow for a 1.25u Right Alt, which is heavily used when typing with a Swedish (or any ISO) layout. I knew they aren’t that common, but luckily the ePBT 9009 kit I got for this keyboard has multiple 6u space bars to choose from. However, later when buying stabilizers I found out that 6u stabilizers are probably even more rare, especially if you want them looking a certain way. Doing a bit of research, the best course of action seemed to bend another stabilizer wire (or some other metal wire) to the correct length. Luckily, my Durock stabilizer set came with a 7u stabilizer wire that I have no plan on using so I took some pliers and a small vice and bent it to the correct size. I had to iterate once, my first bend made the wire slightly too long and it put some unwanted pressure when in stabilizer mount but lucky enough I was able to re-bend it to a good size.</p>

<h3 id="clipping">Clipping</h3>

<p>The Durock stabilizers are designed to not require clipping so did not have to do this step.</p>

<h3 id="stabilizer-foam-band-aid-mod">Stabilizer foam/ band-aid mod</h3>

<p>Instead of doing the actual band-aid mod I was lazy and picked up some <a href="https://kbdfans.com/products/kbdfans-stabilizers-foam-sticker=">KBDfans stabilizer foam stickers</a> when ordering some other stuff.</p>

<p><img src="/assets/images/kbic65_build_log/20210405_204057.jpg" />
<img src="/assets/images/kbic65_build_log/20210405_204042.jpg" /></p>

<h3 id="shrink-tube-mod-failedremoved">Shrink tube mod (failed/removed)</h3>

<p>I had some shrink tube laying around that I thought I could try doing the <a href="https://rama.works/guides#/silencing-stabilisers/">shrink tube mod</a> with. However, I think the shrink tube might have been too big or maybe it doesn’t work as well with the Durock v2 stabilizers, but the stabilizers ended up sticking and being sluggish so I decided to remove them instead.</p>

<h2 id="lube">Lube</h2>

<p>Used Krytox 205g0 to lube the switches since it was the best thing I had available at home.</p>

<h3 id="attaching">Attaching</h3>

<p>After adding the stabilizers and beginning to solder in the first switches I discovered that some of the plate foam I had put it was pressing on the stabilizers, both on the screws (making )</p>

<p><img src="/assets/images/kbic65_build_log/20210407_203201.jpg" />
<img src="/assets/images/kbic65_build_log/20210407_203217.jpg" /></p>

<h2 id="assemble-plate-pcb-package">Assemble plate-PCB package</h2>

<p>The next step was to put together the plate, prepared PCB and all the switches. My choice of switch for this build was the <a href="https://splitkb.com/products/gazzew-boba-u4-silent-tactile-switch">Gazzew Boba U4</a>, a silent and very tactile switch, which I am very satisfied with (since I am using them to type out this build log).</p>

<p>This is pretty well covered in any build log or video, but a good trick is to start with attaching the corner switches. I then also soldered in the switches for keys with stabilizers since I wanted to make sure those keys felt okay before I continued (in case I had to remove all switches and modify the stabilizers, which I did do once).</p>

<p><img src="/assets/images/kbic65_build_log/20210407_205555.jpg" /></p>

<p>Once you have the corners in place, it is fairly easy to attach and solder multiple switches at ones, I did them row by row, and you end up with a plate-PCB package with switches. Almost a full keyboard now!</p>

<p><img src="/assets/images/kbic65_build_log/20210407_215413.jpg" /></p>

<h2 id="test-without-battery">Test without battery</h2>

<p>Just to make sure I didn’t fuck anything up I went back to the computer and made sure the assembled package worked before moving on to attaching the battery.</p>

<h2 id="attaching-the-battery">Attaching the battery</h2>

<p>This was the part of the build I was the least sure of how I was going to do. I had bought a <a href="https://www.electrokit.com/produkt/batteri-lipo-3-7v-130mah/">130 mAh LiPo battery</a>, since I had trouble finding the slightly smaller 301230 110 mAh battery in Sweden that is <a href="https://nicekeyboards.com/docs/nice-nano/">recommended when mounting it under a socketed nice!nano</a>. I was, however, able to find a pretty good solution (in my opinion) since the space between the bottom and PCB ended up being 5 mm with my chosen spacers.</p>

<p>I soldered on a connector with wires to the ground and VCC pins on the back of the PCB and routed so that I could place the battery in the areas with no soldered components with legs sticking down.</p>

<p><img src="/assets/images/kbic65_build_log/20210407_224000.jpg" /></p>

<p>I then made a cut out in the neoprene to house the battery.</p>

<p><img src="/assets/images/kbic65_build_log/20210407_230048.jpg" /></p>

<p>Unfortunately I forgot to take a photo with the actual battery in place as well. I added a small piece of double sided tape on the side of the battery to keep it in place.</p>

<h2 id="test-again-now-with-battery-and-bluetooth">Test again, now with battery, and Bluetooth</h2>

<p>Damn, did it feel good when I paired the keyboard with my desktop and was writing on my own designed wireless keyboard. So cool!</p>

<h2 id="assemble-complete-keyboard">Assemble complete keyboard</h2>

<p>This step is pretty simple, stack all the pieces you have together now and put on the final screws!</p>

<p><img src="/assets/images/kbic65_build_log/20210407_231559.jpg" /></p>

<h2 id="put-on-key-caps">Put on key caps</h2>

<p>So I got an ePBT 9009 kit for this, since my long term goal for this build is to also create a case and the idea is for it to have some 80s-90s computer vibes, like the 9009 color scheme. Also, I got the extra colored Win-key set, really love those and reminds me of using my grandfather’s computers (who is also the inspiration for the glass design on the board) and want that aesthetic. Not complicated to put on keycaps, but now it is more easy to see my chosen layout.</p>

<p><img src="/assets/images/kbic65_build_log/20210407_234048.jpg" /></p>

<h2 id="final-testing">Final testing</h2>

<p>Make sure everything works and feels like you expect it to, which it did! I had a worry that the right arrow key might hit the bottom right case screw when pressed down fully but luckily it just about fits without any modification, win! And now you can just enjoy your keyboard!</p>

<p>Oh, wait…</p>

<h2 id="design-and-order-an-acrylic-window-for-the-top">Design and order an acrylic window for the top</h2>

<p>I wasn’t sure how if I should use an acrylic window covering all eight screws on top or if the overlap would look weird so I created two versions. One covering all eight screws on the top part, and one version that only uses the four screw holes on the top of the bottom, which is a bit weaker structurally. I ordered both versions and in both 2 mm and 3 mm clear acrylic to test at home.</p>

<p>Turns out 2 mm acrylic is plenty strong with this amount of screws and without a case the eight screw mount version definitely looks better in my opinion. I do plan on designing a case for it and might use the four screw mount window pieces I now have left over as the window in that case. instead.</p>

<p>And with the acrylic window on, version 1 of the KBIC65, aka Observer65, is finally complete!</p>

<p><img src="/assets/images/kbic65_build_log/desk_with_mouse_and_camera.jpg" /></p>

<h2 id="notes-if-i-ever-make-a-v2-or-if-someone-attempts-a-gb">Notes if I ever make a V2 or if someone attempts a GB</h2>

<h3 id="pcb-front-glasses-should-be-in-copper">PCB front glasses should be in copper</h3>

<p>I accidentally forgot to remove a silk screen version of the glasses on the front of the PCB, resulting in what should have been bare gold-ENIG finish copper glasses being white silk screen instead (with a tiny, almost indistinguishable copper margin around them).</p>

<h3 id="add-holes-for-soldering-on-a-battery-connector">Add holes for soldering on a battery connector</h3>

<p>I did not plan enough for attaching the battery and the design would have been neater if there were ports for soldering a battery connector directly.</p>

<h3 id="maybe-make-space-bar-cutouts-in-plate-andor-pcb-to-house-battery">Maybe make space bar cutouts in plate and/or PCB to house battery</h3>

<p>I originally had a plan to put the battery between the PCB and the plate. Unfortunately the battery I got was too thick (there are thinner ones though) but it could possibly have fit if I had more cutouts around the space bar and put the battery there. The current solutions is not that bad though and will allow me to put in a larger battery as long as it is at most 5 mm thick.</p>

<h3 id="move-the-jlcpcb-manufacturing-number-on-the-bottom-plate">Move the JLCPCB manufacturing number on the bottom plate</h3>

<p>If you choose to have the sun image facing out on the bottom, the production number from JLCPCB will show upward on the edge of the bottom plate, would probably be better to put it on the side or top somewhere instead.</p>

<h2 id="update-august-2021">Update August 2021</h2>

<p>I ordered new spacers and found that M2x15mm female-female and M2x3mm+4mm thread male-female spacers are a much better combo for the top window (reduces height different to 0.4mm, which is OK). In addition, Nicell released the <a href="https://nicekeyboards.com/nice-nano">nice!nano v2.0</a> and <a href="https://zmk.dev/blog/2021/07/17/zephyr-2-5">ZMK released a Zephyr update</a>. Biggest difference is probably the nice!nano v2.0 but the combination has probably pushed my battery life using a 130 mAh LiPo battery to 2 months! Also, having used the keyboard for a while now, I just love the feel. I think the combination Boba U4 switches and the neoprene and foam filled FR4 stack just hits the spot for me.</p>

<p>After a <a href="https://github.com/b-karl/KBIC65/issues/1">request on GitHub</a> I have also <a href="https://github.com/b-karl/qmk_firmware/tree/add-kbic65-keyboard">created a QMK fork for the KBIC65</a> that I have confirmed works using an Elite-C rev 4.</p>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="projects" /><category term="mechanical-keyboards" /><category term="kbic65" /></entry><entry><title type="html">Selecting components</title><link href="https://karlb.xyz/projects/mechanical-keyboards/selecting-components/" rel="alternate" type="text/html" title="Selecting components" /><published>2020-07-31T13:00:00+00:00</published><updated>2020-07-31T13:00:00+00:00</updated><id>https://karlb.xyz/projects/mechanical-keyboards/selecting-components</id><content type="html" xml:base="https://karlb.xyz/projects/mechanical-keyboards/selecting-components/"><![CDATA[<p>It is now time to pick and order parts for my keyboard. Having talked to some friends, felt around some mechanical keyboards and using the T440 keyboard as a inspiration I decided I want to build a 75% compact layout with tactile switches and generally try to make it as quiet as possible.</p>

<p>After recommendation from a colleague, I decided to go with the following components:</p>
<ul>
  <li><a href="https://kbdfans.com/collections/diy-kit/products/kbd75v2-custom-keyboard-diy-kit">KBDFANS KBD75 keyboard</a>
    <ul>
      <li>Compact TKL layout: has F1-F12 and arrow keys</li>
      <li>CNC milled aluminum case</li>
      <li>Opted for an aluminum plate due to reading they have better acoustics for a silent keyboard</li>
    </ul>
  </li>
  <li><a href="https://kbdfans.com/collections/dsa-profile/products/kbdfans-dsa-dye-sub-keycaps">KBDFANS DSA Dye-sub PBT keycaps</a>
    <ul>
      <li>Uniform keycaps so that it easy to move around keycaps, also low profile to reduce height of keyboard</li>
    </ul>
  </li>
  <li><a href="https://kbdfans.com/collections/aliaz-switches/products/pre-orderaliaz-silent-switch-tactile?variant=2519899799565">Gateron/KBDFANS Aliaz 70g silent tactile switches</a>
    <ul>
      <li>70g is supposed to be the approximate weight of Thinkpad switches</li>
    </ul>
  </li>
  <li><a href="https://kbdfans.com/products/kbd75-case-foam?_pos=3&amp;_sid=ceffd2fa6&amp;_ss=r">Case-to-PCB foam</a> and <a href="https://kbdfans.com/products/kbdfans-module-foam?_pos=1&amp;_sid=ceffd2fa6&amp;_ss=r">PCB-to-plate foam</a> to minimize reverb</li>
  <li>Some individually colored DSA keycaps to make it more fun from <a href="https://pimpmykeyboard.com/">Signature Plastics</a> (also to compare quality since Signature Plastics are considered very high quality)</li>
</ul>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="projects" /><category term="mechanical-keyboards" /><summary type="html"><![CDATA[It is now time to pick and order parts for my keyboard. Having talked to some friends, felt around some mechanical keyboards and using the T440 keyboard as a inspiration I decided I want to build a 75% compact layout with tactile switches and generally try to make it as quiet as possible.]]></summary></entry><entry><title type="html">Where To Learn About Mechanical Keyboards</title><link href="https://karlb.xyz/projects/mechanical-keyboard/where-to-learn/" rel="alternate" type="text/html" title="Where To Learn About Mechanical Keyboards" /><published>2020-07-31T13:00:00+00:00</published><updated>2020-07-31T13:00:00+00:00</updated><id>https://karlb.xyz/projects/mechanical-keyboard/where-to-learn</id><content type="html" xml:base="https://karlb.xyz/projects/mechanical-keyboard/where-to-learn/"><![CDATA[<p>I won’t go into the details about how and why mechanical keyboards and the community exists because there are already a ton of great articles and resources out there about it. Some that I have read and find interesting:</p>

<ul>
  <li><a href="https://drop.com/talk/10016/anatomy-of-a-mechanical-keyboard">Drop.com: Anatomy Of A Mechanical Keyboard</a></li>
  <li><a href="https://matt3o.com/all-you-need-to-build-a-custom-keyboard/">Matt3o.com: How To Build A Keyboard</a></li>
  <li><a href="https://www.smashingmagazine.com/2020/05/complete-guide-mechanical-keyboards/">Smashing Magazine: A Complete Guide To Mechanical Keyboards</a></li>
  <li><a href="https://www.theverge.com/2019/6/21/18683728/mechanical-keyboard-diy-building-guide-how-to-75-percent-pcb-case-zealio-keyswitches-zealpc">The Verge: How And Why I Built My First Mechanical Keyboard</a></li>
</ul>

<p>Once you decide to delve deeper or want to buy or build something yourself the next step is often:</p>
<ul>
  <li><a href="https://www.reddit.com/r/MechanicalKeyboards/">Reddit: Mechanical Keyboards</a>: General mechanical keyboard photos, a lot of pretty photos and help for people new and old in the hobby. They have a <a href="https://www.reddit.com/r/MechanicalKeyboards/wiki/index">pretty nice wiki</a>, even if it is a bit messy to navigate.</li>
  <li><a href="https://www.reddit.com/r/olkb/">Reddit: OLKB</a>: Support forum for OLKB (vendor) but more importantly the main support place for QMK questions on Reddit.</li>
  <li><a href="https://geekhack.org/index.php">GeekHack</a>: Old-school forum for mechanical keyboards and related things.</li>
  <li>Discord servers:
    <ul>
      <li><a href="https://discord.gg/kbdfans">KBDFANS</a> for everything related to KBDFANS plus guides and stuff</li>
      <li><a href="http://mekaniskatangentbord.se">mekaniskatangentbord.se</a> is the most active Swedish mechanical keyboard community I have found</li>
    </ul>
  </li>
</ul>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="projects" /><category term="mechanical-keyboard" /><summary type="html"><![CDATA[I won’t go into the details about how and why mechanical keyboards and the community exists because there are already a ton of great articles and resources out there about it. Some that I have read and find interesting:]]></summary></entry><entry><title type="html">Mission: Keyboard</title><link href="https://karlb.xyz/projects/mechanical-keyboards/mission-keyboard/" rel="alternate" type="text/html" title="Mission: Keyboard" /><published>2020-07-13T13:00:00+00:00</published><updated>2020-07-13T13:00:00+00:00</updated><id>https://karlb.xyz/projects/mechanical-keyboards/mission-keyboard</id><content type="html" xml:base="https://karlb.xyz/projects/mechanical-keyboards/mission-keyboard/"><![CDATA[<p>I’ve been looking at mechanical keyboards for about 1-2 years now. Initially when I heard about a friend who had built one a few years back, my thoughts were like “Wow, it’s not worth spending that much money on a keyboard” and “Why do you want a loud keyboard? Noise is like the worst thing about them”. Around the same time I had just gotten my first Thinkpad, a T440, and over time I slowly realized the joy of typing on a nice keyboard.</p>

<p>Since then I started thinking more about ergonomics and my home office setup and have slowly done each component:</p>
<ul>
  <li>Got an adjustable desk</li>
  <li>Got a 27” 4K IPS panel on an hydraulic VESA arm</li>
  <li>Replaced my mouse with a Logitech MX Master 2</li>
  <li>Got a 60x80 cm^2 cutting mat as a desk mat (maybe not important for ergonomics but it’s sooo nice with a giant desk mat and no mouse pad)</li>
</ul>

<p>The thing I have not been able to figure it was the keyboard. I mostly love the T440 keyboard, especially after having some work laptops from HP and Dell, and thought “Hey, if Lenovo can make nice laptop keyboards they should also have some nice stand-alone keyboards?”. Boy was I wrong. I picked up the (Lenovo Professional Wireless Keyboard and Mouse)[https://www.lenovo.com/us/en/accessories-and-monitors/keyboards-and-mice/keyboard-and-mouse-combos/KB-MICE-BO-Mouse-and-KBD-Combo-USE/p/4X30H56796] and not only did it lack the feel of the Thinkpad keyboard, keycaps got stuck and wobbly and the feel just worse, whereas the Thinkpad keyboard almost gets better with age.</p>

<p>I have since then learned there is (another Lenovo keyboard)[https://www.lenovo.com/us/en/accessories-and-monitors/keyboards-and-mice/keyboards/KEYBOARD-US-English/p/0B47190] with a closer feel to the Thinkpad but a lot of reviews still say it’s not good enough. But before trying another Lenovo membrane board I had already started looking into the world of mechanical keyboards and the idea of building something with feel and look personalized to my taste had been planted.</p>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="projects" /><category term="mechanical-keyboards" /><summary type="html"><![CDATA[I’ve been looking at mechanical keyboards for about 1-2 years now. Initially when I heard about a friend who had built one a few years back, my thoughts were like “Wow, it’s not worth spending that much money on a keyboard” and “Why do you want a loud keyboard? Noise is like the worst thing about them”. Around the same time I had just gotten my first Thinkpad, a T440, and over time I slowly realized the joy of typing on a nice keyboard.]]></summary></entry><entry><title type="html">My first mechanical keyboard</title><link href="https://karlb.xyz/projects/mechanical-keyboards/first-mk/" rel="alternate" type="text/html" title="My first mechanical keyboard" /><published>2020-07-09T13:00:00+00:00</published><updated>2020-07-09T13:00:00+00:00</updated><id>https://karlb.xyz/projects/mechanical-keyboards/first-mk</id><content type="html" xml:base="https://karlb.xyz/projects/mechanical-keyboards/first-mk/"><![CDATA[<p>So I ordered a DIY-kit to build my first mechanical keyboard. I will log my research and progress in this blog as I traverse down the rabbit hole of mechanical keyboards.</p>]]></content><author><name>Karl Berggren</name><email>berggren.karl@gmail.com</email></author><category term="projects" /><category term="mechanical-keyboards" /><summary type="html"><![CDATA[So I ordered a DIY-kit to build my first mechanical keyboard. I will log my research and progress in this blog as I traverse down the rabbit hole of mechanical keyboards.]]></summary></entry></feed>