Skip to the content
PCBKitNew board
2 layers119.3 × 153.9 mmKeypad AIO, the printed circuit board in 3D

Programmable keyboard controller system with host software, configuration UI, and embedded firmware.

Size
119.3 × 153.9 mm
Copper layers
2
Thickness
1.6 mm
Parts
108
Nets
73
Pads
767
Tracks, vias
345, 8
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
15 Feb 2025
Updated
8 Jun 2026

Overview

Keypad AIO is an open-source printed circuit board by acrankyturtle, from the acrankyturtle/Cardboard repository on GitHub. It is a 2-layer board of 119.3 × 153.9 mm with 108 parts on 73 nets, routed with 345 tracks and 8 vias.

Its parts include 31 switches, 30 diodes, 2 connectors and 1 IC. It belongs with the keyboards and input boards and the RP2040 boards of this library.

README

README.md

Cardboard

Programmable keyboard controller system with host software, configuration UI, and embedded firmware.

Architecture Overview

Cardboard is a three-tier system: a React frontend for configuration, a .NET backend for device management and API serving, and Rust firmware running on RP2040-based keyboard controllers. The backend discovers devices over USB serial, while the frontend communicates with the backend over HTTP (REST + SSE).

text
Frontend (React/Vite)  →  Backend (.NET/Kestrel)  →  Device (Rust/Embassy)

Prerequisites

Getting Started

Backend

bash
dotnet run --project Cardboard.Controller

Starts the API server at http://localhost:7000. In Development mode, Swagger is available at /swagger.

Frontend

bash
cd react-frontend
npm install
npm run dev

Starts the Vite dev server at http://localhost:5173. The appsettings.Development.json in Cardboard.Controller/ points ReactHostUrl to :5173 so the backend knows where the frontend is running.

Firmware

bash
cd firmware
cargo build --release
cargo run --release

Flashes the firmware to a connected RP2040 device. The default runner uses elf2uf2-rs (device must be in bootloader mode). To use probe-rs, edit .cargo/config.toml.

Building for Release

Application

bash
dotnet publish Cardboard.Controller -c Release

This automatically builds the React frontend (npm install && npm run build) and bundles it into the output under wwwroot/.

Installer

powershell
installer\build-installer.ps1

Requires Inno Setup 6.2+ installed.

Firmware

bash
cd firmware
cargo build --release

Project Structure

Host Application (C# / .NET 10)

ProjectPurpose
Cardboard.Controller/ASP.NET Core host, DI composition root, entry point
Cardboard.HttpApi/REST API endpoint definitions (Devices, Tags, Logs, InputDevices, Controller)
Cardboard.Api/Shared API setup, such as JSON serialization configuration
Cardboard.FrontendHost/SPA hosting, origin validation, route mounting
Cardboard.Services/Business logic: tag association management, virtual key dispatch
Cardboard.Repositories/Data access: device repository, association persistence
Cardboard.Events/Cross-platform event abstractions
Cardboard.Device/Device abstractions: commands, profiles, settings, binary serialization
Cardboard.Serial/Serial port abstractions
Cardboard.Windows/Windows: serial discovery (WMI), input monitoring, tray icon
Cardboard.Metadata/Device metadata interfaces (icons, model info)
Cardboard.Utilities/Shared utilities: AsyncDispatchSubject, Result types, file watcher
Cardboard.Update/Firmware update orchestration
Cardboard.Update.Api/Update server API client
Cardboard.Update.Api.Abstractions/Shared types for update client/server
Cardboard.UpdateServer/Firmware, metadata, and update distribution server (separate deployment)

Firmware (Rust / Embassy)

DirectoryPurpose
firmware/CK1-30 firmware entry point and RP2040-specific code
cardboard-lib/Platform-agnostic core: commands, profiles, state machine, HID, serial

Frontend (TypeScript / React 19)

DirectoryPurpose
react-frontend/Vite + React + Tailwind SPA for device configuration

Tooling

DirectoryPurpose
DeviceTool/CLI tool for building and testing device profiles
installer/Inno Setup installer scripts and build script

Configuration

Cardboard.Controller/appsettings.json — Production configuration:

  • Kestrel:Endpoints:Http:Url — Backend listen address (default http://127.0.0.1:7000)
  • Paths:Associations — Association storage path (default %APPDATA%/Cardboard/associations.json)
  • Paths:MetadataCache / IconCache — Cache directories under %APPDATA%/Cardboard/cache/
  • Frontend:ReactHostUrl — URL where the frontend is served from
  • Update:Url / Update:Channel — Firmware update server and release channel

appsettings.Development.json — Development overrides:

  • Sets Frontend:ReactHostUrl to http://localhost:5173 for the Vite dev server
  • Sets Update:Channel to preview

Code Formatting

LanguageToolConfig
C#CSharpier.csharpierrc.json (tabs, 110 width)
TypeScriptPrettier + ESLint.prettierrc, eslint.config.js
RustrustfmtDefault settings

Further Documentation

  • Architecture — System architecture deep-dive, component relationships, data flow
  • API Reference — HTTP endpoint reference (REST + SSE)
  • Serial Protocol — Binary protocol between host and firmware
  • Conventions — Design patterns, code style, project conventions

Parts

108
QtyValueFootprintReferences
44MountingHole_2.2mm_M2_Pad_ViaMountingHole:MountingHole_2.2mm_M2_Pad_Via, , , , , , , , , , , , , , , +28
30DDiode_THT:D_DO-35_SOD27_P7.62mm_HorizontalD1, D2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23 +14
29CherryMXPCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX_1.00uSW1, SW2, SW10, SW11, SW12, SW13, SW14, SW15, SW16, SW17, SW18, SW19, SW20, SW21, SW22, SW23 +13
1CherryMXPCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX_2.00u_90degSW30
1DebugConnector_JST:JST_XH_B5B-XH-A_1x05_P2.50mm_VerticalJ2
1PicoMCU_RaspberryPi_and_Boards:RPi_Pico_SMD_THU1
1PowerConnector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_HorizontalJ1
1Stabilizer_Cherry_MX_2.00uPCM_Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_2.00uSW30_Stabilizer

Questions

How big is the Keypad AIO PCB?

It measures 119.3 × 153.9 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Keypad AIO use?

108 parts. 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 Keypad AIO KiCad files?

From the acrankyturtle/Cardboard repository on GitHub, at the commit this page was made from: the board is KiCad/Keypad AIO.kicad_pcb and its schematic KiCad/Keypad AIO.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Keypad AIO design in my own project?

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

Similar boards

  • 2 layers89.2 × 82.6 mmDesktop 50 Pin TopConn, the printed circuit board in 3D

    Desktop 50 Pin TopConn

    BlueSCSI/BlueSCSI-v2

    BlueSCSI v2/Ultra - an open source, open hardware, SCSI emulator using the Pi Pico PR2040 and Pico 2 RP2350

    108 parts459GPL-3.0
  • 2 layers312 × 140 mmTsynth2 Rev1.3, the printed circuit board in 3D

    Tsynth2 Rev1.3

    Electrotechnique/TSynth-Teensy4.1

    TSynth for Teensy 4.1

    108 parts182
  • 2 layers99.1 × 90.7 mmBgkeeb, the printed circuit board in 3D

    Bgkeeb

    sadekbaroudi/bgkeeb

    This is a reversible 100mm x 100mm pcb with support for mx or choc switches (no hotswap), per key led, rotary encoders, and exposes the SDA/SCL/GND/VCC lines in the form of the pimoroni trackball pins (meaning you can…

    108 parts108
  • 2 layers165 × 113 mmMask-0.0.0, the printed circuit board in 3D

    Mask-0.0.0

    marcoster/mask

    MArco's Split Keyboard

    108 parts44MPL-2.0
  • 2 layers262 × 113.9 mmQuacken, the printed circuit board in 3D

    Quacken

    Nuclear-Squid/Quacken

    Libre, ergonomic, polymorphic: a single PCB for many possible layouts.

    108 parts38GPL-3.0
  • 2 layers87 × 87 mmCn tester panel, the printed circuit board in 3D

    Cn tester panel

    aroum/cn_tester

    c!n tester is a hardware and software system designed for testing ProMicro-like microcontrollers.

    108 parts37MIT
  • 2 layers161.5 × 106 mmWaccaProtocolTranslator, the printed circuit board in 3D

    WaccaProtocolTranslator

    FizzyApple12/Waccon

    A repository for all of the files in my design for an open-source touch ring controller.

    108 parts33
  • 2 layers258.2 × 96.8 mmNarfkb, the printed circuit board in 3D

    Narfkb

    sebastian-stumpf/narfkb

    rp2040 powered split keyboard with rotary encoders and 6mm tactile buttons

    108 parts29MIT