{"id":3956,"date":"2026-09-07T00:05:53","date_gmt":"2026-09-06T16:05:53","guid":{"rendered":"https:\/\/tzlee.com\/blog\/?p=3956"},"modified":"2026-09-07T00:06:45","modified_gmt":"2026-09-06T16:06:45","slug":"novelkeys-x-kalih-big-switch-case-and-software","status":"publish","type":"post","link":"https:\/\/tzlee.com\/blog\/2026\/09\/novelkeys-x-kalih-big-switch-case-and-software\/","title":{"rendered":"NovelKeys x Kalih Big Switch Case and Software"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I got 3 NovelKeys x Kalih Big Switches as a gift some time ago and decided to finally put them together. I made a single version and a dual version, and then made my kids try playing Geometry Dash on it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tip: If you want to save your ears, don&#8217;t buy the clicky version for a game like Geometry Dash.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Repository: <a href=\"https:\/\/github.com\/detach8\/bigswitch\">https:\/\/github.com\/detach8\/bigswitch<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Single Switch<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/images\/single_front.jpg?raw=true\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The  Single Switch case is made out of a one-piece 3D printed frame, with the PCB mounted at the bottom.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/detach8\/bigswitch#single-case\"><\/a>3D print<a href=\"https:\/\/github.com\/detach8\/bigswitch#3d-print\"><\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>STL file:\u00a0<a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/stl\/bigswitch_single.stl\"><code>bigswitch_single.stl<\/code><\/a><\/li>\n\n\n\n<li>Also on Thingiverse:\u00a0<a href=\"https:\/\/www.thingiverse.com\/thing:7405138\">thingiverse.com\/thing:7405138<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Parts to buy<a href=\"https:\/\/github.com\/detach8\/bigswitch#parts-to-buy\"><\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PCB<\/strong>:\u00a0<a href=\"https:\/\/keeb.io\/products\/big-switch-pcb-pro-micro\">Big Switch PCB<\/a>\u00a0(keeb.io)<\/li>\n\n\n\n<li><strong>Pro Micro (ATmega32U4)<\/strong>\u00a0&#8211; buy separately and solder it to the PCB yourself<\/li>\n\n\n\n<li><strong>Screws<\/strong>: 4x M2x10<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Assembly<a href=\"https:\/\/github.com\/detach8\/bigswitch#assembly\"><\/a><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Slot the PCB from the bottom and screw it into place using 4x M2x10 screws.<\/li>\n\n\n\n<li>Install the switch from the top (spot-solder the pins, or use a\u00a0<a href=\"https:\/\/github.com\/detach8\/bigswitch#spacers-for-loose-switch-pins\">spacer<\/a>\u00a0if they&#8217;re loose and you&#8217;d rather not solder).<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Double Switch<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/github.com\/detach8\/bigswitch\/raw\/master\/images\/double_front.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The Double Switch case is made out of a two-piece 3D printed construction, with the PCB sandwiched in between the two &#8211; to be precise, it is mounted on top of the bottom frame.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/detach8\/bigswitch#double-case\"><\/a>3D print<a href=\"https:\/\/github.com\/detach8\/bigswitch#3d-print-1\"><\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>STL files:\u00a0<a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/stl\/bigswitch_double_top.stl\"><code>bigswitch_double_top.stl<\/code><\/a>\u00a0+\u00a0<a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/stl\/bigswitch_double_bottom.stl\"><code>bigswitch_double_bottom.stl<\/code><\/a>\u00a0(two parts)<\/li>\n\n\n\n<li>Also on Thingiverse:\u00a0<a href=\"https:\/\/www.thingiverse.com\/thing:7405278\">thingiverse.com\/thing:7405278<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Parts to buy<a href=\"https:\/\/github.com\/detach8\/bigswitch#parts-to-buy-1\"><\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PCB<\/strong>:\u00a0<a href=\"https:\/\/keeb.io\/products\/tukey-1x2-big-switch-macropad\">Tukey 1&#215;2 Big Switch Macropad<\/a>\u00a0(keeb.io)<\/li>\n\n\n\n<li><strong>Pro Micro (ATmega32U4)<\/strong>\u00a0&#8211; buy separately and solder it to the PCB yourself<\/li>\n\n\n\n<li><strong>Screws for PCB<\/strong>: 8x M3x6 + 8x M3x3 heat-set inserts<\/li>\n\n\n\n<li><strong>Screws for Case<\/strong>: 5x M3x10 + 5x M3x4 heat-set inserts<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Assembly<a href=\"https:\/\/github.com\/detach8\/bigswitch#assembly-1\"><\/a><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Affix the 8 M3x3 heat-set inserts on the bottom case for the PCB. It should match the 8 screw holes of the PCB.<\/li>\n\n\n\n<li>Screw the PCB onto the bottom case. (The PCB sits on top.)<\/li>\n\n\n\n<li>Affix the 5 M3x4 heat-set inserts on the top case for the mating screws.<\/li>\n\n\n\n<li>Screw the top and bottom cases together.<\/li>\n\n\n\n<li>Install the switches from the top (spot-solder the pins, or use a\u00a0<a href=\"https:\/\/github.com\/detach8\/bigswitch#spacers-for-loose-switch-pins\">spacer<\/a>\u00a0if they&#8217;re loose and you&#8217;d rather not solder).<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Spacers for loose switch pins<a href=\"https:\/\/github.com\/detach8\/bigswitch#spacers-for-loose-switch-pins\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I made two thin shims for contact pins because they were rather loose &#8211; especially the double switch (Keeb.io Tukey 1&#215;2 Macropad) PCB.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stuffing one of these into the contact slots would help hold the pin snug without solder \u2014 useful if you don&#8217;t want to solder the switches in. Two variants are available: 0.6mm (marked &#8220;6&#8221;) and 0.8mm (marked &#8220;8&#8221;).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That said,&nbsp;<strong>spot-soldering the switch pins is recommended<\/strong>. It&#8217;s a more reliable, permanent connection than a friction-fit spacer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Software<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I originally wrote simple, hardcoded code using Arduino IDE, but decided to explore QMK (and later VIA) since I&#8217;ve never done that before.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both run on a\u00a0<code>promicro<\/code>\u00a0(ATmega32U4, Caterina bootloader) and managed to get VIA support built in.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Flash the firmware<a href=\"https:\/\/github.com\/detach8\/bigswitch#1-flash-the-firmware\"><\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Prebuilt firmware (the&nbsp;<code>via<\/code>&nbsp;keymap) is already in&nbsp;<a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/firmware\"><code>firmware\/<\/code><\/a>&nbsp;\u2014 most people can just flash this and skip straight to configuring it with VIA. No build environment needed for this step.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Install\u00a0<a href=\"https:\/\/github.com\/qmk\/qmk_toolbox\/releases\">QMK Toolbox<\/a>.<\/li>\n\n\n\n<li>Open QMK Toolbox and load the\u00a0<code>.hex<\/code>\u00a0file for your board:\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/firmware\/tzlee_bigswitch_single_via.hex\"><code>firmware\/tzlee_bigswitch_single_via.hex<\/code><\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/firmware\/tzlee_bigswitch_double_via.hex\"><code>firmware\/tzlee_bigswitch_double_via.hex<\/code><\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Put the board into its bootloader (Pro Micro \/ Caterina):\n<ul class=\"wp-block-list\">\n<li>Briefly short the\u00a0<strong>GND<\/strong>\u00a0and\u00a0<strong>RST<\/strong>\u00a0pins on the Pro Micro twice in quick succession (within about a second).<\/li>\n\n\n\n<li>The onboard LED will pulse\/fade to indicate bootloader mode, and a new serial port will appear briefly.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click\u00a0<strong>Flash<\/strong>\u00a0in QMK Toolbox as soon as the board enters bootloader mode.<\/li>\n\n\n\n<li>Wait for &#8220;Flash complete&#8221; in the log, then unplug\/replug the board.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer the command line? With the board in bootloader mode:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Configure with VIA<a href=\"https:\/\/github.com\/detach8\/bigswitch#2-configure-with-via\"><\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">These boards aren&#8217;t in VIA&#8217;s official keyboard registry, so you load their definitions manually via VIA&#8217;s Design tab:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to\u00a0<a href=\"https:\/\/www.usevia.app\/\">https:\/\/www.usevia.app\/<\/a>.<\/li>\n\n\n\n<li>Open\u00a0<strong>Settings<\/strong>\u00a0(gear icon) \u2192 enable\u00a0<strong>Show Design tab<\/strong>. A new paint brush icon appears.<\/li>\n\n\n\n<li>Open\u00a0<strong>Design<\/strong>\u00a0(paint brush icon) \u2192\u00a0<strong>Load Draft Definition<\/strong>\u00a0and select the JSON matching your board:\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/via\/tzlee_bigswitch_single_via.json\"><code>tzlee_bigswitch_single_via.json<\/code><\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/detach8\/bigswitch\/blob\/master\/via\/tzlee_bigswitch_double_via.json\"><code>tzlee_bigswitch_double_via.json<\/code><\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Plug in the flashed keyboard. VIA should detect it automatically by its VID\/PID and switch to the\u00a0<strong>Configure<\/strong>\u00a0tab.<\/li>\n\n\n\n<li>Click each key in the layout diagram and assign a new keycode from the panel on the right. Changes apply instantly.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The rest of this section is only for building your own firmware from source (custom keycodes, layers, or hardware changes).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Install QMK MSYS<a href=\"https:\/\/github.com\/detach8\/bigswitch#3-install-qmk-msys\"><\/a><\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Tip: Skip this and the next section if the prebuilt firmware and VIA remapping above already do what you need \u2014 you don&#8217;t need a build environment just to flash and remap keys.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Warning: <strong>VIA compatibility requires QMK 0.25.x.<\/strong>\u00a0As of this writing (September 2026), VIA only understands keymap format version 8. QMK moved to keymap version 9 after the 0.25.x release line, and current VIA builds do not support it \u2014 a firmware built from a newer QMK will\u00a0<strong>not<\/strong>\u00a0be recognized by VIA (it&#8217;ll complain that the keymap version is unsupported). If you&#8217;re building your own firmware for use with VIA, make sure your\u00a0<code>qmk_firmware<\/code>\u00a0checkout is pinned to a\u00a0<code>0.25.x<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">QMK MSYS is the all-in-one Windows build environment for QMK (bundles the toolchain, Git, and the&nbsp;<code>qmk<\/code>&nbsp;CLI). On macOS\/Linux, use the regular&nbsp;<a href=\"https:\/\/docs.qmk.fm\/#\/newbs_getting_started\">QMK CLI setup<\/a>&nbsp;instead.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Download the latest installer from\u00a0<a href=\"https:\/\/msys.qmk.fm\/\">msys.qmk.fm<\/a>\u00a0(or the\u00a0<a href=\"https:\/\/github.com\/qmk\/qmk_distro-msys\/releases\">qmk_distro-msys releases page<\/a>).<\/li>\n\n\n\n<li>Run the installer and launch\u00a0<strong>QMK MSYS<\/strong>\u00a0from the Start menu.<\/li>\n\n\n\n<li>Clone QMK and set up your build environment:qmk setupAccept the defaults.This clones\u00a0<code>qmk_firmware<\/code>\u00a0into your home directory and installs the AVR\/ARM toolchains.<\/li>\n\n\n\n<li><strong>Checkout a VIA-compatible release.<\/strong>The previous step checks out the latest\u00a0<code>master<\/code>, which is on keymap version 9 and will produce firmware VIA can&#8217;t configure. Check out a\u00a0<code>0.25.x<\/code>\u00a0tag instead:cd ~\/qmk_firmware git fetch &#8211;tags git checkout 0.25.22 # or the latest 0.25.x tag qmk git-submodule<\/li>\n\n\n\n<li>Confirm everything is working:qmk doctor<\/li>\n\n\n\n<li>Copy this repository&#8217;s\u00a0<code>keyboards\/tzlee<\/code>\u00a0folder into your QMK\u00a0<code>keyboards\/<\/code>\u00a0folder so QMK can find it:cp -r keyboards\/tzlee ~\/qmk_firmware\/keyboards\/tzleeFrom here on, all\u00a0<code>qmk<\/code>\/<code>make<\/code>\u00a0commands are run from inside your\u00a0<code>qmk_firmware<\/code>\u00a0checkout (you can\u00a0<code>cd ~\/qmk_firmware<\/code>\u00a0in the QMK MSYS terminal).<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">4. Modify the QMK defs and build\/flash your own version<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/detach8\/bigswitch#4-modify-the-qmk-defs-and-buildflash-your-own-version\"><\/a>Everything about a board lives under\u00a0<code>keyboards\/tzlee\/&lt;board>\/<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Change the keymap<\/strong>\u00a0(what each key sends): edit\u00a0<code>keyboards\/tzlee\/&lt;board>\/keymaps\/via\/keymap.c<\/code>\u00a0(keeps VIA support), or\u00a0<code>keyboards\/tzlee\/&lt;board>\/keymaps\/default\/keymap.c<\/code>\u00a0(no VIA). Add more layers, tap dance, macros, etc. as with any QMK keymap.<\/li>\n\n\n\n<li><strong>Change hardware definitions<\/strong>\u00a0(matrix pins, VID\/PID, diode direction): edit\u00a0<code>keyboards\/tzlee\/&lt;board>\/keyboard.json<\/code>. If you change the VID\/PID or the matrix layout, update the matching file in\u00a0<code>via\/<\/code>\u00a0to match, so VIA can still recognize the board and map its keys correctly.<\/li>\n\n\n\n<li><strong>Add a new keymap<\/strong>\u00a0of your own instead of editing\u00a0<code>via<\/code>\/<code>default<\/code>\u00a0in place:qmk new-keymap -kb tzlee\/bigswitch_single<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Build and flash (from inside&nbsp;<code>qmk_firmware<\/code>, board plugged in and in bootloader mode):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Build only\nqmk compile -kb tzlee\/bigswitch_single -km via\n\n# Build and flash in one step\nqmk flash -kb tzlee\/bigswitch_single -km via<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Swap\u00a0<code>bigswitch_single<\/code>\u00a0for\u00a0<code>bigswitch_double<\/code>, and\u00a0<code>via<\/code>\u00a0for the name of any keymap you created. The resulting\u00a0<code>.hex<\/code>\u00a0is written to the\u00a0<code>qmk_firmware<\/code>\u00a0root (or the location\u00a0<code>qmk compile<\/code>\u00a0reports) \u2014 copy it into\u00a0<code>firmware\/<\/code>\u00a0here if you want to keep it alongside the prebuilt ones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I got 3 NovelKeys x Kalih Big Switches as a gift some time ago and decided to finally put them together. I made a single version and a dual version, and then made my kids try playing Geometry Dash on it. Tip: If you want to save your ears, don&#8217;t buy the clicky version for [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[652,8],"tags":[],"class_list":["post-3956","post","type-post","status-publish","format-standard","hentry","category-lifestyle","category-tech"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/posts\/3956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/comments?post=3956"}],"version-history":[{"count":3,"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/posts\/3956\/revisions"}],"predecessor-version":[{"id":3959,"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/posts\/3956\/revisions\/3959"}],"wp:attachment":[{"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/media?parent=3956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/categories?post=3956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tzlee.com\/blog\/wp-json\/wp\/v2\/tags?post=3956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}