-
Notifications
You must be signed in to change notification settings - Fork 20
Library
Signex keeps components in its own library format — a .snxlib
library holding component rows in tables, plus standalone
primitive files (.snxsym symbols, .snxfpt footprints,
.snxsim sim models) that the rows bind by UUID.
The Library Browser tab landed in v0.10.0 as a read-only table. v0.11.0 brought the full data model, the adapters, the Component Preview tab, the primitive picker and the distributor adapters. v0.13 and v0.14 polished the surfaces around it.
Read this first. The library subsystem is real and its data model is complete, but several user-visible actions are still wired to stubs — most importantly you cannot yet place a library component onto a schematic. Every gap is listed under Limitations. Nothing on this page is aspirational; if it's described here, it works today.
A .snxlib is a directory whose .snxlib file is the entry point:
mylib/ ← the library root
├── mylib.snxlib ← TOML manifest + [tables.<name>] TSV blocks
├── symbols/<name>.snxsym
├── footprints/<uuid>.snxfpt
├── sims/<uuid>.snxsim
├── models/ ← 3D models (optionally Git-LFS tracked)
└── .git/ ← only if you enable version control
Component rows live inside the .snxlib file, under
[tables.<name>] blocks whose bodies are raw TSV in a TOML literal
string. Same envelope idea as .snxsch / .snxpcb: a TOML header for
the sparse metadata, TSV for the bulk — line-diffable in git, editable
in a spreadsheet. The format token is snxlib/1; a file carrying
anything else is refused rather than half-read.
The multi-file layout is deliberate: with symbols and footprints as
their own files, git log -- symbols/OPAMP-DUAL-8.snxsym tells you the
history of that one symbol.
A component row is the unit of storage — not a file. Each row carries:
| Field | What it is |
|---|---|
internal_pn |
Your part number — the row's human key |
primary_mpn + alternates
|
Manufacturer part + the approved-vendor list |
symbol_ref / footprint_ref / sim_ref
|
(library_id, uuid) bindings to primitive files |
parameters |
Template-validated parameter map (value, tolerance, …) |
supply |
Distributor listings (distributor, SKU, URL) |
state |
Lifecycle — Draft / InReview / Released / Deprecated / Obsolete
|
version |
Semver revision string, independent of the bound primitives' |
pin_map_overrides |
Per-row pin → pad remapping |
Rows reference primitives; they never embed them. One symbol can back a hundred rows, and editing that symbol is one edit.
Two storage backends implement the same column shape: the local + git
adapter (TSV inside the .snxlib) and a database adapter (JSONB
rows). One wire format, two backends.
Any of these mount a library:
- File ▸ Library ▸ Open Library…
- The Library left-dock panel's
+ Open Library…button - Double-click a
.snxlibin the project tree (single click only highlights — a second click within 500 ms opens) - Automatically, when you open a project that lists libraries
The Components panel buckets every mounted library into three sections by mount source:
| Section | Where it comes from | Lifetime |
|---|---|---|
| Project | The open project's library list | Follows the project |
| Installed |
+ Add Library… on the section header |
Wiped on app close |
| Global |
+ Add Library…, persisted to your config dir |
Re-mounted every launch |
Clicking a component row in the Components panel opens its Component Preview tab.
Right-click a project root in the project tree → Add New to Project ▸
Component Library. You pick the .snxlib location in a Save-As
dialog, then a Library Options modal offers:
-
Enable version control — runs
git initat the library directory and records an initial commit. Off by default; fresh libraries land as plain files with no hidden.git/. -
Use Git LFS for binary 3D models — writes a
.gitattributestracking*.step/*.stp/*.wrl/*.iges. Only meaningful when version control is on; greyed out otherwise.
Nothing is written to disk at modal-confirm time. The request is held on the project and materialised on your next Ctrl+S — an explicit save is the only thing that touches disk.
You can turn version control on later: right-click the library node →
Enable Version Control..., which opens a checkbox list of every file
in the library so you can scope the initial commit without hand-editing
a .gitignore. The entry disappears once the library has a .git/.
┌─ mylib.snxlib ────────────────────────────────────────────────────┐
│ Classes │ [+ Component] [Lifecycle ▾] [Search…] │
│ │ ┌──┬────────────┬──────────┬──────┬─────┬───────┐ │
│ Resistors ✎× │ │● │ Internal PN│ Manufact.│ MPN │ Rev │Symbol │ │
│ Capacitors ✎×│ │● │ R-10K-0805 │ Vishay │ CRC… │1.0.2│• a1b2…│ │
│ Connectors ✎×│ │● │ R-47K-0805 │ Yageo │ RC0… │1.0.0│ — │ │
│ │ └──┴────────────┴──────────┴──────┴─────┴───────┘ │
│ [+ Class] │ [Add Component] [Delete Selected] │
└───────────────┴───────────────────────────────────────────────────┘
One row per component category. The active row highlights; ✎
renames it inline, × deletes it (the adapter refuses a non-empty
delete and the reason surfaces in a red banner at the top of the
sidebar). + Class at the bottom opens an inline name field —
type a name, press Enter or click Create.
Each category is one [tables.<name>] block in the .snxlib file.
Columns are derived per table, in this order:
- Internal PN, Manufacturer, MPN, Rev, Symbol, Footprint — always present.
- Parameter columns from the parameter template resolved for the
table (a
resistorstable pulls the resistor template's required params). - Tags — only when at least one row in the table is tagged.
- Up to four of the most common remaining parameter keys across the table's rows.
Internal PN / Manufacturer / MPN and the parameter columns are inline-editable — click the cell, type, press Enter to commit. Rev, Tags, Symbol and Footprint are read-only status columns.
- Rev shows the row's version, prefixed with a 🔒 in amber when the row is marked released.
-
Symbol / Footprint show
—when unbound and• <uuid…>when bound. You bind them from the Properties panel (below), not by typing in the cell.
Click any column header to sort; a ▲ / ▼ marks the active sort
column and a second click flips the direction. Sorting is
numeric-aware: if both cells parse as numbers it sorts numerically,
otherwise case-insensitively — so a numeric column never sorts
1, 10, 2.
The Search… box filters on Internal PN, manufacturer and MPN. Your
query is remembered per .snxlib path across restarts.
Every row carries a lifecycle state, shown as a coloured dot in the gutter at the start of the row:
| State | Dot |
|---|---|
| Released | green |
| In Review | blue |
| Draft | faint grey |
| Deprecated | amber (and the whole row gets a faint amber wash) |
| Obsolete | dim grey |
The Lifecycle pick-list in the header filters the visible rows:
| Option | Shows |
|---|---|
| Active + Preferred (default) | Released, In Review, Draft |
| Preferred Only | Released only |
| Incl. Deprecated | the default set plus Deprecated |
| All (incl. Obsolete) | everything |
+ Component in the header and Add Component under the grid do
the same thing: append a draft row to the active table and select it.
There is no modal — you fill the PN in inline and bind the symbol /
footprint from the Properties panel.
Delete Selected is greyed until a row is selected. Select a row by clicking it.
Right-clicking a library node in the project tree offers the other
creation flows: Add New ▸ Component, Add New ▸ Symbol Library
(a fresh .snxsym) and Add New ▸ Footprint Library (a fresh
.snxfpt). Add New ▸ Component appends a row and opens it in a
Component Preview tab; when no library is mounted, or the library has
no table to put the row in, a New Component modal opens instead so
you can pick a target.
Select a row in the Library Browser and the right-edge Properties Panel shows that row's detail: internal PN, class, lifecycle label, and whether the symbol / footprint is bound, unbound, or bound to a UUID that isn't currently mounted.
Pick Symbol… / Pick Footprint… open the primitive picker:
┌─[ Pick Symbol ]────────────────────────────────────┐
│ Filter: [_______________] │
│ │
│ ▼ mylib.snxlib (2) │
│ ESP32-WROOM-32.snxsym (uuid abc12345…) │
│ LM7805.snxsym (uuid bd45ee01…) │
│ │
│ [ Browse filesystem… ] [ Cancel ] │
└────────────────────────────────────────────────────┘
It lists every primitive of the right kind across every mounted library, grouped by library. The filter matches on name or UUID. Clicking a row binds it and saves the component row.
Browse filesystem… covers the case where the primitive you want
lives in a library you haven't mounted. Pick the file and Signex
auto-mounts its containing .snxlib before binding — you never
have to mount the library by hand first. The picked file must be inside
a .snxlib and named by its UUID; anything else is refused with an
inline error rather than a silent failure.
The picker never mints an empty primitive file behind your back. An unbound row keeps a nil-UUID sentinel until you pick something.
Opening a component row (click it in the Components panel, or create a new one) opens a Component Preview tab with five sub-tabs:
| Tab | What it does |
|---|---|
| Preview | Read-only render of the bound symbol + footprint, plus the pin map |
| Parameters | Edit the row's parameter map |
| Supply | Primary MPN, alternates (AVL), distributor listings |
| Datasheet | The row's datasheet reference |
| Simulation | The bound SPICE model |
Symbol and footprint are preview-only here — editing happens in the standalone Symbol Editor / footprint editor. Each pane on the Preview tab carries a button that adapts to the binding: it reads Open Symbol Editor / Open Footprint Editor when the row is bound, and Pick Symbol / Pick Footprint when it isn't.
The Supply tab is a manual editor. Primary MPN takes manufacturer / MPN / status / notes; + Add Alternate appends an AVL row with its own status (Primary / Approved / Conditional / Disqualified); + Add Listing appends a distributor row (distributor, SKU, URL). Nothing on this tab is auto-populated from a distributor API today — see Limitations.
Like every Signex tab, a Component Preview can be undocked into its own OS window — see Multi-window Editing.
When a .snxsym editor tab is active, the SCH Library left-dock
panel lists the symbols inside that file — Altium's SCH Library panel,
with a <library> › <file> (N symbols) breadcrumb and two columns:
Design Item ID and Description. Click a row to switch the active
symbol.
Under a multi-unit symbol the panel expands into one row per part
(Part 0 (shared) when the symbol has Part Zero pins, then Part 1…
Part N) — click to switch the active unit. See
Symbol Editor.
The action row at the bottom has Place / Add / Delete / Edit. Only Add (append a fresh empty symbol to the file) and Delete (drop the active symbol; greyed when the file holds only one) do anything today. Place and Edit are greyed-out stubs.
Four distributor adapters ship in the build:
| Distributor | Auth |
|---|---|
| DigiKey | OAuth2 with PKCE |
| Mouser | API key |
| LCSC | none |
| JLCPCB | none |
Configure them at Tools ▸ Preferences… ▸ Library ▸ Distributor APIs
(Ctrl+,).
-
DigiKey — Connect via OAuth opens your browser and stores the
refresh token in the OS keyring (macOS Keychain, Windows Credential
Manager, libsecret on Linux). Set
SIGNEX_DIGIKEY_CLIENT_IDandSIGNEX_DIGIKEY_CLIENT_SECRETin your environment first. - Mouser — paste your API key (rendered masked; the buffer stays cleartext) and hit Test.
- LCSC / JLCPCB — nothing to configure.
- An order-of-preference list ranks the providers. The order persists to your user config.
Responses are cached per provider for 24 hours.
What is not wired: connecting an account is the whole flow today. The Refresh All Pricing menu item and the per-row right-click pricing refresh log a TODO and do nothing. Distributor listings on the Supply tab are typed in by hand.
With version control on, every library write commits through libgit2 with a message describing the change.
The History right-dock panel follows the active tab and shows that file's last 50 commits — subject, author, time — for any file in any git repository, not just library files. It loads asynchronously and drops stale results when you switch tabs. When the active file has uncommitted changes a working-tree card renders on top of the commit list. The panel also has its own messages for "no active file", "not under version control", "loading", and a fresh repo with no commits yet.
When you open a schematic, Signex compares the library version pinned on each placed symbol against the current row version in its source library.
- In Personal workflow mode, drift is applied silently and the schematic is marked dirty.
- In Team / Enterprise mode, a Library Updates Available dialog lists the drifting instances (designator, current version, latest version, and whether the bump is major / minor / patch) so you can apply them selectively or skip.
Workflow mode is a per-library setting stored in the .snxlib
manifest.
Known gaps as of v0.14.0. These are real, they are tracked, and this list is the honest version:
-
You cannot place a library component onto a schematic.
File ▸ Library ▸ Place Component… opens the picker and lets you
select a component, but Place dismisses the picker without
placing anything. The conversion from a
.snxsymsymbol to the schematic's placed-symbol representation does not exist yet — it is tracked as issue #365 (the conversion) and issue #364 (wiring it into the place flow). Until those land, the library subsystem is for authoring and organising parts, not for consuming them on a sheet. - Pricing refresh does nothing. Both the library-level Refresh All Pricing and the per-row right-click refresh log a TODO. See issue #152, which tracks the wider set of library actions wired to no-op handlers.
- The Components panel's add-library actions are partly stubbed. The Project-section add path and the Global Libraries management dialog are TODO paths (same issue #152).
- The SCH Library panel's Place and Edit buttons are greyed stubs.
- Library I/O runs on the UI thread. Large libraries can stutter on read/write; there is no cross-process lock. Tracked as issue #105.
- The library server is not production-ready. The HTTP server crate exists but has no TLS, a plaintext token and a single shared credential — issue #115. Do not expose it.
- The Edit Component Details modal is unreachable. Row editing is inline-in-the-grid plus the Properties panel; the old double-click modal is no longer wired up.
- The Components panel filter is a plain substring match over MPN / manufacturer / internal PN / library name. The richer query syntax isn't implemented.
-
Symbol Editor — authoring the
.snxsymprimitives a component row binds - Properties Panel — where row detail and the Pick Symbol / Pick Footprint buttons live
- Docking and Panels — showing the Library, Components, SCH Library and History panels
- Multi-window Editing — undocking a Library Browser or Component Preview tab
Signex v0.14.0 · Apache-2.0 · Issues · Discussions · Website