Reference

Concepts

Dock's domain model in one page. Every term you'll see in the API, MCP tools, docs, and UI. Read this first if the REST or MCP references aren't clicking.

Org

The billing + ownership container.

Every user has a default org. Workspaces, agents, members, and webhooks belong to an org. Plan and Stripe subscription are attached at the org level, not per-workspace.

Slug: unique across the registry (/{org}/{workspace} URLs are unambiguous across Dock). Renaming the slug keeps old URLs resolving forever via a workspace_slug_aliases table.

Workspace

One shared surface. Structured rows and a narrative doc, side by side.

The unit humans and agents collaborate on. A workspace is a container of one or more surfaces (the tabs along the top). Each surface is either a typed-row table or a TipTap rich-text doc, and a workspace can hold any combination, one or many of either kind, in any mix. The modefield is a default-view hint for the UI (which tab opens first); it doesn't restrict what surfaces exist. Workspaces live under an org at /{org}/{workspace}.

Visibility is separate from role: private · org · unlisted · public. Visibility controls who can read; writes always require membership regardless.

Every workspace records its creator as a principalId + principalType pair so the UI can show an agent orb or a human avatar on the card. Agent-created workspaces enroll both the agent AND its owning user as owners (so the human stays in the loop), but attribution is explicit: createdBy.principalType === "agent" means the agent actually pressed create. Same pair exists on rows, doc bodies, API keys, and webhooks.

Row

A line in a workspace's table surface.

A JSON object keyed by column key. Positions are integer, sortable. Every row has create/update principal IDs (who made the change).

Bulk updates go through PATCH /rows/bulk (all-or-nothing up to 500). Every row mutation emits an event; subscribers fan out over SSE and webhooks.

Doc body

A TipTap ProseMirror JSON document.

Doc-mode workspaces have exactly one body. Stored as ProseMirror JSON. Replace-only today (last-write-wins); CRDT merge is Phase 4.

Images embedded in docs are uploaded via POST /api/workspaces/{slug}/upload and referenced by URL in the document tree.

Column

A typed field on a workspace's table surface.

Nine types: text, longtext, number, status, person, date, url, checkbox, select. Each column has a key (stable identifier), label (display), and optional options (for status/select).

Column schema lives on the workspace; rows validate loosely against it. Hidden columns preserve their values but don't show in the table view.

Agent

A first-class principal, not a delegated human token.

An Agent is a named identity that owns API keys and appears in the events log with its own avatar. Agents count toward the org's agent cap (Free 3 · Pro 10 · Scale 30) when they hold at least one non-revoked key.

Agents are created when you mint a key for a new name. They inherit the creating user's workspace access by default, but can be scoped to a single workspace via the key.

Member

A human or agent added to a workspace.

WorkspaceMember rows bind a principal (user or agent) to a workspace with a role. Distinct from org membership, which lives separately on the Org · User link.

Roles per workspace: owner (full control + delete), editor (read + write + invite), writer (read + write only), viewer (read only).

API key

Bearer token for headless access.

Format: dk_<48 hex>. Stored as a SHA-256 hash; plaintext shown once at creation. Each key belongs to an Agent and can be scoped to a single workspace or the whole org.

Revocable from Settings · API keys. Revocation is immediate, no grace window.

OAuth client

For MCP connectors. DCR-registered, OAuth 2.1 + PKCE.

Claude, Cursor, and other MCP-capable clients self-register via Dynamic Client Registration at POST /oauth/register, then walk the user through PKCE at /oauth/authorize. Access tokens expire after an hour; refresh tokens after 30 days.

Event

The audit log. Every mutation writes one.

Every row, doc, member, and webhook change writes a row to the events table. Events are scoped to a workspace; listing them gives you a replay. Subscribers stream events over SSE (GET /workspaces/{slug}/subscribe) and via HMAC-signed webhooks.

Actions: row.created, row.updated, row.deleted, row.sealed, doc.updated, comment.added, comment.deleted, member.invited, member.joined, member.removed, workspace.created, workspace.renamed, workspace.columns_updated, workspace.visibility_changed.

Webhook

One endpoint per org. HMAC-signed. Retried for 24h.

Subscribe an HTTPS URL to one or more event types. Every matching event across every workspace your org owns gets POSTed to you, signed with X-Dock-Signature. Retries follow exponential backoff for up to 24 hours.

See the webhooks reference for signature verification.

Comment

Thread on a row. Optional row-level discussion.

Rows support comment threads (useful for review loops). Doc mode has inline annotations within the TipTap tree instead.

Plan + caps

Free / Pro / Scale with flat monthly pricing. No per-agent meter.

Three tiers. Caps on agents, members, workspaces, rows per workspace, API calls per month, webhook deliveries per month. Past Scale's caps, call request_limit_increase.

Hitting a cap returns 402 payment_required with an actionable details payload (the upgrade/increase endpoint + tool names).

Related: REST API · MCP reference · Error codes

Frequently asked questions

What is a workspace in Dock?
A workspace is the unit of shared state. It contains one or more surfaces (tabs), each either a typed-row table or a TipTap rich-text doc. Both humans and agents read and write the same workspace via the web UI, the REST API, or the MCP server. Learn more →
What is a surface in Dock?
A surface is one tab inside a workspace. Either a `table` (rows + columns) or a `doc` (TipTap body). Surfaces have their own slug, position, and access scope, and a workspace can hold any combination of either kind, one or many. Learn more →
What is the difference between a row and a doc in Dock?
A row is a structured record on a table surface, with typed cell values keyed by column. A doc is a rich-text body on a doc surface (paragraphs, headings, embeds, callouts). Rows are best for records with shared columns; docs are best for prose. Learn more →
What is a signed agent in Dock?
A signed agent is an Agent identity with a required `ownerUserId`. The owner link is the accountability substrate: any workspace the owner has direct access to, the agent inherits, with auto-enrollment on first write so attribution stamps the agent (not the owner) from then on. Learn more →
What is principal attribution in Dock?
Every write (row, doc edit, comment) is stamped with a `principalId` and `principalType` (`user` or `agent`). The audit log + UI render answers "who did what" without ambiguity. Pre-attribution rows show as `null` createdBy. Learn more →
What is a workspace member vs an org member in Dock?
Workspace member = explicit `WorkspaceMember` row scoped to one workspace. Org member = `OrgMember` row that grants default editor on every non-private workspace in the org. Use workspace members for guest scope, org members for whole-team access. Learn more →
Can a Dock workspace contain both a doc and a table?
Yes. A workspace can hold any combination of doc and table surfaces, one or many of either kind. Add tabs at any time via `create_surface` (MCP) or `POST /api/workspaces/:slug/surfaces` (REST). The workspace `mode` field is the default-view hint.
How do agents get access to workspaces in Dock?
Three paths, first match wins: explicit WorkspaceMember row → that role; signed-agent inheritance from the owner's membership → auto-enroll at owner's role on first write; OrgMember + visibility=org → virtual editor. See workspace-access.ts for the canonical check. Learn more →
What does the workspace visibility setting control in Dock?
Four levels: `private` (explicit members only), `org` (every org member gets virtual editor), `unlisted` (anyone with the URL can read, not indexed), `public` (anyone, listed, indexable). Writes always require membership regardless of visibility. Learn more →
What events does Dock emit?
Workspace activity stream: `row.created`, `row.updated`, `row.deleted`, `row.moved_surface`, `doc.updated`, `doc.heading_added`, `doc.mention_added`, `comment.added`, `member.invited`, `member.joined`, `workspace.created`, `workspace.archived`, plus more. Subscribe via webhooks for agent automation. Learn more →
  • Quickstart: the 60-second path to your first workspace + first agent.
  • Agent primer: full tool catalog + decision rules in paste-into-system-prompt form.
  • Agent overview: agent identity, signed-agent inheritance, attribution.
  • MCP overview: protocol-level entry to the agent surface.
  • REST API: every MCP tool has a REST equivalent.
Updated