Skip to content

Library

alpCaner edited this page Jul 16, 2026 · 1 revision

Component Libraries

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.

What a library looks like on disk

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.

The data model

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.

Opening a library

Any of these mount a library:

  • File ▸ Library ▸ Open Library…
  • The Library left-dock panel's + Open Library… button
  • Double-click a .snxlib in 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.

Creating a library

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 init at 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 .gitattributes tracking *.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/.

Library Browser tab

┌─ 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]               │
└───────────────┴───────────────────────────────────────────────────┘

The sidebar

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.

The grid

Columns are derived per table, in this order:

  1. Internal PN, Manufacturer, MPN, Rev, Symbol, Footprint — always present.
  2. Parameter columns from the parameter template resolved for the table (a resistors table pulls the resistor template's required params).
  3. Tags — only when at least one row in the table is tagged.
  4. 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.

Lifecycle

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

Adding and deleting rows

+ 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.

Binding a symbol or footprint — the Properties panel

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.

Component Preview

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.

SCH Library panel

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 1Part 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.

Distributor APIs

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+,).

  • DigiKeyConnect 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_ID and SIGNEX_DIGIKEY_CLIENT_SECRET in 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.

Version control and history

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.

Library Updates

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.

Limitations

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 .snxsym symbol 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.

See also

Clone this wiki locally