Extensions catalog

The substrate ships eight example extensions in the binary, each a real closure a user installs with ssctl apply or from the catalog. Six are integrations (they connect an external provider); two are capability bundles (they add tools and vocabulary with no provider account). The split is the catalog's own integration flag, curated per extension rather than inferred. Every integration syncs from the provider into the graph; none writes back to the provider, and each ships a README stating its limits.

This is the map. The source of truth is each bundle's own manifest under svc/teild/substrate/examples/, and the resources an install will add are previewable through GET …/catalog/{id}.

Type names below are the bare singular each extension declares. The group carries the provider, so nothing repeats it: GitHub's issue record is issue.github.bundles.teild.dev, Linear's is issue.linear.bundles.teild.dev, and the full (group, type, id) identity is what addresses either.

ExtensionKindAuthTypesFunctionsTriggersAgents
GoogleIntegrationOAuth8460
GitHubIntegrationOAuth6120
LinearIntegrationOAuth5230
WHOOPIntegrationOAuth5120
NotionIntegrationInternal token4120
BeeperIntegrationPasted token4120
FirecrawlCapabilityAPI key2200
Web harvesterCapabilitynone2443

Google

Group google.bundles.teild.dev. An OAuth integration that syncs a Google account's address book, mail and calendars into the graph and folds them onto your people. The first real integration on the native path.

Three independent streams share one account: contacts, gmail and calendar. Each has its own toggle, its own scope, its own function, its own pair of triggers, and its own prefixed cadence anchor and cursor on the account, so one stream erroring never stalls another. The account-level lastSyncedAt and syncStatus stay shared: they are the rollup every connection reports, and whichever stream finishes stamps them.

Mirrors plus direct core emission. Provider records are mirrored in Google's own shape, and the sync functions also emit the core vocabulary row for the same logical object under the same derived id, with its required edges filled in. Entitymappings resolve people and nothing else, because a mapping cannot target emailmessage, emailthread or calendarevent: those types would become server-assigned, and a mapping's shell mint carries no edges, so it could not satisfy their required thread, account and calendar edges. The emailaddress record is the bridge: the core rows reference it, and the engine's one-hop resolution lands the stored edge on the person its mapping resolved.

All three scopes are wired. enabledContacts maps to contacts.readonly, enabledGmail to gmail.readonly, enabledCalendar to calendar.readonly. The requested union is derived per authorization from the account's enabled toggles, so turning a stream on after the grant landed needs a reconnect. gmail.readonly is one of Google's restricted scopes: a published client needs CASA verification, and an External plus Testing client has its refresh tokens revoked after seven days.

What this slice does not do: no attachment bytes (metadata and the attachment id only), no calendareventseries (every event row is a concrete occurrence, with the series id and recurrence rules kept on the mirror), no label type (core keeps provider label ids as plain strings), and no writeback.

GitHub

Group github.bundles.teild.dev. An OAuth integration that mirrors the code work you are involved in and turns assigned issues into to-dos.

Scopes are derived per toggle (read:user, and repo for issues and pull requests). GitHub has no token-revocation endpoint, so the bundle declares none.

Linear

Group linear.bundles.teild.dev. An OAuth integration that mirrors the issues assigned to you and projects them onto jointly-owned tasks.

This is the one integration that both mirrors a provider and projects into the shipped tasks vocabulary, so a Linear issue and a hand-written task live side by side.

WHOOP

Group whoop.bundles.teild.dev. An OAuth integration that mirrors a WHOOP wearable's daily physiology.

Each feature toggle maps to its read scope plus a profile and offline scope, so a refresh token is granted. WHOOP's revocation is a manual authenticated delete the facility does not speak, so revocation is manual.

Notion

Group notion.bundles.teild.dev. An integration that mirrors the Notion pages and databases shared with an internal integration. Authorized by an internal-integration token, not OAuth, because the host OAuth facility does not yet speak Notion's token exchange.

The integration token is a secret on the config singleton, origin-pinned to Notion's API host. Only one account per tenant syncs: every other account row is stamped syncStatus: ignored: duplicate account.

Beeper

Group beeper.bundles.teild.dev. The first non-OAuth integration: it connects a Beeper (Matrix) homeserver with a pasted access token and mirrors bridged rooms and messages (WhatsApp, Telegram, Signal, iMessage, and the rest). Read only, it never sends.

The token is a secret on the config singleton, origin-pinned to Beeper hosts or loopback. Only one account per tenant syncs: every other account row is stamped syncStatus: ignored: duplicate account.

Firecrawl

Group firecrawl.bundles.teild.dev. A capability bundle, not a provider account: web search and page scraping over the Firecrawl API, exposed as two callables an agent binds as tools.

The API key is a secret on the config, origin-pinned to Firecrawl's API host, injected only into these two functions.

Web harvester

Group web.bundles.teild.dev. A capability bundle, and the substrate's shipped end-to-end conformance example: it proves the seven-kind primitive set composes into a real feature (harvest URLs from a message, fetch and classify each page, propose reading-list and weekly-digest notes) with no bespoke workflow primitive. It is the running example these pages build on.

This is the only shipped bundle with agents, and the only one whose functions are deterministic stubs, because it exists to exercise the machinery rather than talk to a provider.

Back to extensions, or the ssctl command line.