Tabs & Spaces Developers

Reference

The manifest

Your app's manifest is a JSON file on your site, at an address you choose (/tands.json, say). Workspace admins install your app from that address.

json
{
  "manifestVersion": 1,
  "id": "acme-crm",
  "name": "Acme CRM",
  "description": "Your customers, in a tab.",
  "developer": { "name": "Acme", "url": "https://acme.example" },
  "icon": "/icon.png",
  "tabs": [
    { "id": "contacts", "name": "Contacts", "url": "/tab/contacts" },
    { "id": "deals", "name": "Deals", "description": "Your pipeline.", "url": "/tab/deals" }
  ]
}

Fields

FieldRequiredRules
manifestVersionYes1
idYes3–64 characters: lowercase letters, digits, and single dots or dashes between them, like acme-crm or com.acme.crm. Never change it: it's how workspaces know your app.
nameYes1–40 characters
descriptionNoUp to 300 characters
developer.nameWith developer1–80 characters
developer.urlNoAn http(s) address
iconNoA path to a square PNG, JPEG, WebP or GIF, up to 100 KB. SVG isn't accepted.
tabsYes1–10 tabs (below)
dataNoThe data your app keeps in the workspace: see Collections
actionsNoWhat your app does when agents ask: see Actions
eventsNoWhat happens in your app, for triggers: see Events

data is optional: the collections your app keeps. See Collections.

Fields this version doesn't know are ignored, so later fields won't break older workspaces.

Tabs

FieldRequiredRules
idYesLowercase letters, digits and dashes, starting with a letter or digit; up to 40 characters; unique in your manifest. Keep it stable: tabs in spaces refer to it.
nameYes1–40 characters. A new tab is named after it, and people can rename theirs.
descriptionNoUp to 200 characters, shown when people choose a tab to add
urlYesThe page: a path, or a full address on your origin

Collections

data.collections maps each collection's name to its declaration. Names, of collections and of fields, are lowercase letters, digits and underscores, starting with a letter, up to 40 characters.

FieldRequiredRules
scopeYesworkspace, space, tab or user: who shares and sees it. See Scopes.
fieldsYes1–50 fields, each with a type (string, text, number, boolean, date, datetime), an optional description (up to 200 characters), required (default false) and, for strings, enum
descriptionNoUp to 300 characters
agentsNoread (the default) or none

An app has up to 20 collections. See Keeping data.

Actions

actions maps each action's name (lowercase letters, digits and underscores) to its declaration. An app has up to 20.

FieldRequiredRules
descriptionYesUp to 300 characters: what it does, for agents and admins
urlYesIts endpoint: a path, or a full address on your origin
changesNotrue (the default): agents ask the person first. false: it only reads, and runs at once.
inputNoUp to 20 fields, as in collections

See Actions.

Events

events maps each event's name (lowercase letters, digits and underscores) to its declaration. An app has up to 20.

FieldRequiredRules
descriptionYesUp to 300 characters: what happened, for people in triggers
fieldsNoUp to 20 fields, as in collections

See Events.

One origin

An app lives on one origin: the manifest's. icon and every tab's url are resolved against the manifest's address and must stay on its origin. /tab/contacts in a manifest at https://crm.example.com/tands.json is https://crm.example.com/tab/contacts. A tab on https://other.example.com is refused.

Tokens are addressed to that origin, and the workspace only talks to frames on it. If your pages need several hosts, serve them behind one.

Changing it

You can change anything but id and your origin; that includes adding actions. Workspaces pick up changes when an admin chooses Check for updates. Removing a tab from your manifest leaves the tabs people added saying your app's tab isn't installed. See Installing and updating.