Skip to the content
2 layers140 × 90 mmLLUPS, the printed circuit board in 3D

LLUPS - Lithium Li-ion Universal Power Supply (KiCad 9)

Size
140 × 90 mm
Copper layers
2
Thickness
1.6 mm
Parts
39
Nets
38
Pads
142
Tracks, vias
0, 0
Pours
2
Routed
Not yet
KiCad
KiCad 9.0 (file 20241229)
Created
5 Apr 2026
Updated
17 May 2026

Overview

LLUPS is an open-source printed circuit board by laforestlabs, from the laforestlabs/LLUPS repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 140 × 90 mm with 39 parts on 38 nets.

It is built around the MT3608, AP2112K-3.3 and HY2113-KB5B, with the LN61CN3302MR-G, USBLC6-2SC6 and FS8205A among its other parts. Its parts include 11 resistors, 8 capacitors, 6 ICs, 3 diodes and 3 connectors. It belongs with the power boards of this library.

Main components

7

README

README.md

LLUPS — Lithium Li-ion Universal Power Supply

Status: Draft / Untested — Schematic and layout are procedurally generated and have not been fabricated or validated on hardware. Review all design choices and run DRC before ordering boards.

A compact PCB module providing regulated 5V and 3.3V power from two 18650 Li-ion cells (1S2P), charged via USB-C with passthrough capability.

Specs

ParameterValue
Cells2x 18650 in parallel (1S2P), 3.7V nominal
InputUSB-C 5V (default power, no PD)
Outputs5V @ 1A (boost), 3.3V @ 500mA (LDO), raw VBAT
ChargerBQ24072, 1-2A CC/CV with power path
ProtectionHY2113 (2.8V hard cutoff) + LN61C supervisor (3.3V operating cutoff)
BoostMT3608, 5V from 3.3-4.2V input
LDOAP2112K-3.3, 600mA
Board90×58mm default (variable with --board-size-search), 2-layer, 1oz Cu

Getting Started

bash
# Clone with submodules
git clone --recurse-submodules https://github.com/laforestlabs/LLUPS.git
cd LLUPS

# If already cloned without submodules
git submodule update --init --recursive

# Install KiCraft tooling (required for all CLI commands)
pip install -e KiCraft/

# Or with GUI support
pip install -e "KiCraft/[gui]"

Requirements:

  • Python 3.10+
  • KiCad 9 with pcbnew Python bindings
  • FreeRouting JAR (for automated routing)
  • KiCraft submodule (included, installed via pip above)

Core Files

text
LLUPS.kicad_pro          # KiCad 9 project
LLUPS.kicad_sch          # Schematic
LLUPS.kicad_pcb          # PCB layout
generate_project.py      # Regenerates project artifacts
spec.md                  # Design specification
BOM.csv / BOM.xlsx       # Bill of materials
KiCraft/                 # KiCraft tooling (git submodule) — https://github.com/laforestlabs/KiCraft

Regenerating

bash
python3 generate_project.py

Requires KiCad 9 CLI tools (kicad-cli) for netlist export.

Running the Optimizer

bash
autoexperiment LLUPS.kicad_pcb --rounds 100

The optimizer iterates placement and routing, keeping candidates that improve the overall score and discarding the rest. The best layout is saved to LLUPS_best.kicad_pcb.

Search Space Flags

FlagEffect
--unlock-allUnlock all footprints (batteries, connectors, mounting holes) — edge scoring still incentivizes edge placement
--board-size-searchAdd board width (60–120mm) and height (40–80mm) to the parameter search space (5mm steps)
bash
# Full exploration: unlock all footprints + vary board size over 150 rounds
autoexperiment LLUPS.kicad_pcb \
  --rounds 150 --unlock-all --board-size-search

Experiment Manager GUI

A standalone NiceGUI web app for configuring, running, monitoring, and analyzing experiments.

bash
# Install KiCraft with GUI dependencies (first time only)
pip install -e "KiCraft/[gui]"

# Launch the GUI
python3 -m kicraft.gui
# then open http://localhost:8080

GUI Tabs

TabPurpose
SetupConfigure search dimensions, mutation strategy, score weights, feature toggles (unlock all, board size search), mutation search bounds (min/max per parameter), and save/load presets
MonitorStart/stop experiments, live score chart, status cards, round-by-round progress
AnalysisBrowse past experiments, score trend plots, parameter sensitivity (Spearman), correlation matrix, convergence analysis, CSV export
BoardPCB layout viewer with layer selection and component list

Experiment data is stored in .experiments/llups.db (SQLite). Existing JSONL logs are auto-imported on first launch.

Monitoring Your Run

All monitoring is read-only — it reads output files and never interferes with the experiment. Zero performance impact.

During a run — pick any of these (in a second terminal):

bash
# Experiment Manager GUI (recommended — includes live charts + analysis)
python3 -m kicraft.gui

# Or: one-line terminal status
watch -n2 cat .experiments/run_status.txt

# Or: leave the HTML report open; it rebuilds after each round and refreshes itself
xdg-open report.html

After a run:

bash
# Animated layout evolution
xdg-open .experiments/progress.gif

# Score dashboard (PNG)
xdg-open .experiments/experiments_dashboard.png

# Interactive HTML report (richest view; rebuilt live during the run and finalized at the end)
generate-report .experiments/ -o report.html
xdg-open report.html

For monitoring during a run, the KiCraft GUI (python -m kicraft.gui) is the primary tool — it shows live per-leaf round progress, score plots, render thumbnails, and per-component pin controls. The CLI artifacts above (run_status.txt, progress.gif, experiments_dashboard.png, report.html) are still produced for headless workflows.

Architecture & Scoring

Static QA score (independent of the optimizer):

bash
score-layout LLUPS.kicad_pcb

KiCraft CLI Commands

Automation commands using the KiCad 9 pcbnew Python API, provided by the KiCraft submodule:

CommandPurpose
list-footprintsList components with positions
check-trace-widthsFind traces below minimum width
run-drcReport DRC markers
net-reportList nets and pad counts
move-componentMove a footprint to X,Y
arrange-gridArrange components in a grid
align-componentsAlign components along an axis

All available as CLI commands after pip install -e KiCraft/.

Subcircuits Workflow

The hierarchical/subcircuits redesign is currently focused on a real leaf-first routing flow:

  1. parse the true schematic hierarchy from LLUPS.kicad_sch
  2. extract each leaf sheet into a local board state
  3. stamp a real KiCad leaf board under .experiments/subcircuits/<slug>/
  4. validate the stamped pre-route leaf board before routing
  5. route the leaf through the real FreeRouting path
  6. validate the routed leaf artifact before accepting it
  7. persist accepted routed copper canonically in solved_layout.json

Current verification command:

bash
solve-subcircuits LLUPS.kicad_sch \
  --pcb LLUPS.kicad_pcb \
  --rounds 1 \
  --route

Leaf render diagnostics

Each leaf artifact may now include a small visual diagnostic bundle under:

text
.experiments/subcircuits/<slug>/renders/

These diagnostics are intended for debugging real stamped/routed leaf boards, not for demo polish. The preferred artifact set is:

  • pre_route_copper_both.png
  • pre_route_front_all.png
  • pre_route_drc.json
  • pre_route_drc_overlay.png when coordinate-bearing violations exist
  • routed_copper_both.png
  • routed_front_all.png
  • routed_drc.json
  • routed_drc_overlay.png when coordinate-bearing violations exist
  • pre_vs_routed_contact_sheet.png

This makes it easier to answer:

  • is the stamped pre-route leaf board already illegal?
  • are footprints or edge-coupled connectors misaligned to Edge.Cuts?
  • did FreeRouting add meaningful copper?
  • did routing improve or worsen the board visually?

Current status

The subcircuit pipeline is functional: all 6 LLUPS leaves solve, route, and pass acceptance gates. Parent composition assembles the leaves and routes interconnects via FreeRouting. The pipeline runs to completion without Python exceptions and produces human-inspectable output. The parent acceptance gate currently rejects due to FreeRouting routing quality (a tuning target, not a functional gap). See ROADMAP.md for detailed phase status.

License

GPLv3 — see LICENSE.

Parts

39
QtyValueFootprintReferences
310kResistor_SMD:R_0402_1005MetricR5, R8, R10
31kResistor_SMD:R_0402_1005MetricR3, R6, R7
34.7uCapacitor_SMD:C_0402_1005MetricC2, C3, C4
210uCapacitor_SMD:C_0805_2012MetricC1, C5
218650LLUPS:BatteryHolder_MYOUNG_BH-18650-A1AJ006BT1, BT2
21uCapacitor_SMD:C_0402_1005MetricC7, C8
25.1kResistor_SMD:R_0402_1005MetricR1, R2
2MountingHoleMountingHole:MountingHole_2.2mmH4, H86
11.5kResistor_SMD:R_0402_1005MetricR4
1100kResistor_SMD:R_0402_1005MetricR11
110k_NTCResistor_SMD:R_0402_1005MetricRT1
122uCapacitor_SMD:C_0805_2012MetricC6
12A_PTCFuse:Fuse_0805_2012MetricF1
14.7uInductor_SMD:L_0805_2012MetricL1
175kResistor_SMD:R_0402_1005MetricR9
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U5
1BQ24072Package_DFN_QFN:VQFN-16-1EP_3.5x3.5mm_P0.5mm_EP2.1x2.1mmU2
1CHGLED_SMD:LED_0603_1608MetricD1
1DebugConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ3
1FS8205APackage_TO_SOT_SMD:SOT-23-6Q1
1HY2113-KB5BPackage_TO_SOT_SMD:SOT-23-6U3
1LN61CN3302MR-GPackage_TO_SOT_SMD:SOT-23-3U6
1MT3608Package_TO_SOT_SMD:SOT-23-6U4
1OutputConnector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ2
1PGOODLED_SMD:LED_0603_1608MetricD2
1SS14Diode_SMD:D_SMAD3
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U1
1USB_CConnector_USB:USB_C_Receptacle_GCT_USB4085J1

Similar boards

  • 2 layers78 × 37 mmAkku 3V3 Versorgung, the printed circuit board in 3D

    Akku 3V3 Versorgung

    yvolodym/18650-3v3-supply

    KiCad: stabile 3,3-V-Versorgung aus 18650-Li-Ion-Akku – TP4056-Ladung, DW01A/FS8205A-Schutz, MT3608-Boost, AP2112K-LDO

    32 partsCERN-OHL-S-2.0
  • 2 layers62 × 6 mmTableLight, the printed circuit board in 3D

    TableLight

    jonny190/TableLight

    A 3D-printable, battery-powered, USB-C rechargeable table lamp in the classic "Poldina" shape - honeycomb disc base, thin stem, down-firing cone shade with a white top - running WLED on an ESP32, with a capacitive touch…

    72 partsMIT
  • 2 layers76.8 × 100 mmProject CV, the printed circuit board in 3D

    Project CV

    KazimGL/ESP32-PowerIoT-DevBoard

    ESP32 battery-powered IoT dev board with Li-ion charging, protection, and sensor support — designed in KiCad

    62 parts
  • 2 layers48 × 38 mmRAMS RevC, the printed circuit board in 3D

    RAMS RevC

    JanClyde05/Road-Accident-Monitoring-System

    This directory contains the planning, specification, and initial KiCad project for RAMS Wearable PCB Revision C. Do not fabricate from this directory yet -- manual schematic wiring and DRC verification are still needed.

    68 parts1
  • 2 layers100 × 100 mmEnvcity aqm v2, the printed circuit board in 3D

    Envcity aqm v2

    MateusMaruzka/aqm_envcity_hw

    138 parts2
  • 2 layers150 × 40 mmBicopter, the printed circuit board in 3D

    Bicopter

    InputBlackBoxOutput/Bicopter

    Design files for a PCB Bicopter

    79 parts1MIT
  • 2 layers100 × 80 mmAlarm clock, the printed circuit board in 3D

    Alarm clock

    Carabouille/Alarm_Clock_dawn_simulator

    A description of my Alarm clock with dawn simulator for the Fallout event organised By Hackclub

    75 parts
  • 2 layers80 × 50 mmIguana V1, the printed circuit board in 3D

    Iguana V1

    iowlabs/Iguana

    Repositorio para proyecto Iguana IOWLabs (Cultivo)

    120 parts1

Questions

How big is the LLUPS PCB?

It measures 140 × 90 mm and has 2 copper layers, 1.6 mm thick.

What parts does the LLUPS use?

39 parts, built around the MT3608, AP2112K-3.3, HY2113-KB5B and LN61CN3302MR-G. 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 LLUPS KiCad files?

From the laforestlabs/LLUPS repository on GitHub, at the commit this page was made from: the board is LLUPS.kicad_pcb and its schematic BATT.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the LLUPS design in my own project?

Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).