Signex v0.9.0
The Apache-clean cutover release. Resolves issue #62 raised by Seth Hillbrand of the KiCad project flagging that several Signex crates derived from KiCad's GPL-3.0 source were shipping under Apache-2.0. The main signex repository is now Apache-2.0 clean and contains no KiCad-derived code; KiCad I/O moves to the optional signex-kicad-import companion tool (GPL-3.0-or-later), shipped independently.
The library subsystem (Library Browser, SCH Library editor, Component Editor) that was in flight on feature/v0.9-snxlib-as-file is preserved at the v0.9-snxlib-paused-2026-04-29 tag and ships as v0.10.0 on top of the Apache-clean foundations from this release.
Native file formats — TOML + TSV bulk blocks
.snxschschematic format — TOML manifest (format = "snxsch/1") wrapping theSchematicSheetpayload via 4 adapter row tables ([sheets.components],[sheets.wires],[sheets.junctions],[sheets.labels]) plus an[extras.*]TOML block for fields that don't fit a flat row schema. Same format family as.snxlib/.snxsym/.snxfpt..snxpcbPCB format — same shape with adapter rows for[footprints],[pads],[tracks],[vias], plus[stackup]/[[zones]]in regular TOML for hierarchical data.- Format chosen for line-diff-friendly git workflows, ~5× smaller than the equivalent JSON, single file per design, and zero S-expression-shaped grammar that could regress KiCad-derivation exposure.
- Round-trip preserves every field on
SchematicSheet/PcbBoard.
Apache-clean signex-types
PinElectricalType(12-variant, KiCad-shaped) →PinDirection(14 variants — adds Signex-originalGroundReference,Differential,Clock; collapsesFree+UnspecifiedintoUnclassified; renamesOpenCollector/OpenEmitter→OpenDrainLow/OpenDrainHigh). Design rationale incrates/signex-types/docs/pin-design.md.PinShape(9-variant) →PinShapeStyle(7 variants — drops per-direction-low modifiers since polarity is now onPinDirection; addsHysteresisInput/HysteresisOutput/Schmitt).- KiCad-numbered
LayerId(u8)constants (F_CU=0,B_CU=31, …) →SignexLayersemantic enum +LayerKindcategories +altium_label()per the Altium-flavoured Signex UI naming. - KiCad markup parser (
~{X}/^{X}/_{X}curly-brace syntax) →parse_signex_markupusing a Markdown subset:**bold**,*italic*,~~strike~~,^superscript^,~subscript~,_~overbar~_(Signex extension for active-low signal naming),[label](url),\Xescape. kicad_auto_net_name_from_pins(Net-(<r>-Pad<p>)format string) →auto_net_namereturningunnamed-<sheet>:<ref>:<pin>.
Crates removed from main repo
crates/kicad-parser/(3,938 LOC) — moved to the GPL-3.0 companion repo.crates/kicad-writer/(2,274 LOC) — moved to the GPL-3.0 companion repo.crates/signex-output/src/netlist/kicad_sexpr.rs(336 LOC) — KiCad netlist exporter; moved to the companion or a futuresignex-kicad-exportsibling.
Companion repo signex-kicad-import (GPL-3.0-or-later)
- New separate repository at https://github.com/alplabai/signex-kicad-import.
- Houses the relocated
kicad-parser+kicad-writercrates plus a CLI binarysignex-kicad-import. - One-way conversion:
.kicad_sch/.kicad_pcb/.kicad_pro→.snxsch/.snxpcb/.snxprj. Originals remain intact. - Distributed independently — Apache consumers of Signex Community see no GPL aggregation in their build closure.
Performance (deferred to v0.9.1)
Async save and borrow-based serialise were planned for v0.9.0 but
are deferred to v0.9.1 to bound the v0.9.0 release scope. The
current Engine::save_as runs synchronously on the calling thread
with a full document-clone before serialisation; on huge PCBs (~500K
tracks) this blocks the UI for ~1–2 s on Ctrl+S. Tracked as a v0.9.1
follow-up:
Engine::save_as_asyncreturning aniced::Taskthat serialises +
writes off the UI thread.- Borrow-based
SnxSchematic::write_string_borrowed(&SchematicSheet)
to skip the document-clone (~50–100 ms saving on huge PCBs).
Schematics save instantly today; the perf work is targeted at the
high-end PCB case.
CI guards
.github/workflows/license-guard.yml— fails any push or PR that re-introduceskicad-parser/kicad-writerimports or removed KiCad-shaped types..github/workflows/pr-license-declaration.yml— fails PRs whose description is missing the contributor self-declaration block or whose author markedKiCad source consulted: yes.cargo-denylicense job in.github/workflows/ci.yml— rejects GPL / AGPL / LGPL / unlicensed transitive dependencies.deny.toml— Apache-compatible permissive allowlist.
Documentation
docs/LICENSING.md— canonical licensing rationale + audit-trail pointers + contributor guidance.docs/audit/kicad-derivation.md— file-by-file audit of every removed item plus the residual-mention catalog.docs/audit/contributors-2026-04-29.md— contributor consent record (audit trail).docs/audit/third-party-kicad-parsers.md— survey of clean-room third-party Rust KiCad parsers.docs/audit/release-notes-remediation-v07-v08.md— text to apply manually to v0.7.0 / v0.7.1 / v0.8.0 GitHub Release bodies (those releases shipped Apache-2.0 with KiCad-derived code in error; flagged superseded).docs/audit/communication-drafts.md— drafts of the issue #62 reply, signex.dev hero copy, GitHub Discussions sticky, Discord post.CONTRIBUTING.md— added License compliance section + PR self-declaration block.crates/signex-types/docs/pin-design.md— rationale for the curatedPinDirection/PinShapeStylevariant sets.
Breaking changes
.kicad_sch/.kicad_pcb/.kicad_profiles no longer open directly in Signex. Users with existing KiCad projects install the signex-kicad-import companion tool, run it once against their.kicad_pro, and open the resulting.snxprjfrom then on.signex_types::schematic::PinElectricalTypeandPinShapeare gone — downstream code usesPinDirection/PinShapeStyle.signex_types::layer::{F_CU, B_CU, F_SILKS, …}constants are gone — downstream code usesSignexLayer::*variants.signex_types::markup::parse_markupandkicad_auto_net_name_from_pinsare gone — downstream code usesparse_signex_markupandauto_net_name.crates/kicad-parserandcrates/kicad-writerare gone from the workspace.
Versions affected
The v0.7.0 / v0.7.1 / v0.8.0 release notes have been edited to flag those releases as superseded with the licensing notice. Binaries remain available for historical use; please prefer v0.9.0 (or later) for new installations.