Skip to the content
PCBKitNew board
2 layers285 × 95.1 mmViper, the printed circuit board in 3D

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

6

README

README.md

Duck 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.

Duck Viper v1 Render WIP

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

Duck Viper v1 IC schematic WIP

Link to PDF

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

text
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

Split HHKB, 10u

KLE permalink

l33t

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 permalink

l33t

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:

bash
# Clone the repository
git clone [repository-url]
cd duck-viper-v1-pcb

# Open the project in KiCad
# File -> Open Project -> duck-viper-v1.kicad_pro

Setup for adamws/kbplacer:

bash
# 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_pro

linux

bash
python3 -m venv .venv --system-site-packages
source .venv/bin/activate
pip install .

# test kicad
python -c "import pcbnew; print(pcbnew.Version())"

Libraries Used:

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.

License

MIT


This project is a learning exercise in PCB design. Use at your own risk and always verify designs before manufacturing.

Parts

309
QtyValueFootprintReferences
65LEDlocallib:MX-LEDLED1, LED2, LED10, LED11, LED12, LED13, LED14, LED14_1, LED15, LED16, LED17, LED18, LED19, LED20, LED21, LED22 +49
65SW_Pushlocallib:SW_Hybrid_Cherry_MX_Alps_1.00u_1SW1, SW2, SW10, SW11, SW12, SW13, SW14, SW14_1, SW15, SW16, SW17, SW18, SW19, SW20, SW21, SW22 +49
621N4148Diode_SMD:D_0805_2012MetricD1, D2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23 +46
62470Resistor_SMD:R_0805_2012MetricR1, R2, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23 +46
5100nFCapacitor_SMD:C_0805_2012MetricC4, CRGB1, CRGB2, CRGB3, CRGB4
4WS2812Blocallib:LED_WS2812B-Mini_PLCC4_3.5x3.5mmRGB1, RGB2, RGB3, RGB4
4~Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_2.00uST14, ST42, ST43, ST54
4~acheron_MountingHoles:halfSideHoleH5, H6, H8, H9
4~acheron_MountingHoles:MoutingHole_Oval_BackOnly_7mm_5.0x2.5mmH2, H3, H4, H7
3100nFCapacitor_SMD:C_0603_1608MetricCB1, CB2, CB3
210kResistor_SMD:R_0603_1608MetricRHWB1, RRST1
21MResistor_SMD:R_0805_2012MetricRSH1, RSH2
222Resistor_SMD:R_0603_1608MetricRD1, RD2
222pFCapacitor_SMD:C_0603_1608MetricCX1, CX2
24.7nFCapacitor_SMD:C_0805_2012MetricCSH1, CSH2
25.1kResistor_SMD:R_0603_1608MetricRCC1, RCC2
2SMF9.0CADiode_SMD:D_SOD-123DF1, DSH1
2~Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_3.00uST58, ST60
11.5A trip PTCFuse:Fuse_1206_3216MetricF1
110uFCapacitor_SMD:C_0603_1608MetricCB4
116MHzCrystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY1
11kResistor_SMD:R_0805_2012MetricRPB1
11uFCapacitor_SMD:C_0603_1608MetricC3
1AO3400APackage_TO_SOT_SMD:SOT-23Q1
1ATmega32U4-MPackage_DFN_QFN:QFN-44-1EP_7x7mm_P0.5mm_EP5.2x5.2mmU1
1LockLEDlocallib:MX-Lock-LEDLED30_2
1SW_SPSTButton_Switch_SMD:SW_SPST_TL3342RST1
1TYPE-C-31-M-12locallib:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U2
1~Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_7.00uST59
1~locallib:viper_outlineLF1
1~PCM_Mounting_Keyboard_Stabilizer:Stabilizer_Cherry_MX_8.00uST59_1
1~acheron_MountingHoles:Mounting_Hole_Oval_2.5x8mmH1

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 mmMgBoard, the printed circuit board in 3D

    MgBoard

    periodboards/Magnesium

    A crappy 14 button macropad, 2 of which are rotary encoders

    116 parts
  • 2 layers323.9 × 145.3 mmPoto Rev2, the printed circuit board in 3D

    Poto Rev2

    chiappe666/Poto-Rev2

    PCB for keyboard

    287 parts
  • 2 layers303.8 × 93.5 mmDraytronics Elise PCB V2, the printed circuit board in 3D

    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 mmFerris, the printed circuit board in 3D

    Ferris

    pierrechevalier83/ferris

    A low profile split keyboard designed to satisfy one single use case elegantly

    145 parts1.3k
  • 2 layersRC KiCAD, the printed circuit board in 3D

    RC KiCAD

    dev-campusfab/FabRice

    Documentation et code source de FabRice, le robot Autonome.

    62 parts4MIT
  • 2 layers35 × 100 mmWalkieTalkie, the printed circuit board in 3D

    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 mmHacking box v3 unrouted, the printed circuit board in 3D

    Hacking box v3 unrouted

    dkuaegis/aegis-hack-the-badge

    Aegis 보안팀 해킹체험 프로젝트

    60 parts2
  • 2 layers96 × 50 mmPager, the printed circuit board in 3D

    Pager

    justinlindh/bramble

    Privacy-first LoRa mesh networking for ESP32-S3, built with ESP-IDF

    97 parts2MIT