
Nerf timer
Salted-Peanuts/KOTH-Timer
DIY Arduino Nano ESP32 King of the Hill timer for Nerf, foam flinging, skirmish games, and objective-based events. Includes build guide, firmware, BOM, schematic, and phone referee UI.

DIY Arduino Nano ESP32 King of the Hill timer for Nerf, foam flinging, skirmish games, and objective-based events. Includes build guide, firmware, BOM, schematic, and phone referee UI.
KOTH V2 is an open-source printed circuit board by Salted-Peanuts, from the Salted-Peanuts/KOTH-Timer repository on GitHub, published under the MIT licence. It is a 4-layer board of 100 × 100 mm with 49 parts on 43 nets, routed with 174 tracks and 546 vias.
Its parts include 13 resistors, 8 capacitors, 7 diodes, 4 switches and 1 IC. It belongs with the radio and wireless and interfaces and adapters boards and the ESP32 and AVR (ATmega, ATtiny) boards of this library.
A DIY Arduino Nano ESP32 King of the Hill timer for Nerf, foam flinging, skirmish games, and objective-based events.
KOTH-Timer is an open-source physical game timer with arcade buttons, TM1637 displays, battery monitoring, and a local phone-friendly referee/admin web interface. It is designed for two-team King of the Hill games where players physically hold a button to capture the objective.
This project is based on a working timer that has been tested successfully at local Nerf events. A few people in the hobby scene asked how to build their own, so this repo exists to make that possible.
The goal is to keep it practical, buildable, and easy to modify.
The current recommended firmware release is:
v0.3.1v0.3.1 is the recommended firmware for new builds.
It keeps the tested v0.3 phone/referee UI and adds small UI input fixes so team colours and match duration can be edited more reliably from the web interface.
Recommended PCB revision:
v0.2PCB v0.2 has been manufactured, assembled, and tested with no known faults. It is the recommended PCB revision for new builds.
The tested KOTH Timer PCB v0.2 project is available on PCBWay for convenience if you choose to use them:
Order / view the KOTH Timer PCB v0.2 project on PCBWay
Older versions remain available for reference but are not recommended for new builds:
| Version | Status |
|---|---|
| Firmware v0.3 | Event-tested release, replaced by v0.3.1 bug-fix update |
| PCB v0.1 | Manufactured, functional through the web UI, but has known display issues |
KOTH-Timer is a physical objective timer for two-team King of the Hill style games.
Players press their team’s button to capture the objective. The timer tracks control time and shows the game state through:
The timer runs locally from the ESP32, so it does not need internet access during gameplay.



The timer creates its own local Wi-Fi network.
SSID: KOTH-Timer
Password: none / open networkAfter connecting, open:
http://10.10.10.1Connection test page:
http://10.10.10.1/pingSome phones may warn that the network has no internet. This is normal. Choose the option to stay connected or use the network anyway.
The Wi-Fi network is open by default so referees can connect quickly during events.
If you want to add a password, edit the firmware near the top of the code.
Find:
static const char* AP_PASS = "";Change it to a password with at least 8 characters:
static const char* AP_PASS = "kothtimer";Then upload the firmware again.
This project is for hobbyists who want to build their own objective timer for games such as:
You do not need to be an expert programmer, but you should be comfortable with basic wiring, soldering, and flashing an ESP32.
The current build uses:
See the docs folder for the BOM, schematic, and full build guide.
Start here:
The build guide covers:
The firmware is written for the Arduino Nano ESP32 using the Arduino IDE.
Current recommended firmware:
Firmware/KOTH_Timer_v0_3_1/KOTH_Timer_v0_3_1.inoFor Arduino IDE compatibility, the .ino file should be inside a folder with the same name as the sketch.
Hardware documentation is in the docs folder.
Current files include:
docs/BOM.xlsx
docs/BOM.csv
docs/Wiring_schematic.pdf
docs/build-guide.mdThe KOTH Timer now has a tested PCB revision.
| PCB revision | Status | Recommendation |
|---|---|---|
v0.1 | Manufactured and functionally usable through the web UI, but has known TM1637 display reliability issues | Reference only / not recommended for new builds |
v0.2 | Manufactured, assembled, and tested with no known faults | Recommended PCB revision |
PCB v0.1 was the first manufactured PCB revision.
It is functional through the web UI, but some TM1637 displays may show interference, flicker, incorrect segments, or unstable output.
The v0.1 files are kept in the repo for reference, troubleshooting, and comparison, but new builders should use PCB v0.2 instead.
PCB v0.2 is the current recommended PCB revision.
It was redesigned based on lessons from v0.1, with improvements around display reliability, local display decoupling, and cleaner TM1637 signal routing.
PCB v0.2 has been manufactured, assembled, and tested with no known faults.
PCB manufacturing for newer KOTH Timer PCB revisions has been supported by PCBWay.
PCBWay helped support this open-source hardware project by providing PCB manufacturing support while allowing the firmware, design files, known issues, and documentation to remain open source.
Their support made it easier to test real PCB revisions, improve the board design, and share the results back with other builders.
You can check out PCBWay’s PCB manufacturing and assembly services here:
The tested KOTH Timer PCB v0.2 project is available on PCBWay here:
Order / view the KOTH Timer PCB v0.2 project on PCBWay
Thanks to PCBWay for supporting open-source hardware creators and helping this project move from a hand-wired prototype to a tested PCB-based build.
Note: PCBWay supported manufacturing for this project, but the design notes, testing results, known issues, and recommendations in this repository are written independently.
Planned future work may include:
The v0.3.1 firmware is the current recommended release. It is based on the event-tested v0.3 firmware and includes additional web-interface input fixes.
PCB v0.2 has been manufactured, assembled, and tested with no known faults and is the current recommended PCB revision.
This is a hobby project, not a commercial product.
The current firmware has been tested at an event, but builders should still test their own wiring and setup before using the timer in a game.
If you build one, feel free to modify it for your own event rules, enclosure, buttons, battery setup, or game style.
This project may be useful for:
This project is released under the MIT Licence.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 7 | 220R | Resistor_THT:R_Axial_DIN0309_L9.0mm_D3.2mm_P15.24mm_Horizontal | R3, R4, R5, R6, R7, R8, R9 |
| 5 | 0.1uf_C_Cap | Capacitor_THT:C_Disc_D4.3mm_W1.9mm_P5.00mm | C2, C3, C4, C5, C6 |
| 4 | 100R | Resistor_THT:R_Axial_DIN0309_L9.0mm_D3.2mm_P15.24mm_Horizontal | R10, R11, R12, R13 |
| 4 | MountingHole_3.2mm_M3 | MountingHole:MountingHole_3.2mm_M3 | M3, M3, M3, M3 |
| 3 | LED_GREEN | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | D5, D6, D7 |
| 2 | 100K | Resistor_THT:R_Axial_DIN0309_L9.0mm_D3.2mm_P15.24mm_Horizontal | R1, R2 |
| 2 | 100uf_E_Cap | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C7, C8 |
| 2 | 4_Digit_DIsplay (Team_A) | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-04P_1x04_P5.00mm | TM1637-A1, TM1637-A2 |
| 2 | 4_Digit_DIsplay (Team_B) | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-04P_1x04_P5.00mm | TM1637-B1, TM1637-B2 |
| 2 | QRKOTH-Timer | customfootprints:QRKOTH-Timer | QR*****, QR***** |
| 1 | 1-2A_Fuse | Fuse:Fuseholder_Clip-6.3x32mm_Littelfuse_102_122_Inline_P34.21x7.62mm_D1.98mm_Horizontal | F1 |
| 1 | 18650_Cell | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | BT1 |
| 1 | 470uf_E_Cap | Capacitor_THT:CP_Radial_D8.0mm_P5.00mm | C1 |
| 1 | 5v_Step_Up | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | U1 |
| 1 | Arduino_Nano_ESP32 | Module:Arduino_Nano | A1 |
| 1 | Conn_01x10_Pin | Connector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_Vertical | J1 |
| 1 | LED (Team_A) | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | D1 |
| 1 | LED (Team_B) | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | D2 |
| 1 | LED_RED | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | D3 |
| 1 | LED_YELLOW | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | D4 |
| 1 | LOGO | customfootprints:PCBway | G*** |
| 1 | LOGO | customfootprints:kicadcat | G*** |
| 1 | Push_Switch (Team_A) | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | SW2 |
| 1 | Push_Switch (Team_B) | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | SW3 |
| 1 | Rocker_Switch | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | SW1 |
| 1 | SW_Push | Button_Switch_THT:SW_PUSH-12mm | SW4 |
It measures 100 × 100 mm and has 4 copper layers, 1.6 mm thick.
49 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.
From the Salted-Peanuts/KOTH-Timer repository on GitHub, at the commit this page was made from: the board is PCB/v0.2-tested/v0.2_KiCad_files/KOTH_V2.kicad_pcb and its schematic PCB/v0.1-display-issues/KiCad_files/nerf timer.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
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).

Salted-Peanuts/KOTH-Timer
DIY Arduino Nano ESP32 King of the Hill timer for Nerf, foam flinging, skirmish games, and objective-based events. Includes build guide, firmware, BOM, schematic, and phone referee UI.

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!



AndreiVladescu/ESP32-Bit-Pirate-Hardware
Carrier breaker-board for the ESP32-S3 Devkit. Works great with the ESP32-Bit-Pirate firmware.




h0lad/SolarMeshtasticNode
This is a Meshtastic Solar Node PCB based on the Heltec HT-CT62 and the linear solar charge controller TI BQ25185.