Cinatra — Application Design — Connectors

How connectors surface in the Cinatra app — the connector toolbar, the responsive card grid, and the connected / disconnected state language. Part of Cinatra Application Design; match it exactly.

Version 0.8.0

I. Connectors

Toolbar · card grid · connect state

Connect the services your agents reach. A toolbar sits below the page header — a three-state connection filter (All · Connected · Disconnected, All first and selected on arrival) leading, then a white search field, a scope dropdown with + Connector beside it, and a sort / display button anchoring the right — over a responsive grid of connector tiles. Each tile carries only the brand logo (top-left), a status badge (top-right) and the connector name — no vendor line, no description. Badge and filter speak one status language — green when connected, red when disconnected — while All, which names no status, takes the page’s own navy instead. A centred Install more connectors button closes the page below the grid.

Example — connectors
  • OpenAI

  • Anthropic

  • Gmail

  • GitHub

  • Twenty CRM

  • Tailscale

Example — control states
Access dropdown · open
Search…
Personal:Only me
Project:ACME Group brand refresh
Project:Cloud Platform v2 migration
Project:Cloud SOC2 readiness
Team:ACME Cloud Services - Platform Engineering
Team:ACME Robotics - Hardware Engineering
Organization:ACME Cloud Services
Organization:ACME Group
Organization:ACME Studios
Workspace:All
Workspace:Admins only
Flyout search · with text (✕ clears)
acme
Filter · Connected selected (green)
Filter · Disconnected selected (red)
Example — status glyphs
Connected · joined plug
Disconnected · unplug
One drawing in two states. Disconnected is the plug and its socket pulled apart, the two prong strokes exposed in the gap. Connected is that same drawing closed — the halves brought together until their cut faces meet on a single seam, the prongs dropped (they sit inside the socket now), the cords still running to the corners of the box.
Example — empty states · All · Connected · Disconnected
All · nothing visible · marketplace within reach — the panel carries the single CTA
No connectors to show

Nothing is visible in this view. It may be that nothing is installed here yet, that what is installed sits outside the scope you have selected, or that it sits outside what you are allowed to see. Try a wider scope, ask for access to what you cannot see, or install a connector from the marketplace.

All · nothing visible · no marketplace access — same panel, no button
No connectors to show

Nothing is visible in this view. It may be that nothing is installed here yet, that what is installed sits outside the scope you have selected, or that it sits outside what you are allowed to see. Try a wider scope, or ask an administrator for access — or for an install.

Connected · nothing connected — the existing panel stands
No connected services in this view

Nothing here is connected. Either nothing is installed in this scope yet, or what is connected sits outside it. Connect a service to start using it across your agents and skills.

Disconnected · nothing disconnected — no panel, the CTA remains
bare list · no cards, no panel

Cards keep the --surface ground of the current page and show each connector’s real brand logo on a white tile. The status badge is a solid chip — a white joined plug on --green / white unplug on --red — following the solid .pill.failed precedent. The connection filter leads the toolbar: a bordered segmented toggle of three segments — All · Connected · Disconnected, in that order, with All selected on arrival — whose selected segment takes the solid colour of its own meaning (green Connected / red Disconnected, white icon + label) and whose idle segment shows a muted tint of that same colour — soft green / soft red — never grey. The scope dropdown is the app’s access combobox rendered exactly: a navy-bordered Search… field (an clears it once it holds text), Type: name rows grouped by kind with a hairline between groups — never between rows — and the selected scope carrying the same soft --surface-muted highlight it shows on hover, every other row white. When it is open, the toolbar trigger takes that same --surface-muted ground. The flyout is sized to its longest item, so it scrolls top-to-bottom, never sideways, and shows no scrollbar. + Connector sits right after the scope dropdown — a hairline between them — while the sort / display config button anchors the far right in the same borderless toolbar style; once the search field holds a query a small clears it. The grid scales md:2 · lg:3 · xl:4 · 2xl:5.

All names no connection status, so it takes neither status colour: selected it carries the page’s own --ink navy solid with a white icon and label; idle it carries a soft navy tint of that same colour. It is the system’s own neutral — deliberately not the --blue primary, which stays reserved for the action of record on a page and a filter segment is never that, and deliberately not grey, which this system does not use for an idle control. Its glyph is the four-square grid — the whole grid, every card — so the plug family stays exclusive to status. Together the three segments read as one sentence: everything, the connected part of it, the disconnected part of it.

The two status glyphs are one drawing in two states. Disconnected is the unplug: a plug and its socket pulled apart, with the two prong strokes exposed across the gap. Connected is that same drawing closed — the two halves brought together until their cut faces meet on a single seam, the prong strokes dropped because the prongs are inside the socket now, and the two cords running on to the corners of the box exactly as before. The closed form has two-fold rotational symmetry about the centre of the box. No stock icon draws it, so it is a custom glyph, drawn once and used at every status site in this document — the filter segment, the card badge, the connection-status badge and the Connect action. Connecting and disconnecting is then literally the same picture closing and opening, which is what the two states mean.

Below the grid sits a single centred Install more connectors button — the outline variant at the small size (32px tall, 14px of side padding, a 12.5px label), horizontally centred with 24px of clearance above it. It carries no leading glyph: the plug family belongs to status, and the toolbar’s + Connector is already the compact repeat of the same destination — the marketplace’s connector tab. It is deliberately not the primary button; the work of this page is connecting what is already installed, and installing more is the way out of the page rather than its main act. Both this button and the toolbar’s + Connector appear only for a reader who can actually reach the marketplace — where that access is absent, neither is rendered. A control that leads nowhere is never shown.

An empty grid is a real state under every segment, and each has its own answer. Under All — the default — the grid is replaced by a soft panel reading No connectors to show, and that panel carries the single Install more connectors CTA; because it does, the button below the grid is suppressed, so one screen never shows the same CTA twice. Every word of that copy has to stay true when the emptiness is a scope or visibility effect rather than an empty installation — cards are filtered by scope and by what the reader is allowed to see, so a workspace with connectors installed can still show none. It therefore never asserts that nothing is installed: it names all three causes and offers the remedy for each — a wider scope, access to what cannot be seen, an install.

The same gating that hides both install buttons hides this one. For a reader who cannot reach the marketplace the panel keeps its title and its first sentence, ends on ask an administrator for access — or for an install in place of the install clause, and renders no button at all; an empty panel whose only action leads nowhere would be worse than none. Under Connected, the existing panel stands, held to the same discipline — No connected services in this view, naming scope as a cause too, with its Connect a service action, which switches the filter to Disconnected. Its action is a different one from the install CTA, so the bottom button is not suppressed there. Under Disconnected, there is no panel at all: an empty Disconnected list asks nothing of the reader — there is nothing here to connect — so the grid area is simply bare and the bottom CTA remains.

II. Connector setup page

Wide · single & multi-connection

One generated form per connector. A connector's setup page is rendered from its config schema — a single generic form, never per-connector layout. It sits in the Wide content width (the max-w-3xl · 768px column defined in the Application Design system, §VII Content widths) and splits into two columns: a wider left column holding the configuration fields, and a narrower right column holding the Connection status card. The page header carries the connector name and the Connector setup subtitle; the status badge that once sat top-right now lives in that card. Fields are stacked and single-column; each is optional unless the schema marks it required. Every setup page carries a tab strip beneath its header, and its first two tabs are the same on every connector: Setup, then Sharing — who else may use each saved connection (see Sharing tab). Most connectors hold a single connection (below) and read Setup · Sharing; a connector that holds many — like the A2A Server — adds Connections after Sharing (see Multiple connections); a connector's own tabs follow.

One connection

Example — connector setup page · Wide column
OpenAI
Connector setup
••••••••
Paste your OpenAI API key to connect. It is validated before it is saved. Leave blank to keep the current saved key; use Disconnect to remove it.
Scope API usage to a specific OpenAI project. Leave blank to keep the current saved value.
Scope to a specific OpenAI organization. Leave blank to keep the current saved value.
Standard
gpt-5.5
Mini and nano models are excluded. Cinatra's web scraping and data extraction requires full-size models — smaller models skip direct page visits and fall back to keyword searches, producing incomplete results.
Connection status
Connected
Example — Disconnect · enabled vs disabled
Connected
Not connected

There is nothing to disconnect until the connector is connected, so Disconnect stays disabled — greyed and non-interactive — until then. Connect is always available.

Example — connection status · Check flow
Connected
Connected
Disconnected
Disconnected
Checking (transient)
Checking…

Pressing Check replaces the current badge with the indigo Checking… badge — its icon spinning — until the probe resolves, then swaps to Connected or Disconnected. It speaks the same solid green / red status language as the connector cards and filter (§I).

Example — disconnect · confirmation
Disconnect connector?
Disconnect this connector and remove its saved configuration? It will stop working until you connect it again.

The page holds to the Wide column and never spans full width. Inputs are pure-white with the navy hairline border (design-system Rules of the road #8); selects mirror that chrome with a trailing chevron. The two actions sit side by side, never stacked — an icon-led Connect (indigo primary, the joined plug from the Connected badge) and Disconnect (destructive, red-on-tint, the unplug from the Disconnected badge); the actions speak the same connect / disconnect language as the status badge. Disconnect is disabled until the connector is connected — there is nothing to disconnect otherwise. Disconnecting is destructive, so it opens an AlertDialog on the --paper ground with a strong hairline header rule — a Cancel outline beside the red Disconnect confirm (same unplug icon) — never a bare browser prompt; its copy stays connector-neutral. The right Connection status card reuses the extension detail info-card chrome (--surface, hairline, its heading over a divider) and carries the status badge with both icon and label plus the Check action beneath it. Each field keeps its own helper text from the connector's schema; the form drops the connector blurb, the per-action section labels, and the connection-check helper line.

Multiple connections

A few connectors hold many connections in one extension — the A2A Server connector, for instance, holds one server per connection. These add a third tab, Connections, after the two fixed ones, so the strip reads Setup · Sharing · Connections beneath the page header — underline tabs per the design system (VII of the Application Design system, Components · Tabs) — over the same Wide column. Setup adds a connection and rolls up their status; Connections lists them.

Example — multi-connection · Setup tab
A2A Server
Connect external Agent-to-Agent servers. Each server exposes one agent reachable at its well-known card URL.
http://localhost:10001
The root URL of the A2A server — no path. The agent card is fetched from /.well-known/agent.json.
Leave blank for unauthenticated servers
Connections status
2 Connected 1 Disconnected
Example — multi-connection · Connections tab
A2A Server
Connect external Agent-to-Agent servers. Each server exposes one agent reachable at its well-known card URL.
a2a-dev-localhost-10010
http://localhost:10010
Connected
a2a-dev-localhost-10002
http://localhost:10002
Connected
a2a-dev-localhost-10005
http://localhost:10005
Disconnected
Example — disconnect connection · confirmation
Disconnect connection?
Disconnect this connection? It will stop working until you connect it again.

On a multi-connection connector the Setup tab keeps the same two-column form, with four differences: the right card is Connections status (plural) carrying one count badge per status — a green 2 Connected, a red 1 Disconnected, only the statuses in play; there is no Check and, in its place, a link-style All connections that opens the Connections tab; the left form has no Disconnect (Connect adds one, and the form is never wrapped in its own card); and the form adds a connection rather than editing the one. The Connections tab stacks every connection as its own card — name, URL, the same solid status badge, and a per-row action that follows the status: Disconnect (destructive) on a connected row, Connect (primary) on a disconnected one — never a bare Remove. Disconnecting a single connection opens the same AlertDialog with connection-level copy (Disconnect connection?), generic to any connector.

Sharing tab

The second tab is Sharing, and every connector carries it. It answers one question — who else may use each of your saved connections — and it is the only place that question is answered: sharing is decided on its own tab, never inside Setup. Setup connects; Sharing hands the connection on. The tab lists your own saved connections for this connector and, under each one, mounts the app's access picker and its ownership panel — the same two controls the permissions surface draws, never a connector-specific copy of them (see Application Design — Permissions). It keeps the Wide column: it holds a list of cards, not a long settings form. A person who has saved no connection here sees nothing on it yet.

Example — Sharing tab · one connection
OpenAI
Connector setup
Connection sharing

Choose who can use each of your saved connections. Shared use always acts through your connected account and is audited.

openai-acme-prod
openai
Access
Organization: Acme Corp
Choose who can use this connection.
Ownership
Search by name or email…
Owners can change this connection's sharing and disconnect it.
  • AR Alex Riveraalex@acme.example
  • JB Jordan Blakejordan@acme.example
Example — Sharing tab · more than one connection
Connections status
2 Connected
a2a-dev-localhost-10010
a2a-server
Access and Ownership panel, exactly as drawn above
a2a-dev-localhost-10002
a2a-server
Access and Ownership panel, exactly as drawn above

Each row carries the same Access and Ownership card drawn above — one panel per connection, each decided on its own. The roll-up card is the Connections status card of the Setup tab, with no Check and no All connections link: the list it counts is directly beneath it.

Example — access locked by the connector
Access
Organization: Acme Corp
Locked by this connector: access is limited to your organization (only:"organization").
Choose who can use this connection.

A connector may declare a ceiling on how far its connections travel. The picker then renders every option above that ceiling locked, each carrying this one sentence as its reason, and the same sentence sits under the picker with a lock. Where the connector only recommends a scope, the line reads instead This connector recommends sharing with your organization — nothing is shared until you save. Currently: only you. Nothing is shared by either line on its own; the grant is written when you press Save changes.

The tab is a list of panels, one per connection you own here, each one a connection row — the same card the Connections tab stacks, but carrying its name and mono line and nothing else: no status badge and no per-row action, because a saved identity is not a claim that the connection still answers, and connecting and disconnecting stay on Setup and on the Connections tab. Beneath each row sits the shared permissions card on the --surface ground: Access — the multi-select scope picker, ordered narrow to broad, helper line Choose who can use this connection. — then Ownership — a Search by name or email… field that adds a co-owner, helper line Owners can change this connection's sharing and disconnect it., and the owners themselves as hairline-divided rows with an avatar, a name, an address and a remove button — except the row of the person who connected it, which carries a lock in the button's place, because this surface hands out no way to remove that owner; the last owner cannot be removed. An ownership edit applies as it is made: a person picked from the search field is an owner at once. The card ends in one right-aligned Save changes, and that button writes the Access choice — nothing is shared until it is pressed.

Additional configuration tabs

Either shape may also carry extra configuration tabs — a connector's own settings beyond connecting. The OpenAI connector, for instance, adds a Local shell tab for its sandboxed-shell policy. Each custom tab takes the connector's own label and sits after the fixed tabs — after Setup, after Sharing, and after Connections where the connector has it — in the order the connector declares them. Two tabs are fixed and every connector carries both: Setup first and Sharing second. The strip is therefore never absent; a custom tab extends it rather than introducing it. The page header and tablist stay at the Wide column, but a custom tab's content narrows to the Narrow width (max-w-xl · 576px, §VII) — a long single-column settings form reads better tighter — left-aligned beneath the tabs.

One tab label is reserved. A connector may add a Help tab carrying its own setup how-to — the prose, prerequisites and links a user needs to connect it, read-only (no form, no Save). It obeys every custom-tab frame rule — its own tab in the Wide strip, content at the Narrow width — but its position is fixed: Help always sits last, after Setup, after Sharing, after Connections, and after every other custom tab. A connector that only needs to explain itself may carry Help and no custom tab of its own; its strip then reads Setup · Sharing · Help. Reserving the final slot keeps “how do I set this up?” in the same place on every connector.

Example — additional config tab · Narrow content under Wide chrome
OpenAI
Connector setup
When enabled, the package can prepare shell tool payloads plus the sandbox policy your production executor should apply.
30
Signals that shell_call and shell_call_output events must be preserved for auditing.
/workspace
ls

A non-Help custom tab is the one place the setup page leaves the Wide column: the header and tab strip stay Wide so the tabs sit in the same place across tabs, while the settings themselves drop to Narrow (576px), flush-left under the tablist. The tab carries the connector's own fields in a single column — switches for immediate-effect toggles (indigo when on), inputs, and add / remove list editors for path, host and prefix lists — ending in its own Save.