Integrations · Pull in, push out
Connectors
A connector is a small ESM module stored in the app: a configSchema, plus run() to pull data in or push() to send the library out. The direction is read from what you export. In between it's plain JavaScript, so it does whatever your workflow needs.
export const configSchema = [
{ key: "file", label: "CSV file", type: "file", required: true },
];
// Exporting run() makes a connector inbound.
export async function run(config, helpers) {
const rows = helpers.parseCSV(config.file);
helpers.log(`${rows.length} rows`);
const components = rows.map((r) => ({
name: r["Part Name"],
parameters: [
{ type: "Tolerance", value: r.Tolerance },
{ type: "Package", value: r.Package },
],
mpns: [{ manufacturer: r.Manufacturer, partNumber: r.MPN }],
}));
return { components };
}Illustrative: an inbound connector turning a supplier CSV into parameters and MPNs.
Inbound
run() returns components; the app does the careful part
An inbound connector exports run(config, helpers) and returns components: parameters, manufacturer part numbers, attachments. Nothing is written yet. The result appears as a preview, so you read the change before the library does.
Apply it and the writes go through a queue, two at a time, until the run is in.
Inbound run · csv-parameters
- run() parseCSV → 1,204 rows
- Preview 1,204 components · nothing written yet
- Apply write queue · concurrency 2
Outbound
push() walks the whole library for you
An outbound connector exports push(entities, config, helpers). The engine hands it the library in batches of up to 250 entities and holds the pace you set (requests per second and concurrency, enforced for the whole run), so a full catalogue push doesn't flatten the system on the other end.
Point it at an ERP, a PLM, an internal API: the loop is yours to write.
// Exporting push() makes a connector outbound.
// Called with batches of up to 250 entities,
// at the requests/second you configure.
export async function push(entities, config, helpers) {
for (const part of entities) {
await helpers.postJson(
`${config.baseUrl}/items/${part.ipn}`,
{ ipn: part.ipn, name: part.name },
);
}
helpers.log(`pushed ${entities.length} parts`);
}Helpers
The plumbing is already written
Connector code calls into a small helper toolbox, so the integration stays a dozen lines. Parse a CSV or a chosen Excel sheet, query a database directly, fetch a URL, post JSON, send a signed webhook, or hand back symbols and footprints, down to the original CAD binaries.
- log(), parseCSV(), parseExcel(sheet)
- queryDatabase(): PostgreSQL, MySQL, SQLite and more
- fetchUrl(), postJson(), sendWebhook(): Standard Webhooks HMAC-SHA256 signing
- getSymbol / getFootprint, and getSymbolFile / getFootprintFile for the original .SchLib / .PcbLib binaries
export async function run(config, helpers) {
const rows = await helpers.queryDatabase(
config.connection,
"SELECT ipn, qty_on_hand FROM erp.stock",
);
return {
components: rows.map((r) => ({
ipn: r.ipn,
parameters: [
{ type: "Stock", value: String(r.qty_on_hand) },
],
})),
};
}Templates
Seven built-ins to start from
The common cases ship ready to run, and each one is ordinary connector code. Open it, read it, make it yours.
Auto-detects the name, IPN and description columns; every other column becomes a parameter.
Manufacturer part numbers, with manufacturer names resolved against your Manufacturers table.
Datasheets and documents, linked by URL or fetched and stored as files.
The same column detection, from a chosen sheet of a spreadsheet.
Manufacturer part numbers from a chosen Excel sheet.
Attachment links or files from a chosen Excel sheet.
Your components as signed JSON batches, to any endpoint that will have them.
Or write your own. A configSchema and one exported function is a complete connector.
Trust model
Full Node access, on purpose
Connector code runs with full Node access. That is the point: this is operator automation, a script in your tools directory that you own. You write the integration your workflow needs, without waiting for anyone to ship it.
The failure mode is forgiving, too. The library tables are the source of truth, so if a run dies partway you run it again and you're current.
Running
Manually, on a schedule, or on demand
Run a connector by hand while you're still shaping it, hand it to a cron schedule once it's trusted, or push on demand when a downstream system asks. For event-shaped delivery there are signed webhooks.
When the destination is the CAD seat itself, the Altium ODBC connector is the main outbound path: your library, live in Altium's Components panel.
Explore related features
Put every part on one data model
Download Sideband for Windows and give your whole team one source of truth. Free 30-day trial — no card required.
Stable · Windows · free
Connectors
— signal not yet locked —
We're still tuning this one in. Drop a reaction to boost the signal — the pages you react to most are the ones we finish first.
…or kill time while you wait:
Phasor toy
3.00 : 2.00 · locked