Vendors
Catalog > Vendors (/vendors, with vendor:read, covered by every viewer’s *:read
floor) is the directory of vendors: the organizations behind the products in the estate, on
the same flat-registry pattern as Types and Tags.
A vendor is not a device; it is the company a device comes from. Each row shows the id, the
display name, its kind (manufacturer, integrator, or developer), an optional
icon glyph key, and its origin (official, seed-owned, or custom).
Today a vendor stands alone: nothing in the estate points at one yet. It is a landed piece of a
larger catalog, the layer a future product (“Acme 123A, by Acme”) will reference; a product
and its assignment to a component are later slices of the same effort, not built yet. See
core entities for where the vendor registry sits in the estate
model, and Drivers and Capabilities for
the two leaf catalogs beside it.
- Kind classifies the organization: a manufacturer builds hardware, an integrator assembles and installs systems, a developer ships software. It defaults to manufacturer and is a closed set; a value outside it is refused (422).
- New vendor (with
vendor:create, an admin permission) opens a create drawer: name its id (a short identifier, unique tenant-wide, e.g.crestron) and give it a display name; choose its kind (defaults to manufacturer); icon (a glyph key), support phone, and website are optional. - Pick a row to open its detail blade. The footer Edit pencil (with
vendor:update) edits the display name, kind, icon, support phone, and website; the id is fixed. Delete (withvendor:delete) removes the row, behind a confirm. - An official (seed-owned) row is always read-only: no Edit, no Delete, and the blade marks it “Seed-owned, read-only.” Omniglass ships eight official vendors (Crestron, Biamp, QSC, Shure, Cisco, Extron, Sony, Samsung), all manufacturers, as a starter baseline, upserted idempotently at boot so the shared set cannot drift install to install; add a custom vendor for anything else.
- Website is validated to an
http/httpsURL, on both the create/edit form and the API: a value in another scheme (for examplejavascript:) is refused with a 422 rather than stored. A valid website renders as a live link on the blade; a value that fails the check (entered off console, through a raw API call that bypassed the client) still renders, as plain text, never as a dead or unsafe link. - Delete carries no in-use guard: a product references a
vendorthrough its optionalvendor_id, but that link ison delete set null, so deleting a vendor detaches it from those products (their vendor clears) rather than blocking. Removing a custom row is unconditional (still refused for an official row, 422). The 409 delete-refused-while-referenced rule the Types registry enforces lives instead oncomponent.product_id(a product with components cannot be deleted), not on the vendor.
Minting a vendor is admin-gated; the picker that consumes it, choosing a product’s vendor, does not
exist yet, since it waits on product. The same operations are omniglass vendor list/get/create/update/delete from the CLI (see the CLI reference).