Skip to main content
API reference sections

Schema

Workspace

The unit of export, backup and - later - sharing.

The same logical workspace may exist as several physical replicas: one per release channel, one per machine, one in the cloud. They share [id] and never share a database file.

[id]: Workspace::id

Type object

Shape

FieldTypeDescription
idrequiredWorkspaceId
ownerrequiredProfileId

The Profile this Workspace is listed under.

A one-way projection, not the authority. Since catalog 13 the Workspace's root catalog unit (placement.current, read through Store::root_placement) says where this user has placed it, and a move writes this field only through that root operation, in the same catalog transaction as the unit. Creation (Plan 1.3) and replica provisioning (Plan 2.1) publish the unit with the row; a remote root unit re-projects this field when it lands. A Workspace without a unit is read from here, as the only evidence there is.

namerequiredstring
created_atrequiredTimestamp

Epoch milliseconds, UTC. Signed, so instants before 1970 are representable.

last_opened_atTimestamp or null
iconstring or null

How the workspace appears in a switcher: a picture, a colour, and the two flags that decide where it sits in the list.

Stored as tokens, never as rendered values. icon is an emoji or a blob:<hash>; color is one of the app's colour names, not #6B4FC4. Writing a hex value would freeze one theme's purple into somebody's workspace for good - the same rule onboarding follows for avatar and purpose ([ADR-82](../../../docs/decisions/ADR-076-100.md#adr-82-i18n--internationalization-constrains-what-is-stored-not-how-it-is-shown)).

The store never interprets any of them. They are here because they have to survive a restart and the store is the only thing that persists - the app's ProfileDoc is a view rebuilt from this every launch, so a flag written only there was written to a cache.

colorstring or null
pinnedboolean

Default false

archivedboolean

Default false

deleted_atTimestamp or null

Soft deletion is independent of archive. The Store keeps every byte until retention purges it, and restoring clears only this timestamp.

positioninteger (int64)

Stable position in the owner's workspace list. The list may still group pinned, archived and deleted rows; this orders rows within those groups.

Default 0

Example
{
  "id": "00000000-0000-4000-8000-000000000000",
  "owner": {},
  "name": "string",
  "created_at": 0,
  "last_opened_at": 0,
  "icon": "string",
  "color": "string",
  "pinned": false,
  "archived": false,
  "deleted_at": 0,
  "position": 0
}

The contract has no example values, so example bodies are generated from each schema: every field is shown with a placeholder of its type.

Used by

Generated from contract version 1. Last updated .

Privacy choices

Choose which optional tools Koru may use on this site. Your choice is saved in a cookie in this browser for 12 months. Privacy policy

Privacy choices

Keep you signed in, protect forms and remember your language and this choice.

Always on

PostHog and Google Analytics 4 measure page views and actions such as downloads, using cookies or local storage.

PostHog records how pages are used, with form inputs masked and private pages excluded. Needs Analytics.

Ahrefs Web Analytics measures visits and where they come from, and Google Ads measures whether our ads led to a visit or download.