master
Download ZIP Propose a change
Name Last commit message Last updated
bin Publish 1.0.26 · John Lauer 22d ago
docs Publish 1.0.17 · John Lauer 3mo ago
LED_TEST Publish 1.0.22 · Colby Knox 1mo ago
screenshots Publish 1.0.17 · John Lauer 3mo ago
src Use generic 3rd party fab wording · John Lauer 22d ago
tests 1.0.22: silkscreen never lands on copper; pin-1 mark only on polarized parts (new polarized input). The body-outline re… · Colby Knox 1mo ago
.gitignore Publish 1.0.16 · John Lauer 3mo ago
adom-footprint-billboard.png name-first hero (app name biggest) · John Lauer 3mo ago
adom-footprint-hero-v3.png apply editor sheet: name-first hero · John Lauer 3mo ago
adom-footprint-hero-v4.png bigger name (+20%), smaller logo (-10%) · John Lauer 3mo ago
adom-footprint.png Add hero asset adom-footprint.png · John Lauer 4mo ago
build.sh Publish 1.0.11 · John Lauer 3mo ago
Cargo.lock Use generic 3rd party fab wording · John Lauer 22d ago
Cargo.toml Use generic 3rd party fab wording · John Lauer 22d ago
CHANGELOG.md 1.0.25: heatsink vias carry KiCad's pad_prop_heatsink property · John Lauer 1mo ago
dockbar.json Rename to dockbar.json: the canonical manifest name (hard cutover) · John Lauer 2mo ago
hero.png hero at root (blob subdir workaround test) · John Lauer 4mo ago
herobillboard-v2.png fresh hero path (bust stale blob cache) · John Lauer 4mo ago
install.sh Sync current source (open-source, up to date) · John Lauer 3mo ago
LICENSE Add MIT license (open source) · John Lauer 3mo ago
package.json Use generic 3rd party fab wording · John Lauer 22d ago
page.json Use generic 3rd party fab wording · John Lauer 22d ago
README.md 1.0.25: heatsink vias carry KiCad's pad_prop_heatsink property · John Lauer 1mo ago
release.sh Scrub internal hostnames (adom/wiki#77): legacy wiki links -> wiki.adom.inc, personal hosts -> placeholder · Colby Knox 2mo ago
SKILL.md Add rule: remove EasyEDA logos from 3D models during creation · Caleb 16d ago
uninstall.sh Sync current source (open-source, up to date) · John Lauer 3mo ago
VERSION Use generic 3rd party fab wording · John Lauer 22d ago

adom-footprint

Standalone Rust CLI + live app for KiCad PCB footprints. Generates .kicad_mod files natively in Rust, renders them as dark-themed SVGs through the shared service-kicad container, and serves an AI-drivable live viewer. No Node, no local KiCad install.

The adom-footprint live app — the chip-fetcher library rail on the left, the footprint canvas in the middle, and a docked details panel (Layers, Text placement, and a 3D chip preview) on the right

The live app: browse the whole chip-fetcher library on the left (filter / ↑↓ / click, or deep-link with ?mpn=); on the right, a docked details panel with Layers, the text-placement editor, and a 3D chip preview + specs so you can see exactly which part you're on.

The text-placement editor with Auto-layout, per-tool naming, undo/redo, an "Auto-layout on open" checkbox, and a Save-to-library button

Place the RefDes/Value text: one-click Auto-layout clears the pads (and normalizes the size), or drag/nudge it yourself — with undo and per-EDA naming (KiCad Reference/Value · Altium Designator/Comment · …). Save writes it back to the library .kicad_mod (original backed up to .orig); tick Auto-layout on open to sweep the whole library, auto-saving as you go.

The paste-dots layer — 300µm solder-paste dispensing positions on every pad

The paste-dots layer: 300µm solder-paste dispensing positions, computed for every footprint (off by default).

What it does

  • Generate .kicad_mod natively in Rust from structured pad data — pads (rect/roundrect/circle, rotation, custom layers), body outline, and courtyard.
  • Render the footprint to a cropped, dark-themed SVG via service-kicad (POST /kicad/pcb/export/svg) by wrapping it in a minimal one-footprint board at page center — the same render path chip-fetcher uses, so thumbnail and app match.
  • Serve a live, AI-drivable app: the frontend stays connected to the Rust server (GET /state poller + POST /eval channel), so the AI can push a new footprint, hot-patch the UI, or read the console in real time.

Install

adom-wiki pkg install adom-footprint

Quick start

# Create a footprint from pad JSON (stdin or --file)
echo '{"footprintName":"R_0402","pads":[...]}' | adom-footprint create --out R_0402

# Preview an existing .kicad_mod as a themed viewer
adom-footprint preview --file R_0402/R_0402.kicad_mod

# Run the live app (AI-drivable: /state, /load, /eval, /console)
adom-footprint serve --port 8783 --file R_0402/R_0402.kicad_mod

Open the served app through the Adom proxy URL (https://<slug>.adom.cloud/proxy/8783/), never localhost:8783 — the webview renders outside the container.

Heatsink vias in the create JSON (from 1.0.23)

A thermal pad without vias into the plane is a part that overheats, and vias that have to be redrawn per EDA tool do not get drawn. So they are written once, into the footprint:

From 1.0.25 each via also carries (property pad_prop_heatsink), the marker KiCad uses for thermal vias. A thermal via you place by hand gets the same marker with "heatsink": true on the pad.

{
  "footprintName": "QFN-16-EP",
  "pads": [ ... ],
  "heatsinkVias": { "pad": "17", "drill_mm": 0.3, "pitch_mm": 0.8, "ring_mm": 0.15, "tented": true }
}
Field Default Meaning
pad required number of the exposed SMD pad the vias go under
drill_mm (alias drill) 0.3 drill diameter
pitch_mm (alias pitch) 0.8 grid pitch
ring_mm (alias ring) 0.15 annular ring; via pad diameter is drill_mm + 2 * ring_mm
tented true true puts the via pads on *.Cu only; false adds *.Mask

heatsink_vias is accepted as an alias of heatsinkVias. create expands the block into plated circular thru_hole pads that carry the exposed pad's own number, on a grid centred on that pad, with as many columns and rows as fit while keeping the full ring inside the pad (at least one via). If pad does not name an SMD pad, nothing is added. Same-number plated holes are how KiCad, Altium (through adom-lbr 2.46.0+) and Fusion/EAGLE all express "same net, drilled", so the vias reach every tool from this one footprint.

The hint. Every create checks the largest SMD pad. When it is an exposed pad (at least 1 mm² and at least three times the median pad area) with no thru_hole pads of its number, create prints _hint: HEATSINK VIAS MISSING naming the pad, its area and the "heatsinkVias": {"pad": "<n>"} line to add. When vias are present it prints their count and how many came from heatsinkVias.

Silkscreen rules (from 1.0.22)

For rectangular parts the generated silkscreen never lands on copper, and the pin-1 mark is drawn only on polarized parts. Silk is a 0.12 mm stroke kept 0.15 mm clear of every pad.

  • Two-pad parts get two lines parallel to the pads, outside the copper, spanning the body. A polarized two-pad part adds a bar just outside pad 1 and extends both lines to it.
  • Other parts keep the body outline, with every piece that comes within the clearance of a pad cut away (pieces shorter than 0.2 mm are dropped), plus a pin-1 bar when polarized.
  • "polarized": true|false in the create JSON sets it (LED, diode, tantalum: true). The default is false for two-pad parts and true for parts with more than two pad numbers.

CLI reference

Command Description
create --file <json> [--out <dir>] Generate .kicad_mod + SVG + viewer HTML from pad JSON
preview --file <kicad_mod> [--out <dir>] Render an existing footprint to a themed viewer
serve [--port 8783] [--file <kicad_mod>] Run the live AI-drivable app server

Architecture

Pure Rust. Footprint generation (src/fp_gen.rs) is verified against golden files in tests/ (e.g. R_0402.kicad_mod, byte-for-byte). The only network dependency is service-kicad for SVG rendering — a lightweight proxy to the shared KiCad-10 container, so nothing installs KiCad locally. The live app server (src/server.rs) follows the Adom app-creator contract: GET /state, POST /load, POST /eval + GET /eval/pending + POST /eval/:id/result, GET/POST /console, POST /shutdown, GET /favicon.svg, and best-effort HD port registration.

Build from source

The full source ships on the wiki app page — anyone in the community can build it locally:

# Fetch the source bundle from the wiki
adom-wiki repo clone adom-footprint         # downloads + unpacks the repo

cargo build --release                 # standalone — only needs Rust + cargo
cargo test --release                  # runs the golden-file parity tests
cp target/release/adom-footprint ~/.local/bin/

The only runtime dependency is network access to a service-kicad endpoint (KICAD_SERVICE_API, defaults to the shared container).

Contribute back via pull request

adom-footprint is public, source included. To propose a change:

  1. adom-wiki repo clone adom-footprint to get the repo.
  2. Make your change and run cargo test --release (keep the golden tests green).
  3. Open a pull request against the wiki page for adom-footprint.

Note: real PR support on wiki.adom.inc is in progress. Until it lands, send patches or a branch link to the maintainers and they will apply it.

Wiki

https://wiki.adom.inc/apps/adom-footprint