

Viper
duck viper v1 pcb
- Size
- 285 × 95.1 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 309
- Nets
- 177
- Pads
- 917
- Tracks, vias
- 79, 0
- Routed
- Yes
- KiCad
- KiCad 9.0 (file 20241229)
- Created
- 6 Jun 2025
- Updated
- 22 Jun 2025
Overview
Viper is an open-source printed circuit board by isol33t, from the isol33t/viper repository on GitHub, published under the MIT licence. It is a 2-layer board of 285 × 95.1 mm with 309 parts on 177 nets, routed with 79 tracks and 0 vias.
It is built around the ATMEGA32U4-MU, USBLC6-2SC6 and WS2812B, with the SMF9.0CA, AO3400A and TYPE-C-31-M-12 among its other parts. Its parts include 128 diodes, 65 switches, 62 resistors, 6 capacitors and 2 ICs. It belongs with the AVR (ATmega, ATtiny) boards of this library.
Main components
6ATMEGA32U4-MU
VQFN-44-EP(7x7)-40℃~+85℃ 10bit 16MHz 1KB 2.5KB 2.7V~5.5V 26 32KB 8 Bit AVR Built-in FLASH VQFN-44-EP(7x7) Microcontrollers (MCU/MPU/SOC) ROHSMicrochip TechnologyMicrocontrollers (MCU/MPU/SOC)USBLC6-2SC6
SOT-23-60.35pF、0.8pF 100nA 150W@8/20us 15V 2 5V 6A@8/20us 6V ESD SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSUMWESD And Surge Protection (TVS/ESD)WS2812B
5mm X 5mm Surface Mount RGB LED with Intelligent ControlWorldsemiUncategorisedSMF9.0CA
SOD-123FLESD And Surge Protection (TVS/ESD)hongjiachengAO3400A
SOT-23-55℃~+150℃ 1 N-channel 1.45V 1.4W 30V 48mΩ@2.5V 5.7A 50pF 630pF 75pF 7nC@10V N-Channel SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsTYPE-C-31-M-12
SMD-30℃~+80℃ 1 10,000 cycles 16P 20V 5A 7.35mm Female Surface Mount, Right Angle Type-C SMD USB Connectors ROHSHRO ElectronicsUSB Connectors
README
README.mdDuck Viper v1 PCB - Open Source Upgrade
⚠️ Work in Progress - This project is currently under development
Inspired by Automated keyboard PCB design with ergogen and kbplacer by adamws & its dockerfile.
Overview
An open-source PCB design for the Duck Viper v1 keyboard with hardware upgrades. This project focuses on transparency and community collaboration while building upon existing open-source resources.
Disclaimer: I'm not an electrical engineer - this project represents my attempt at "putting the parts together" using available community resources, guides, and libraries. Community feedback and contributions are greatly appreciated!
(Planned *) Upgrades:
- USB-C Connector
- ESD
- Separate Caps Lock LED
-
- RGB Underglow *
-
- Additional switches for Split HHKB Bottom Row *
-
- MXLockLed *
Design Philosophy
- Open Source First: All design files, schematics, and documentation will be freely available
- Community Driven: Built using existing open-source libraries and community knowledge
- Transparency: Design decisions and trade-offs documented for others to learn from
Current Status
Design Questions (Help Needed!)
1. QFN vs QFP Package Decision
- QFN Pros: Required for split HHKB layout with IC positioned between Caps Lock and A (see Voyager60 reference)
- QFN Cons: Hand soldering difficulty increases prototype cost (~$20 per PCB for 5-unit orders with just an assembled QFN IC vs ~$10 for 5 PCBs ex. assembly)
- QFP: Easier to hand solder but may not fit desired layout constraints due to additional stabilizer requirements for split HHKB
QFN IC placement mock-up:
If going QFN route, schematic verification help would be greatly appreciated!
Supported Layouts
kbplacer can use via for switch placement & requires via for collapsing a KLE layout
VIA spec https://www.caniusevia.com/docs/layouts#overview uses KLE raw, but not kle.com's raw json VIA spec based on wt60_d
python -m kbplacer.kle_serial -in -in kle/keyboard-layout-via-10u.json -inform KLE_VIA -out keyboard-layout-collapsed.json -outform KLE_RAW -collapse- Forked duck_viper
Split HHKB, 10u

KLE Raw data, expanded
``` [{"x": 2, "c": "#777777"}, "0,0", {"c": "#cccccc"}, "0,1", "0,2", "0,3", "0,4", "0,5", "0,6", "0,7", "0,8", "0,9", "0,10", "0,11", "0,12", {"c": "#aaaaaa", "w": 2}, "0,13\n\n\n0,0", {"x": 1.5, "c": "#cccccc"}, "0,13\n\n\n0,1", "0,14\n\n\n0,1"], [{"x": 2, "c": "#aaaaaa", "w": 1.5}, "1,0", {"c": "#cccccc"}, "1,1", "1,2", "1,3", "1,4", "1,5", "1,6", "1,7", "1,8", "1,9", "1,10", "1,11", "1,12", {"w": 1.5}, "1,13"], [{"c": "#aaaaaa", "w": 1.25}, "2,0\n\n\n3,1", {"x": 0.75, "w": 1.75}, "2,0\n\n\n3,0", {"c": "#cccccc"}, "2,1", "2,2", "2,3", "2,4", "2,5", "2,6", "2,7", "2,8", "2,9", "2,10", "2,11", {"c": "#777777", "w": 2.25}, "2,12"], [{"x": 2, "c": "#aaaaaa", "w": 2.25}, "3,1", {"c": "#cccccc"}, "3,2", "3,3", "3,4", "3,5", "3,6", "3,7", "3,8", "3,9", "3,10", "3,11", {"c": "#aaaaaa", "w": 2.75}, "3,12\n\n\n1,0", {"x": 0.75, "w": 1.75}, "3,12\n\n\n1,1", "3,13\n\n\n1,1"], [{"x": 2, "w": 1.5, "d": true}, "4,0\n\n\n2,0", "4,2\n\n\n2,0", {"w": 1.5}, "4,3\n\n\n2,0", {"c": "#cccccc", "w": 7}, "4,7\n\n\n2,0", {"c": "#aaaaaa", "w": 1.5}, "4,11\n\n\n2,0", "4,13\n\n\n2,0", {"w": 1.5, "d": true}, "4,14\n\n\n2,0"], [{"x": 2, "y": 0.5, "w": 1.5, "d": true}, "4,0\n\n\n2,1", "4,2\n\n\n2,1", {"w": 1.5}, "4,3\n\n\n2,1", {"c": "#cccccc", "w": 3}, "4,5\n\n\n2,1", "4,7\n\n\n2,1", {"w": 3}, "4,9\n\n\n2,1", {"c": "#aaaaaa", "w": 1.5}, "4,11\n\n\n2,1", "4,13\n\n\n2,1", {"w": 1.5, "d": true}, "4,14\n\n\n2,1"], [{"x": 2, "w": 1.5, "d": true}, "4,0\n\n\n2,2", "4,2\n\n\n2,2", {"c": "#cccccc", "w": 10}, "4,7\n\n\n2,2", {"c": "#aaaaaa"}, "4,13\n\n\n2,2", {"w": 1.5, "d": true}, "4,14\n\n\n2,2"] ```
KLE Raw data, collapsed
``` [{"x": 2, "c": "#777777"}, "0,0", {"c": "#cccccc"}, "0,1", "0,2", "0,3", "0,4", "0,5", "0,6", "0,7", "0,8", "0,9", "0,10", "0,11", "0,12", {"c": "#aaaaaa", "w": 2}, "0,13\n\n\n0,0", {"x": -2, "c": "#cccccc"}, "0,13\n\n\n0,1", "0,14\n\n\n0,1"], [{"x": 2, "c": "#aaaaaa", "w": 1.5}, "1,0", {"c": "#cccccc"}, "1,1", "1,2", "1,3", "1,4", "1,5", "1,6", "1,7", "1,8", "1,9", "1,10", "1,11", "1,12", {"w": 1.5}, "1,13"], [{"x": 2.0, "c": "#aaaaaa", "w": 1.75}, "2,0\n\n\n3,0", {"x": -1.75, "w": 1.25}, "2,0\n\n\n3,1", {"x": 0.5, "c": "#cccccc"}, "2,1", "2,2", "2,3", "2,4", "2,5", "2,6", "2,7", "2,8", "2,9", "2,10", "2,11", {"c": "#777777", "w": 2.25}, "2,12"], [{"x": 2, "c": "#aaaaaa", "w": 2.25}, "3,1", {"c": "#cccccc"}, "3,2", "3,3", "3,4", "3,5", "3,6", "3,7", "3,8", "3,9", "3,10", "3,11", {"c": "#aaaaaa", "w": 2.75}, "3,12\n\n\n1,0", {"x": -2.75, "w": 1.75}, "3,12\n\n\n1,1", "3,13\n\n\n1,1"], [{"x": 3.5}, "4,2\n\n\n2,0", {"w": 1.5}, "4,3\n\n\n2,0", {"c": "#cccccc", "w": 3}, "4,5\n\n\n2,1", {"x": -3.0, "w": 7}, "4,7\n\n\n2,0", {"x": -3.0, "w": 3}, "4,9\n\n\n2,1", {"c": "#aaaaaa", "w": 1.5}, "4,11\n\n\n2,0", "4,13\n\n\n2,0"] ```Development Environment Setup
Hardware Design (KiCad)
Requirements:
- KiCad 9.0 or later
- Git for version control
-
- python3
-
- docker
Setup:
# Clone the repository
git clone [repository-url]
cd duck-viper-v1-pcb
# Open the project in KiCad
# File -> Open Project -> duck-viper-v1.kicad_proSetup for adamws/kbplacer:
# Clone the repository
git clone [repository-url]
cd duck-viper-v1-pcb
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install .
python -m kbplacer.kle_serial -in kle/keyboard-layout-via.json -inform KLE_VIA -out kle/keyboard-layout-collapsed.json -outform KLE_INTERNAL -collapse
python tools/layout2url.py -in keyboard-layout-collapsed.json|pbcopy
# Open the project in KiCad
# File -> Open Project -> duck-viper-v1.kicad_prolinux
python3 -m venv .venv --system-site-packages
source .venv/bin/activate
pip install .
# test kicad
python -c "import pcbnew; print(pcbnew.Version())"Libraries Used:
- AcheronProject/AlexandriaLibrary
- Community keyboard libraries (specific sources TBD)
Firmware Development
Detailed firmware setup instructions will be added as development progresses.
Manufacturing Files
Generation of Gerber files, pick-and-place files, and BOM will be documented once design is finalized.
Acknowledgments
This project builds upon the incredible work of the open-source keyboard community. Specific libraries, guides, and resources used will be documented as the project progresses.
Contributing
As a learning project, I welcome:
- Schematic reviews and feedback
- Design suggestions and improvements
- Documentation contributions
- Testing and validation help
Thanks yo
This project is inspired by Automated Keyboard PCB design with ergogen and kbplacer. Still, it's far from being fully automated.
- adamws/kicad-kbplacer
- https://github.com/ruiqimao/keyboard-pcb-guide
- https://wiki.ai03.com/books/pcb-design
- https://github.com/evyd13/plain60-b
- https://github.com/evyd13/plain60-c
- https://www.masterzen.fr/2020/05/03/designing-a-keyboard-part-1/
License
This project is a learning exercise in PCB design. Use at your own risk and always verify designs before manufacturing.
Parts
309| Qty | Value | Footprint | References |
|---|---|---|---|
| 65 | LED | locallib:MX-LED | LED1, LED2, LED10, LED11, LED12, LED13, LED14, LED14_1, LED15, LED16, LED17, LED18, LED19, LED20, LED21, LED22 +49 |
| 65 | SW_Push | locallib:SW_Hybrid_Cherry_MX_Alps_1.00u_1 | SW1, SW2, SW10, SW11, SW12, SW13, SW14, SW14_1, SW15, SW16, SW17, SW18, SW19, SW20, SW21, SW22 +49 |
| 62 | 1N4148 | Diode_SMD:D_0805_2012Metric | D1, D2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23 +46 |
| 62 | 470 | Resistor_SMD:R_0805_2012Metric | R1, R2, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23 +46 |
| 5 | 100nF | Capacitor_SMD:C_0805_2012Metric | C4, CRGB1, CRGB2, CRGB3, CRGB4 |
| 4 | WS2812B | locallib:LED_WS2812B-Mini_PLCC4_3.5x3.5mm | RGB1, RGB2, RGB3, RGB4 |
| 4 | ~ | Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_2.00u | ST14, ST42, ST43, ST54 |
| 4 | ~ | acheron_MountingHoles:halfSideHole | H5, H6, H8, H9 |
| 4 | ~ | acheron_MountingHoles:MoutingHole_Oval_BackOnly_7mm_5.0x2.5mm | H2, H3, H4, H7 |
| 3 | 100nF | Capacitor_SMD:C_0603_1608Metric | CB1, CB2, CB3 |
| 2 | 10k | Resistor_SMD:R_0603_1608Metric | RHWB1, RRST1 |
| 2 | 1M | Resistor_SMD:R_0805_2012Metric | RSH1, RSH2 |
| 2 | 22 | Resistor_SMD:R_0603_1608Metric | RD1, RD2 |
| 2 | 22pF | Capacitor_SMD:C_0603_1608Metric | CX1, CX2 |
| 2 | 4.7nF | Capacitor_SMD:C_0805_2012Metric | CSH1, CSH2 |
| 2 | 5.1k | Resistor_SMD:R_0603_1608Metric | RCC1, RCC2 |
| 2 | SMF9.0CA | Diode_SMD:D_SOD-123 | DF1, DSH1 |
| 2 | ~ | Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_3.00u | ST58, ST60 |
| 1 | 1.5A trip PTC | Fuse:Fuse_1206_3216Metric | F1 |
| 1 | 10uF | Capacitor_SMD:C_0603_1608Metric | CB4 |
| 1 | 16MHz | Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm | Y1 |
| 1 | 1k | Resistor_SMD:R_0805_2012Metric | RPB1 |
| 1 | 1uF | Capacitor_SMD:C_0603_1608Metric | C3 |
| 1 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | ATmega32U4-M | Package_DFN_QFN:QFN-44-1EP_7x7mm_P0.5mm_EP5.2x5.2mm | U1 |
| 1 | LockLED | locallib:MX-Lock-LED | LED30_2 |
| 1 | SW_SPST | Button_Switch_SMD:SW_SPST_TL3342 | RST1 |
| 1 | TYPE-C-31-M-12 | locallib:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J1 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U2 |
| 1 | ~ | Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_7.00u | ST59 |
| 1 | ~ | locallib:viper_outline | LF1 |
| 1 | ~ | PCM_Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_8.00u | ST59_1 |
| 1 | ~ | acheron_MountingHoles:Mounting_Hole_Oval_2.5x8mm | H1 |
Questions
How big is the Viper PCB?
It measures 285 × 95.1 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Viper use?
309 parts, built around the ATMEGA32U4-MU, USBLC6-2SC6, WS2812B and SMF9.0CA. 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 Viper KiCad files?
From the isol33t/viper repository on GitHub, at the commit this page was made from: the board is hardware/viper/viper.kicad_pcb and its schematic hardware/viper/viper-led-matrix.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Viper design in my own project?
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).
Similar boards
- 2 layers71.4 × 138.1 mm

- 2 layers323.9 × 145.3 mm

- 2 layers303.8 × 93.5 mm

Draytronics Elise PCB V2
ghostseven/Draytronics-Elise-PCB-V2
(Current V2) An open source 65% mechanical keyboard, designed to be physically compatible with XD68
197 parts9 - 2 layers208.8 × 396.9 mm

Ferris
pierrechevalier83/ferris
A low profile split keyboard designed to satisfy one single use case elegantly
145 parts1.3k - 2 layers

RC KiCAD
dev-campusfab/FabRice
Documentation et code source de FabRice, le robot Autonome.
62 parts4MIT - 2 layers35 × 100 mm

WalkieTalkie
GuzziFlipFlops/ESP32-Walkie-Talkie
An open source ESPNOW based walkie talkie with a 600 meter tested distance, with an OLED and multiple buttons to interact with
66 parts7MIT - 2 layers84 × 100 mm

- 2 layers96 × 50 mm

Pager
justinlindh/bramble
Privacy-first LoRa mesh networking for ESP32-S3, built with ESP-IDF
97 parts2MIT