Skip to content

Signex v0.9.0

Choose a tag to compare

@github-actions github-actions released this 29 Apr 11:57

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

  • .snxsch schematic format — TOML manifest (format = "snxsch/1") wrapping the SchematicSheet payload 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.
  • .snxpcb PCB 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-original GroundReference, Differential, Clock; collapses Free+Unspecified into Unclassified; renames OpenCollector/OpenEmitterOpenDrainLow/OpenDrainHigh). Design rationale in crates/signex-types/docs/pin-design.md.
  • PinShape (9-variant) → PinShapeStyle (7 variants — drops per-direction-low modifiers since polarity is now on PinDirection; adds HysteresisInput / HysteresisOutput / Schmitt).
  • KiCad-numbered LayerId(u8) constants (F_CU=0, B_CU=31, …) → SignexLayer semantic enum + LayerKind categories + altium_label() per the Altium-flavoured Signex UI naming.
  • KiCad markup parser (~{X} / ^{X} / _{X} curly-brace syntax) → parse_signex_markup using a Markdown subset: **bold**, *italic*, ~~strike~~, ^superscript^, ~subscript~, _~overbar~_ (Signex extension for active-low signal naming), [label](url), \X escape.
  • kicad_auto_net_name_from_pins (Net-(<r>-Pad<p>) format string) → auto_net_name returning unnamed-<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 future signex-kicad-export sibling.

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-writer crates plus a CLI binary signex-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_async returning an iced::Task that 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-introduces kicad-parser / kicad-writer imports 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 marked KiCad source consulted: yes.
  • cargo-deny license 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 curated PinDirection / PinShapeStyle variant sets.

Breaking changes

  • .kicad_sch / .kicad_pcb / .kicad_pro files 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 .snxprj from then on.
  • signex_types::schematic::PinElectricalType and PinShape are gone — downstream code uses PinDirection / PinShapeStyle.
  • signex_types::layer::{F_CU, B_CU, F_SILKS, …} constants are gone — downstream code uses SignexLayer::* variants.
  • signex_types::markup::parse_markup and kicad_auto_net_name_from_pins are gone — downstream code uses parse_signex_markup and auto_net_name.
  • crates/kicad-parser and crates/kicad-writer are 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.