Skip to the content
PCBKitNew board
2 layers145.3 × 119.5 mmFortemis left, the printed circuit board in 3D

The Fortemis Keyboard (Forager+Ferris Sweep+Totem)

Size
145.3 × 119.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
26
Nets
24
Pads
182
Tracks, vias
445, 178
Pours
6
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
8 Oct 2026
Updated
28 Oct 2026

Overview

Fortemis left is an open-source printed circuit board by colincreasman, from the colincreasman/fortemis repository on GitHub. It is a 2-layer board of 145.3 × 119.5 mm with 26 parts on 24 nets, routed with 445 tracks and 178 vias.

It is built around the SMTSO2020MTJ and MSK12C02. It belongs with the keyboards and input boards and the nRF52 and nRF5x boards of this library.

Main components

2

README

README.md

Fortemis ZMK Config

ZMK config for the Fortemis keyboard (Forager+Totem+FerrisSweep)

Hardware design

Fortemis is designed from scratch with Ergogen, KiCad and a Forager-style enclosed case. It has the Ferris Sweep's column stagger, TOTEM's column splay, and three thumb keys per half on the Totemist's thumb arc, 15 mm farther out than the Totemist's. None has been built yet, so nothing has been tried on hardware.

  • docs/requirements.md: goals and requirements
  • docs/design-log.md: design decisions and progress
  • docs/build-guide.md: parts list and how to build one
  • ergogen/: the Ergogen layout config, footprints and build tools
  • pcb/: KiCad 10 projects for both halves (routed); pcb/fab/: Gerber zips to order, and BOM and placement files for PCB assembly
  • case/: STL files to print, a top and a base for each half, in two styles: the Forager-style enclosed case and the Totemist-style sandwich case, whose rim comes up to the keycap tops (compare them)

Rebuild the PCBs from ergogen/config.yaml (needs node, KiCad 10 and Java 25+):

sh
python3 ergogen/tools/pcb.py build   # Ergogen -> pcb/*.kicad_pcb
python3 ergogen/tools/pcb.py route   # Freerouting + GND pours, then DRC (re-routed until clean)
python3 ergogen/tools/pcb.py drc     # DRC summary only
python3 ergogen/tools/pcb.py fab     # Gerbers + drill -> pcb/fab/*.zip, BOM + placement CSVs

Rebuild the cases from the PCBs (needs KiCad 10 and pip install -r ergogen/tools/requirements.txt):

sh
python3 ergogen/tools/case.py            # enclosed case: case/enclosed/*.stl and docs/img/case.png
python3 ergogen/tools/case_sandwich.py   # sandwich case: case/sandwich/*

Fortemis case

Firmware

This repository is also the keyboard's ZMK module and config, on ZMK v0.3.0.

  • boards/shields/fortemis/: the shield: pins, keymap and the key layout ZMK Studio draws
  • build.yaml: the firmware images to build; config/west.yml: ZMK and module versions
  • zmk-rgbled-widget shows battery and connection status on the XIAO's RGB LED, which the case's light pipe carries to the USB-C end
  • ZMK Studio works with the left half (or the dongle), over USB or Bluetooth. Unlock it with the maintenance layer's U (below).

The keymap (boards/shields/fortemis/fortemis.keymap) is the owner's Forager keymap: QWERTY with home-row mods and four layers. The near and far thumbs keep the Forager thumbs' keys, and the new tuck thumbs are Esc (tap) / media layer (hold) on the left and Delete on the right.

Holding both near thumbs (Enter + Backspace) gives the maintenance layer:

KeyDoes
Q or P, held 2 sReboots that half into its bootloader
T, held 2 sReboots the central (the left half, or the dongle in dongle mode) into its bootloader
A S D F GBluetooth profiles 0 to 4
WClears the current Bluetooth profile
UUnlocks ZMK Studio

Building

Push to GitHub: the Build ZMK firmware action builds every image, and the run's firmware artifact holds the .uf2 files. Or build them locally with Docker:

sh
ergogen/tools/zmk_build.sh   # every image in build.yaml -> firmware/*.uf2

The pin lists and Studio's key layout in the shield are generated from the PCBs, so re-run this after changing a PCB (needs KiCad 10 and pip install -r ergogen/tools/requirements.txt):

sh
python3 ergogen/tools/zmk.py           # update the shield from pcb/*.kicad_pcb
python3 ergogen/tools/zmk.py --check   # only check; fails if the shield and the PCBs differ

Flashing

  1. Plug the half into a computer and double-press its reset button. On an assembled half, press the lever in the case floor, near the USB-C port, twice. The XIAO shows up as a USB drive (usually named XIAO-SENSE).
  2. Copy the half's .uf2 file onto the drive. The half restarts with the new firmware.
FileFlash toMode
fortemis_left rgbled_adapter-seeeduino_xiao_ble-zmk.uf2left halfstandalone
fortemis_right rgbled_adapter-seeeduino_xiao_ble-zmk.uf2right halfboth (the right half is a peripheral either way)
fortemis_left_dongle_mode.uf2left halfdongle
fortemis_dongle.uf2dongledongle
settings_reset-seeeduino_xiao_ble-zmk.uf2either halfclears the half's Bluetooth pairings
settings_reset_dongle.uf2dongleclears the dongle's Bluetooth pairings

In standalone mode the left half is the central: pair the computer with Fortemis. If the halves don't connect to each other, flash the settings reset to both, then the firmware again.

The first time a half runs the firmware, it restarts once by itself. Two of the XIAO Plus's pads (D14 and D15) are the chip's NFC antenna pins, and the firmware turns NFC off so that they work as key inputs. That setting is stored in the chip, so it survives later flashing.

Dongle mode (PandaKB USB dongle)

The keyboard can also run through PandaKB's ZMK dongle (a nice!nano v2 with a 1.3" OLED), as the Forager does. The dongle becomes the central and both halves its peripherals: plug it into a computer and the keyboard works as a USB keyboard, with no Bluetooth pairing on that computer. ZMK fixes each part's role at build time, so switching modes means reflashing.

  • Setup: turn off other ZMK keyboards nearby, flash the settings reset to the dongle and both halves (the standalone pairings must be cleared first), then flash the dongle-mode firmware, plug in the dongle and turn both halves on. To go back, reset the halves and flash the standalone left firmware.
  • Keymap changes then only need the dongle reflashed. To reach its bootloader without opening its case, use the maintenance layer's T.
  • The dongle keeps all five Bluetooth profiles, so it can also pair to computers on its own battery, and ZMK Studio works with it. It never deep-sleeps: only a key press wakes a ZMK device, and the dongle has no keys.

Parts

26
QtyValueFootprintReferences
18ceoloide:switch_choc_v1_v2S1, S2, S3, S4, S5, S6, S7, S10, S11, S12, S13, S14, S15, S16, S17, S18 +2
5SMTSO2020MTJfortemis:nut_smd_m2NUT1, NUT2, NUT3, NUT4, NUT5
1LiPo 301230fortemis:battery_lipo_padsBT1
1MSK12C02fortemis:power_switch_msk12c02_sidePWR1
1XIAO nRF52840 Plusfortemis:mcu_xiao_nrf52840_plusMCU1

Questions

How big is the Fortemis left PCB?

It measures 145.3 × 119.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Fortemis left use?

26 parts, built around the SMTSO2020MTJ and MSK12C02. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Fortemis left KiCad files?

From the colincreasman/fortemis repository on GitHub, at the commit this page was made from: the board is pcb/fortemis_left.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Fortemis left design in my own project?

Its repository states no licence, so its author keeps all rights: ask colincreasman before reusing the design.

Similar boards

  • 2 layers72 × 60 mmJewelled lc1 chargerProgrammer, the printed circuit board in 3D

    Jewelled lc1 chargerProgrammer

    matthiasnowak/jewelled

    This is a panel meant for production of the Earrings, allowing for 2 Earrings per panel.

    119 parts3
  • 2 layers223.5 × 160 mmBase, the printed circuit board in 3D

    Base

    bread-modular/bread-modular

    Modular Synths for Everyone

    201 parts67MIT
  • 2 layers309.9 × 119.8 mmCockpit, the printed circuit board in 3D

    Cockpit

    ozkan/Cockpit-Keyboard

    A hot swap system column staggered mechanical keyboard, running QMK Firmware on Pro Micro controllers.

    144 parts43MIT
  • 2 layers133 × 91.4 mmCirrus40, the printed circuit board in 3D

    Cirrus40

    schuay/cirrus40

    A 40% split mechanical keyboard with a focus on usable rotary encoders

    71 parts19CC-BY-4.0
  • 2 layers285 × 94.2 mmWoodpecker, the printed circuit board in 3D

    Woodpecker

    Ardakilic/woodpecker-keyboard

    5 row ortholinear keyboard, based on Lumberelite and Lumberjack

    145 parts18MIT
  • 4 layers154.5 × 112.9 mmLibrePLC32, the printed circuit board in 3D

    LibrePLC32

    AndreiVladescu/LibrePLC32

    The goal of the project is to create a compact, hackable, and well-documented PLC platform for industrial automation experiments, prototyping, education, and open hardware development.

    295 parts14CERN-OHL-P-2.0
  • 4 layers71.9 × 94 mmThumbdeck right, the printed circuit board in 3D

    Thumbdeck right

    neuman/gripster

    thumbdeck — wireless split thumb keyboard (nRF52840 + ZMK, BLE split, i8+-inspired). Layout converged & graded PASS.

    114 parts11Apache-2.0
  • 4 layers34 × 80 mmLAN Tester, the printed circuit board in 3D

    LAN Tester

    Markuselectronics/Raspberry-Pi-Pico-LAN-Tester

    Portable Raspberry Pi Pico LAN tester with W5500 Ethernet, OLED display and battery charging.

    51 parts7