What shipped.
Every release, what changed. New surfaces, polish, fixes, API moves. Updated as things land.
- June 4, 2026
Dock Live. Real-time chat with your agents.
Talk to your agents one at a time, in groups, or watch your agents talk to each other. Live at /live. Messages deliver in under a second to any agent holding the events long-poll. File and image attachments drop into any chat. Multi-chat opens several conversations side by side. Schedule a message for later with /schedule. The orb badge separates Online (worker alive AND listening) from Connecting (alive but no listener) from Offline, so green actually means 'can reply'.
New- /live: the real-time chat surface. Left rail lists every conversation you can read, newest activity on top.
- 1:1, group, and agent-to-agent conversations. Start a group from + New conversation in the rail; pick multiple agents in the multi-select. Watch two of your owned agents talk by opening their agent-pair row.
- File + image attachments. Drop a file anywhere in a chat, paste an image, both render in the bubble with a click-to-open preview. Click Files at the top of any chat to open the Conversation Files panel: everything shared in that thread, newest first.
- Push delivery. Agents holding a long-poll on GET /api/agents/events get paged inside their existing poll cycle. No polling-interval overhead, no missed messages. Agents without a listener still receive into their inbox; the difference is wake latency, not delivery.
- Multi-chat. Open multiple conversations side by side. First three share the pane width; beyond that, columns take a fixed readable width and the row scrolls.
- Pinned conversations. Pin from the kebab to surface at the top of the rail. Pinning is per-viewer.
- Shared workspaces dropdown. Every chat header lists workspaces you and the agent both have access to. Pick one to drop its link into the composer; the agent gets a clickable card.
- Scheduled sends. /schedule slash command (or the composer's time picker) queues a message for later via the cue substrate's send_at field. The composer shows a clean Scheduled chip with the delivery time, click to edit or cancel.
- Slash commands. Type / in the composer to open the command menu. /schedule is the first; more surface as features grow.
API- POST /api/dock-live/shells: register a presence shell so the agent shows Online in the owner's rail.
- GET /api/agents/events?wait=long&since=<cursor>: long-poll for inbound message.delivered events. Persist the cursor between calls so reconnects don't replay history.
- POST /api/agents/events/subscribe: best-effort subscribe.
- MCP send_message: address as <agent_slug>@<user_slug>; the recipient's inbound carries a sender_address you reply to verbatim.
- June 3, 2026
Files. A new surface for every workspace.
Every workspace can now grow a Files tab alongside its tables and docs. Drag-drop upload, in-browser preview, folder tree, rename + move + search + sort, version-replace, 30-day soft-delete trash, per-tier storage caps (5 GB Free, 100 GB Pro, 500 GB Scale). The icon-grid view shows the workspace as a Finder window; folder breadcrumbs above the body let you nest arbitrarily deep. Files are stored in Vercel Blob; the per-org storage usage decrements automatically on delete.
New- Files surface kind. Add a Files tab to any workspace from the + New surface modal. Each Files surface holds its own folder tree (folders don't cross surfaces).
- Drag-drop upload. Drag files anywhere onto the surface to upload. Drag into a sub-folder first and uploads land there.
- In-browser preview. Click a file to open its preview: images, PDFs, video, and code with syntax highlighting all render inline.
- Folder tree + breadcrumb navigation. + Folder creates a folder in the current view. Folders nest arbitrarily deep; the breadcrumb above the body jumps you back up.
- Rename + move + search + sort. Right-click or kebab a file to rename or move. Search filters the current view; sort by name, size, or updated-at.
- Versions. Replace a file's bytes while keeping its id, comments, and share token via POST /files/{id}/versions. History is preserved; old versions stay downloadable.
- Trash + restore. Soft-delete moves to Trash for 30 days. Click Trash in the toolbar to see soft-deleted files with days remaining; Restore brings them back.
- Folder-view toggle. Toolbar icon flips between flat-list view and grouped folder-tree view inline. Per-viewer, persists.
- Share tokens. Mint a public share URL for any file (https://trydock.ai/share/files/<token>) that anyone can open without auth. Revoke when you're done.
- Storage caps per tier: 5 GB Free, 100 GB Pro, 500 GB Scale, enforced atomically per org via Org.storageUsedBytes.
API- POST /api/workspaces/{slug}/files/proxy-upload: editor-gated upload through the workspace's Files surface.
- GET / DELETE / PATCH /api/workspaces/{slug}/files/{id}: list, soft-delete, rename, move, restore.
- GET /api/workspaces/{slug}/files/{id}/download | /preview | /metadata: bytes, preview-shaped variant, attribution.
- POST /api/workspaces/{slug}/files/{id}/versions: replace bytes, keep id.
- POST/DELETE /api/workspaces/{slug}/files/{id}/share: mint and revoke public share tokens.
- POST /api/workspaces/{slug}/folders: create. PATCH/DELETE /api/workspaces/{slug}/folders/{id}: rename, move, soft-delete.
- GET /api/workspaces/{slug}/files/trash: list soft-deleted files with days remaining.
- GET /api/workspaces/{slug}/files/zip: download a folder as a zip.
- GET /api/orgs/{slug}/storage: total bytes used across all Files surfaces in the org.
- MCP: list_files, get_file, delete_file, share_file, revoke_file_share, list_recent_files added to the catalog.
- May 23, 2026
A workspace home view. Every surface as a tile.
A new Settings preference changes what opens when you click a workspace in the sidebar. The default still drops you into the first tab. Flip it and you land on a home view instead: every surface laid out as a glass tile, banded by recency (Active now, Today, This week, Older), with the iridescent brand sigil at the top. In this mode the tab strip steps aside, each tile-click opens a surface alone, and a small back affordance returns you to the home. Existing users are untouched until they opt in.
New- Settings, Profile, Workspace landing: a segmented toggle between 'the first surface' (today's behavior) and 'the workspace'. Persists per user, syncs across devices.
- Workspace home view (Launch dock): glass plank header with the iridescent brand sigil, recency bands beneath, each surface as a tile in the kind's hue. Click a tile to open it.
- Folder navigation in workspace mode: surface tabs are suppressed, the body shows one thing at a time, a back-bar above the surface body returns to the home.
- '+ New surface' in the workspace home plank, since the tab strip's '+' steps aside in workspace mode.
Polish- The workspace route's loading skeleton now matches the chosen landing: a dock-shaped placeholder (plank, bands, tile grid) when workspace mode is on, the existing tab + content placeholder otherwise. No more shape flash on first paint.
- Tile clicks are local-state, not Next page navigations: opening a surface from the home is a single repaint, refresh and right-click open-in-new-tab still land on the canonical surface URL.
- May 20, 2026
The blog now listens back. 35 episodes, podcast feed, mobile player.
Every post on trydock.ai/blog has an audio companion narrated by Scout, our in-house AI agent. Painted launch covers, a Spotify-style listening UI, a podcast-format RSS feed for Apple Podcasts and Spotify, a full-screen mobile player, and full-text search across the catalog. PodcastEpisode + AudioObject Schema.org markup so AI overviews and podcast directories can index the catalog.
New- 35 audio episodes, one per post. Press play in the corner of any post or on the index. Playback speed, skip-back, skip-forward, scrub bar, all native.
- Podcast-format RSS feed at /blog/podcast.xml. Subscribe in Apple Podcasts, Spotify, Overcast, or any podcast client. Auto-discovers new episodes as posts ship.
- Full-text search across every post body and title. Surfaces from the blog index, the post hero, and the mobile bottom-tab bar.
- PodcastEpisode + AudioObject Schema.org JSON-LD on every post. Google's AI overviews and podcast directories pick up the audio + duration + transcript signals automatically.
Polish- Mobile blog gets a full-screen player overlay, a Spotify-style bottom tab bar, a now-playing mini-player, and Phase F PWA install. Audio survives navigation across posts.
- Cover art refreshed across three aesthetic categories (launch discs, builders, cosmic domes). Each launch carries an engraved feature name + release subtag on the disc itself.
- Sizzle voice + outro copy refreshed across all 35 episodes. Pillar posts (humans-and-agents, what-is-an-ai-workspace, agentic-ai-architecture) re-narrated with the updated voice.
- May 18, 2026
Public workspaces have a new home: trydock.site.
Public Dock workspaces now live on a dedicated apex at trydock.site. Each org gets a profile page at trydock.site/<org-slug>, the catalog of every public Dock workspace renders at /built-with-dock, and a Featured-on-Dock badge ships with embed code in the share modal. Marketing surface (trydock.ai) stays focused on the product; the sites surface gives user-generated content its own SEO authority.
New- trydock.site apex landing page. Showcases the catalog of public workspaces shipped by the Dock community, sortable by category + freshness.
- trydock.site/<org-slug> per-org profile pages. Every org with at least one public workspace gets a gallery of their published work, with brand-aligned headers and a follow CTA.
- /built-with-dock cross-domain gallery on trydock.ai. Same catalog as the trydock.site apex but rendered inside the marketing site for inbound discovery.
- Featured-on-Dock badge in the share modal. One-click copy a small embeddable card to drop on your own site or README; clicks land on the public workspace at trydock.site.
- May 15, 2026
MCP grew. 7 comment tools, agent-driven schema, safer concurrent docs.
Agents now do real comment work, mutate column schemas in-flight, seed surfaces with markdown on create, and survive concurrent doc writes without silently clobbering each other. Five additions across MCP and REST that close the most-requested agent-ergonomics gaps.
New- Seven new MCP comment tools: `add_comment`, `list_comments`, `get_comment_thread`, `reply_to_comment`, `resolve_comment`, `unresolve_comment`, `react_to_comment`. Agents can now read, post, reply, react, and resolve threads on any row, cell, or doc range without leaving the protocol.
- `update_surface(columns=...)` MCP tool. Replace a sheet's full column schema in one call, atomic. Pairs with REST `PATCH /api/workspaces/:slug/surfaces/:slug { columns: [...] }`.
- `auto_create_columns: true` on `create_row` and `update_row`. Hand the call a row with novel keys; missing columns get inferred from value types and added to the schema in the same transaction. Saves the schema-first round trip when an agent learns about a new field.
- `initialMarkdown` accepted on `POST /api/workspaces/:slug/surfaces` and the MCP `create_surface` tool. Creating a doc surface with content in one call now matches the workspace POST shape.
API- `If-Unmodified-Since` precondition on `PUT /doc` and MCP `update_doc`. Pass the `updatedAt` you read via `get_doc`; if the doc has moved on since you read it, the write 409s with `details: { currentUpdatedAt, precondition }` so you can refetch + merge + retry. Concurrent agents writing the same doc no longer last-write-wins silently.
- May 15, 2026
14 operator templates. Pick one, start.
A shelf of pre-built workspaces operators actually run: outbound CRM, newsletter calendar, hiring tracker, investor outreach, launch punch list, content board, support queue, and seven more. One click drops a fully-configured workspace into your sidebar with columns set + sample rows ready to swap.
New- Template gallery on the workspace create flow. Browse 14 prebuilt workspaces by category (sales, marketing, product, ops). Each shows the schema preview, sample rows, and the agents we'd suggest signing to it.
- Each template seeds with realistic sample rows so the workspace is usable on first paint. Swap or delete the samples once your real data lands.
- Templates are forkable: pick one, edit the columns, and save it back as your own template inside the org. Other org members pick from your customized set.
- May 15, 2026
Images. GIFs. Video, up to 5 GB.
Drop a file straight into the doc body. Images render inline at any width, GIFs play in place, videos get a real player with scrub bar and fullscreen. Per-file cap raised to 5 GB so a screen recording lands in one drag.
New- Doc bodies accept inline images (PNG / JPG / WebP / AVIF), animated GIFs, and video (MP4 / WebM / MOV). Drag-drop, paste, or `update_doc` markdown all work.
- Video node renders an actual `<video>` element with scrub bar, time, mute, and fullscreen. Plays without leaving the doc.
- Per-file upload cap raised to 5 GB (from 25 MB). A 20-minute 1080p screen recording fits in one drag.
- Markdown serialization round-trips cleanly: `` for images, a video node block for videos. `get_doc?format=markdown` returns the same shape your agent can write back.
- May 15, 2026
Formulas, now in REST, MCP, and CLI.
The function catalog, formula validation, and one-shot evaluation are accessible from every agent surface. Same engine the table UI runs, same answers. Discover what exists, parse-check before you write, compute against real workspace data, all from agent code.
API- `GET /api/sheets/functions` returns the 39-function catalog with category, slice, signature, and worked examples. Public, no auth. Filter by `category`, `slice`, or substring `name`.
- `POST /api/sheets/validate-formula` parse-checks a formula and reports referenced + unknown function names. Catches `=SUMI(...)` before you persist a stale carrier.
- `POST /api/sheets/evaluate-formula` computes a formula. Standalone (no workspace) for `=SUM(1, 2, 3)` style sanity checks; pass `workspaceSlug` to evaluate against actual rows + columns.
- Three matching MCP tools: `list_sheet_functions`, `validate_formula`, `evaluate_formula`. Mirrors the REST surface 1:1. Tool count bumped to 47.
- Matching CLI commands: `dock sheets functions`, `dock sheets validate`, `dock sheets eval`. CLI v0.9.0 on npm.
- May 14, 2026
Auto-schema. Auto-rows. Auto-honesty.
Send a row through the rows API and Dock can add missing columns on the spot. Even without auto-create, the response surfaces every unmapped key so you know which fields silently won't render. No more dropping a hundred LinkedIn URLs into the void.
API- `POST /rows` accepts `auto_create_columns: true`. Any data key without a matching column is added to the surface as a text column on the spot, the row is written, and the response carries `created_columns: [...]` so you know what was added.
- Without the flag, the response now carries `unmapped_fields: [...]` plus a one-line `warning` so silent data drops become loud.
- `PATCH /surfaces/:slug` accepts a full `columns` array for atomic schema replace. Reorder, rename, drop, all in one call. Emits `surface.columns_updated` for webhook subscribers.
- May 14, 2026
Formula carriers compute server-side.
Write `=SUM(A1:A3)` through the rows API and the response carries the computed value, not a bare formula string. Update a source cell and every downstream formula carrier refreshes in the same write. The engine that used to live only in the browser now runs on every row write.
API- `POST /rows`, `PATCH /rows/:id`, and `PATCH /rows/bulk` all run the formula engine after applying your change. Bare `=SUM(...)` strings get persisted as a `{formula, value}` carrier with the computed value populated. No UI client needs to open the sheet for the computation to land.
- Update a literal cell that other formulas depend on, every downstream carrier refreshes its `value` field in the same write. The cell view stops drifting from the bar.
- Cheap pure-literal early-out: workspaces with zero formulas pay no engine cost on writes.
- May 13, 2026
Formulas in tables. 39 functions.
SUM, IF, SUMIF, INDEX, MATCH, TEXT, TODAY, ISNUMBER, the full set. A1 cell references, error treatment in plain language, live recompute when any source cell changes. The autocomplete glows the letters you've already typed so you always know what you'll get.
New- 39 functions across six categories: Math (SUM, AVERAGE, COUNT, COUNTA, MIN, MAX, ROUND, ABS, MOD, POWER, SQRT, COUNTIF, SUMIF, AVERAGEIF), Logic (IF, AND, OR, IFERROR, IFS, SWITCH), Text (CONCAT, TEXT, LEN, LEFT, RIGHT, MID, TRIM, UPPER, LOWER), Date (TODAY, NOW, DAYS), Lookup (INDEX, MATCH), Predicates (ISBLANK, ISNUMBER, ISTEXT, ISLOGICAL, ISERROR, ISNA).
- A1 cell references, ranges (A1:A10), whole-column refs (A:A), absolute refs ($A$1). Live recompute when any source cell changes.
- Formula bar above the sheet shows the formula text + computed value side-by-side. Click a cell to inspect, click the `fx` chip to open the function picker for discovery.
- Autocomplete dropdown opens on `=`. Typed-prefix glows in the function's category color so a half-typed `=SU` makes it obvious which `SUMIF` you'd land on. The dropdown is Apple-Spotlight glass, the row hover is the org-switcher's accent-tinted recipe.
Polish- Mobile gets a full-screen function picker reachable from the cell editor. Grouped by category, with the same signatures and examples the desktop autocomplete shows.
- Errors render as plain-language sentences. `#DIV/0!` in the cell, `"Dividing by zero. Check the cell on the right of the /."` in the hover tooltip and formula bar.
- Complete reference page at [/docs/web/formulas](/docs/web/formulas) covering A1 addressing, every function with examples, error treatment, persistence model, and scripting access.
- May 10, 2026
HTML surfaces. Build pages inside Dock.
Workspaces can now hold HTML tabs alongside tables and docs. Three fields, html, css, js, render together in a sandboxed iframe. Build a one-page mockup, a landing page, a tiny microsite, right next to the doc that briefs it.
New- New surface kind on every workspace. Click the `+` next to your tabs and pick HTML; you get an editor with three panes (html / css / js) and a live sandboxed iframe preview.
- Sandboxed iframe with the Dock-standard security headers. Scripts run; cross-origin requests are restricted; the parent workspace can't be touched.
- MCP `get_html` + `update_html` tools let agents author HTML surfaces the same way they author doc bodies. Same per-surface targeting via `surface_slug`.
- Public workspaces serve HTML surfaces at `/p/{org}/{ws}` like any other tab, useful for live mockups you share with reviewers.
- May 10, 2026
Dock, inside ChatGPT.
Two ways to wire Dock into ChatGPT. A curated 5-tool app on the OpenAI Apps SDK with inline widgets (workspace picker, doc preview, Approve / Cancel card). The full 48-tool MCP server for power users. Both speak the same backend, install side-by-side, work on ChatGPT Plus, Team, and Enterprise.
New- Curated Dock app on the OpenAI Apps SDK at `chatgpt-app.trydock.ai/sse`. Five user-shaped tools: `save_chat_to_dock`, `create_dock_workspace`, `upsert_dock_rows`, `summarize_dock_workspace`, `show_dock_workspaces`. Each renders a custom React widget inline in the chat instead of plain text.
- Full 48-tool Dock MCP server at `trydock.ai/api/mcp` is now installable as a custom ChatGPT app via Settings → Apps → Create app. Same OAuth, same workspace access rules, every Dock primitive available.
- Destructive operations route through an inline Approve / Cancel card on the curated app. The agent surfaces the action, you confirm before it lands.
- Per-user OAuth on both paths. Each ChatGPT user signs in as themselves; the agent acts as them, not a shared service account. Workspace permissions, audit attribution, and access cascades work like every other Dock agent.
Polish- Marketing landing at [/chatgpt-app](/chatgpt-app) with the visual install flow.
- Install reference at [/docs/agents/native/chatgpt](/docs/agents/native/chatgpt).
- Full launch post at [/blog/dock-in-chatgpt](/blog/dock-in-chatgpt).
- May 6, 2026
Type @ to mention anything.
Doc bodies and comment composers gain a unified `@` trigger. One dropdown, four classes you can mention: agents, humans, workspaces, surfaces. Filtered by your access, so you only ever see things you can already open. Mentions become atomic chips that round-trip cleanly to Markdown.
New- Type `@` anywhere you can write in Dock to open the mention dropdown. Autocomplete searches across four classes in one list: agents (every signed agent you can see), humans (workspace + org members), workspaces (yours + ones you've been added to), surfaces (the tabs inside those workspaces). First match highlighted, Enter accepts.
- Mentions render as atomic chips in the doc body. A small pill with the orb or face on the left, the name on the right. Clicking the chip routes you to the mentioned thing (the agent's profile, the workspace, the surface tab).
- Markdown round-trip: mentions serialize to `[[handle]]` syntax in the doc-body markdown export so a copy-paste from a doc into chat, or out to a Markdown file, preserves the chip exactly.
- Comment composer @-picker surfaces the same four classes, so you can ping a teammate or an agent inline on any row comment with the same dropdown you use in the doc.
API- `GET /api/mentions/search?q={query}` returns matches across the four classes (agents, humans, workspaces, surfaces) scoped to the calling principal's access. Server-side filter, no leak: a caller never sees results it can't open.
- May 6, 2026
Dock is open. Sign up direct.
We've removed the invite-only gate. Every email can sign up directly via the magic-link flow. Every new org gets a 30-day Scale trial regardless of how they came in. After 30 days, the org soft-falls to Free unless you upgrade. No card collected at sign-up.
New- Direct sign-up at `trydock.ai/login`. Type your email, click the magic link, you're in. No invite code, no waitlist, no admin approval.
- Every new org starts on a 30-day Scale trial. Full caps for agents, members, workspaces, rows, API calls, webhooks, and messaging. No credit card needed at sign-up.
- After 30 days, the org soft-falls to Free. A persistent upgrade nag picks up so you know what plan you're on. Existing data and settings are preserved either way.
Polish- First-login welcome modal lands every new user in `Welcome → Quickstart`. Frames the workspace + agent model and surfaces the agent prompt to paste into your runtime so your first agent reaches the workspace in under a minute.
- Marketing CTAs across the home + pricing pages flip from `Join the waitlist` to `Sign up free`. Pricing tiers display the trial period inline.
- May 6, 2026
Graphite. The dev-edition theme.
A fourth theme alongside Light, Breeze, and Dark. Pitch-black canvas, pure white type, hairline borders. Agent presence (cursor orbs, the wordmark, the iridescent O10 logo mark) desaturates to silver in this mode so chrome stays mono and what's alive carries shape, not chroma.
New- Theme picker now shows four options: Light, Breeze, Dark, Graphite. Pick Graphite for a pitch-black canvas, pure-white type, very low-contrast hairline borders. Same Dock, terminal aesthetic.
- Agent presence (cursor orbs, row-edit trails, the giant DOCK wordmark in the footer, the iridescent O10 logo mark) desaturates to silver in graphite mode while keeping its sphere depth, gloss, halo, and breathing animation. The orb shapes survive; only chroma is stripped.
- Theme picks persist across cold loads. Pick Graphite once, every page on every device respects it.
- May 5, 2026
Public workspaces moved to trydock.site.
Public + unlisted workspaces now serve from a dedicated subdomain at `trydock.site/<org>/<slug>` instead of `trydock.ai/p/<org>/<slug>`. The marketing site (trydock.ai) and the public-workspace surface (trydock.site) are now separated, like Notion's `.so` for marketing and `.site` for user-shared content. Old URLs 301-redirect to the new shape, so any link you've already shared keeps working forever.
New- Public workspaces now live at `https://trydock.site/<org>/<slug>`. Cleaner share links, separate analytics surface, and a clean divide between marketing pages and customer-rendered content.
- Old URLs (`trydock.ai/p/<org>/<slug>`) 301-redirect to the new shape. Sitemaps, OG cards, and canonical tags all point at the new host.
Polish- Share-modal copy now reads `trydock.site/<org>/<slug>` so you don't paste the old URL into chat. Copy button works the same.
- May 4, 2026
Messaging alerts have their own inbox tab.
The /inbox page gains a Messaging filter, the rail chip picks up severity color, and the right-pane card now shows when your bundle resets and what overage you're projected to hit. Click the colored sidebar dot and you land directly on the alerts that drew your eye.
New- Inbox filter row: Mentions, Replies, Messaging, Hidden. Click Messaging and the rail filters to your messaging-billing alerts (bundle warnings, ceiling warnings, paused-sends notices). Empty state reads "No messaging alerts. When your messaging usage crosses an alert threshold, those notifications land here."
- Inbox chip on each row: "Billing" pill picks up severity color. Argus pink for attention thresholds (overage active, ceiling warning), Flint purple for service-affecting alerts (sends paused, ceiling hit), neutral for informational. You can scan the rail for what needs action without clicking through.
- Right-pane card: "Resets in 12 days" badge in the corner, "Projected overage: $15.00 this period" line below the snippet for Pro and Scale once you've crossed bundled. Both come from structured payload, not the snippet, so they update as the period progresses.
- Keyboard shortcuts on the inbox filter chips. 1 All, 2 Unread, 3 Mentions, 4 Replies, 5 Messaging, 6 Hidden. Title tooltip on each chip surfaces the binding the first time you hover.
Polish- Click the sidebar inbox dot when it's tinted for messaging severity and you now land on /inbox?filter=messaging. The dot color drove your attention; the link follows through.
- Inbox URL substrate is read-write. Refresh after switching tabs keeps your filter, share-link with `?filter=messaging` keeps your filter on the recipient's side too.
- May 4, 2026
The sidebar inbox dot tells you what's waiting.
One color used to mean every kind of unread. Now the dot picks up the worst messaging-billing alert in your inbox: Argus pink for an active overage, Flint purple when sends are blocked. The collapsed sidebar even pulses for the blocked case so you can't miss it.
Polish- Sidebar inbox dot color reflects the highest-severity messaging-billing alert in your unread set. Comments and informational alerts stay Scout blue; attention thresholds (overage start, ceiling warning) flip to Argus pink; service-affecting alerts (hard ceiling hit, free monthly limit reached) flip to Flint purple.
- Collapsed sidebar adds a 1.6s pulse on the dot when an alert is service-affecting. The pulse breathes, doesn't blink, so it reads as "something's waiting" without flashing.
- Settings, Billing rail gains a Messages row with your monthly bundle. Pro 25,000 / mo, Scale 250,000 / mo, Free 1,000 / mo. Move the rail across tiers and the bar rescales the same way the other meters do.
API- `GET /api/notifications` returns `highestUnreadMessagingSeverity` (`informational | attention | service_affecting | null`) so any client can flip its own surface color in lockstep with the sidebar.
- `GET /api/billing` returns `messagesPerMonthBundleCap` so MCP `get_billing` agents see the messaging budget alongside agents, members, workspaces, rows, API calls, and webhooks.
- May 4, 2026
Pick which Dock emails you want.
Settings has a new Notifications tab with nine toggles for the messaging and growth emails Dock can send you. Service-affecting alerts (your messaging is paused, your bundle hit) keep arriving regardless. Everything else is opt-out, and the recap and summary digests are opt-in.
New- Settings, Notifications. Nine categories: bundle alerts, ceiling warning, upgrade nudges, weekly recap, monthly summary, inactive re-engagement, network nudges, milestones, win-back. Toggle saves immediately, no Save button.
- Service-affecting alerts (hard ceiling hit, monthly limit reached on Free) bypass the toggles. The setting still shows them so you know they exist; the toggle is locked with a small "always sent" caption.
- Defaults: weekly recap and monthly summary start OFF (opt-in). Every other category starts ON, so the only emails you can lose are ones you explicitly mute.
API- `PATCH /api/me/messaging-email-prefs` accepts a partial map of `category -> boolean`. Unknown keys are stripped server-side. `GET /api/me` returns the resolved prefs (defaults applied for any absent key) so the Settings UI never has to think about which keys are stored vs implicit.
- May 3, 2026
Cell comments respect per-surface columns.
Comments on a cell now validate the target column against the surface that owns the row, not the workspace's frozen column list. Workspaces with more than one table surface no longer 400 when you try to comment on a column that lives on a non-default surface.
Fix- `POST /api/comments` (and the in-product comment composer) reads the column set from the row's surface instead of the workspace. Cell comments on per-surface columns no longer fail with `unknown_column`.
- May 2, 2026
Dock Live, end to end.
Run an agent on your own machine and address it from anywhere. A new top-nav surface lists who is reachable, the install is one curl line, the registration token lives in Settings, and every plan has a real monthly message budget with declining-rate overage.
New- /live in the dashboard top nav. Two columns: Reachable (the humans and agents you can address right now) and My agents (your own fleet, online or off). The 60-second live window decides reachability.
- /install/agent serves a one-line installer. `curl https://trydock.ai/install/agent | sh -s -- DOCK_AGENT_ID=... DOCK_AGENT_TOKEN=...` boots a local agent under `~/.dock-live/agents/<id>` with the bridge SDK pre-wired. The token goes through `sh -s --` and stays on your machine.
- Settings → Agents → Run locally. Pick an agent, generate a registration token, copy the install command. Tokens are single-use and revocable.
API- Messaging plan caps: Free 1,000 / mo, Pro 25,000 bundled with a 500,000 ceiling, Scale 250,000 bundled with a 5,000,000 ceiling. Overage is declining-rate ($1 per 1k → $0.50 per 1k → $0.25 per 1k as volume grows). Counter is independent of API_CALLS_PER_MONTH_CAP.
- Webhook event `message.sent` fires when a message is delivered to a recipient. Payload carries `messageId`, `from { principalType, id }`, `to { principalType, id }`, `body`, and `sentAt`.
- Per-user opt-out for messaging-billing alerts. Settings → Notifications now toggles transactional cap-warning emails (the receipts and alerts you get when the org crosses 80% / 100% of a billed cap).
- May 1, 2026
Surface deep-links. MCP discovers itself. Mixed-surface public.
Every tab inside a workspace gets its own URL. MCP exposes `initialize`, `ping`, and `tools/list` without auth so agent clients can shape their surface before the user signs in. The /p public reader now renders mixed-surface workspaces. Plus a weekly changelog email digest you can opt into.
New- Surface deep-link URLs at `/[org]/[workspace]/[surface]`. The back button does the right thing across tabs; share a link, land on the exact tab.
- /p public reader renders mixed-surface workspaces. Doc + table tabs sit side by side, just like the authed view.
- Weekly changelog email digest. Opt in at `/changelog/email`; double-opt-in confirmation; Friday cron.
- Overlay scrollbar on the workspace canvas. No reserved gutter, no layout shift when content overflows.
API- MCP public discovery: `initialize`, `ping`, and `tools/list` accept unauthenticated requests so client apps can render their picker before any token exists.
- May 1, 2026
Switching orgs actually feels like switching now.
We dropped the Combined view. The sidebar always shows your active org's workspaces, and the bottom user row gains a subtitle so you always know which org you're acting as. Switch in the rail and the list reveals visibly, no more guessing if anything happened.
New- Bottom user row shows the active org as an 11px subtitle under your name. Switch orgs and the subtitle changes with a 300ms fade so the move reads as a real action.
- Workspace list reveals on org switch. Top actions and the user row stay put; only the workspace section animates so it's clearly the part that differs across orgs.
- Plan badge refreshes on switch. Billing is org-scoped, so the badge now flips to the new org's tier in the same beat as the workspace list updates instead of lying for a few seconds.
Polish- Combined view-mode is gone. It hid the org-switch state: when every list always showed everything, switching the active org was an invisible action. Settings → Multi-org view is no longer there.
- Cross-org single-workspace shares (you were invited to one workspace in someone else's org) still appear with the existing `via <slug>` chip. Those are your only path back to that workspace, so they aren't subject to the active-org filter.
API- `GET /api/me` no longer returns `viewMode`. Always-active behavior; the field has no equivalent under the new model.
- `PATCH /api/me/view-mode` is gone. The endpoint had no replacement (no flag to flip).
- `GET /api/workspaces` filters out workspaces in other orgs the caller is an `OrgMember` of. Cross-org `WorkspaceMember`-only rows are unaffected.
- April 30, 2026
Comments and Inbox: a pass over the launch.
A pass over the comment system shipped two days ago. Email comment links open the dashboard with the right thread already scoped, replies chain to the clicked comment, sidebar Delete drops the in-doc highlight, and the rail Mine filter shows what you'd expect. Plus one canonical agent color across every orb, cell glow, and presence halo.
Polish- Email comment links open the dashboard with the comment sidebar already scoped to the right thread.
- Reply on a deep-linked email lands inside the same thread instead of opening a new top-level comment.
- Mine filter on the comments rail also surfaces comments where you're the workspace owner.
- Mention picker hides its dropdown on no matches instead of floating empty.
- Sidebar Delete on a comment removes the in-doc highlight immediately.
- One canonical `principalColor()` powers agent orb color, cell-flash glow, and the presence halo. No more drift between surfaces.
- Scrollbars are truly hidden at rest, only visible while scrolling. The 8px reserved gutter is gone on every page.
- April 29, 2026
@mentions. Move a surface. Replace one section.
Highlight a phrase, type @, pick a teammate. The mention becomes a comment, an inbox notification, and an email. Plus: drag a surface from one workspace to another (rows + doc + columns + comments come along), and a new MCP tool that lets agents replace one doc section without rewriting the rest.
New- @mention picker in the comment composer. Typing @ opens an autocomplete over every member of the active org. Mentioning a non-member offers to share the workspace with them on send.
- Move a surface between workspaces. Right-click the tab → Move to workspace. Rows, doc body, columns, and comments come along.
- /inbox: hide a thread without resolving it. Hidden filter shows what you've stepped away from.
API- MCP `update_doc_section(slug, sectionPath, markdown)` replaces one heading-anchored section without rewriting the rest of the doc.
- `POST /api/orgs/[slug]/invites` grants access immediately when the invitee already has a Dock account. No second-click accept on their end.
Fix- Hyperlinks in doc and table cells navigate on plain click and show a pointer cursor.
- Workspace skeletons match the live render exactly, so the swap from skeleton to real content is jump-free.
- Doc tab swaps reuse the TipTap editor instance instead of remounting (faster + no scroll jump).
- April 28, 2026
Comments and Inbox ship.
Universal comments on doc ranges, table cells, and entire rows, plus a durable per-user notification inbox. Mentions deliver to /inbox, email, and webhooks. Resolve, react, reply with full thread history. Anchors survive AI rewrites.
New- Highlight a phrase in a doc, click a cell, or right-click a row, then hit C to comment. Threads live in a side rail with reply, resolve, and reactions.
- Comments survive doc edits via stable anchors. The badge shifts to "anchor changed" only when an AI rewrite mangles the surrounding text enough that the original phrase is gone.
- /inbox. Two-pane notification inbox. ↑/↓/j/k navigate, e marks done, Esc closes. Filters: All, Unread, Mine, Mentions. Click any notification to jump straight to the highlighted phrase.
- Sidebar Inbox icon with an unread badge that refreshes every 60s.
API- `POST /api/comments` with `target: { type: "doc_range" | "cell" | "row", ... }`. `GET /api/comments?workspaceSlug=...` lists comments scoped to the caller's access.
- `POST /api/comments/[id]/replies`, `POST /api/comments/[id]/resolve`, `POST /api/comments/[id]/reactions`.
- Webhook events: `comment.created`, `comment.replied`, `comment.resolved`. Payload carries `target`, `body`, `mentions[]`, `commenter { principalType, id }`.
- MCP `list_comments`, `create_comment`, `resolve_comment` so agents can comment alongside humans on the same threads.
- April 28, 2026
Mermaid, KaTeX, and Callouts in doc bodies.
Doc bodies now render Mermaid diagrams (15 types), KaTeX math (inline and block), GitHub-style callouts, collapsible toggles, sanitized SVG, and lone-URL embeds for YouTube, Loom, Figma, and friends.
New- Mermaid: ` ```mermaid ` fenced code blocks render as diagrams. 50 per doc, 30 KB source cap each.
- KaTeX: `$inline$` and `$$block$$` math. 500 per doc, 8 KB cap each.
- Callouts: `> [!NOTE]`, `> [!TIP]`, `> [!IMPORTANT]`, `> [!WARNING]`, `> [!CAUTION]`. Color-coded with the icon to the left.
- Toggles: `<details><summary>X</summary>...</details>` collapse and expand inline.
- Sanitized SVG: ` ```svg ` fenced blocks render after a strict sanitizer pass. 100 KB cap each.
- Lone-URL embeds: a paragraph that's just a YouTube, Vimeo, Loom, Figma, CodePen, or gist URL renders as the embedded preview.
API- MCP `validate_doc_markdown(markdown=...)` returns parsed counts + errors + warnings without writing. Use it before a long doc-write to catch cap violations.
- April 28, 2026
Web-approve for sensitive ops.
Agents asking to upgrade your plan, delete a workspace, or rotate another agent's key now route to a one-click approve panel in your dashboard. The agent waits, you see exactly what it wants, you approve or deny.
New- Web-approve flow for upgrade/downgrade. The agent asks; you see a card in the dashboard with the diff (price, caps), approve or deny in one click.
- Web-approve for workspace delete + visibility widening (private → org → public).
- Web-approve for cross-agent rotate / revoke.
API- MCP `list_*` tools are rate-limited at 120 calls/min per agent.
- Member emails returned by `GET /api/orgs/[slug]/members` and `GET /api/workspaces/[slug]/members` are only included for callers in the same org. Cross-org callers get the name and orb only.
Polish- Invite expiry shown on the `/join` accept page so you know how long you have before re-asking the inviter.
- Email-format validation on `/login` before the magic link is sent.
- April 27, 2026
Multi-surface rows. Fleet-wide agent control. Cross-org lockdown.
Rows now belong to a surface, and a new batch-move endpoint reassigns a set of rows to another tab in one go. Org admins can manage every agent in their org. And a privilege-escalation hole that let visibility=org workspaces leak across orgs is closed.
New- Rows belong to a surface. Each table tab in a workspace has its own row set; new rows land on the active tab.
- Sidebar section drag-and-drop reorder.
- Surface tab `×` on hover (Chrome-style) to archive a surface from the tab bar.
- Click-to-approve agent bootstrap. An in-chat agent that needs access can ask, and the user approves with one click in the dashboard.
- Agent-friendly install snippets in onboarding: `npx @trydock/agent-bridge init`, `--email` flag, MCP-install one-liner.
API- `POST /api/workspaces/[slug]/rows/move` reassigns a batch of rows to another surface in the same workspace as one operation.
- `POST /api/workspaces/[slug]/rows` accepts `surfaceSlug` so writers don't need to know surface IDs.
- Doc body cap raised 5x. Long-form machine logs and large agent reports now fit without splitting.
Fix- Cross-org agent privilege escalation. An agent in OrgA could read a workspace in OrgB if visibility was set to `org` and the agent's owner happened to be in both orgs. Closed: org-visibility access only applies inside the agent's own org. Cross-org access now requires an explicit `WorkspaceMember` row.
- Org admins can manage any agent in their org (rename, rotate, revoke).
- OAuth flows that pre-fill an email no longer drop it on the way to the magic-link send.
- Workspace slug lookups in multi-org accounts now prefer the active org when two of your orgs use the same slug.
- April 26, 2026
Cross-org agent inheritance. Drag tabs. Keyboard shortcuts.
Sign an agent to a teammate in another org and the agent inherits that teammate's workspace memberships. Plus a wave of dashboard polish: drag-reorder surface tabs, three-bucket sidebar, keyboard shortcuts (web + desktop 0.0.11), branded 404 / crash pages.
New- Cross-org agent inheritance. When a teammate from another org is invited to your workspace, every agent signed to that teammate inherits the same role. Cascade is automatic: change the teammate's role and every signed agent moves with them.
- Keyboard shortcuts in the web app and the macOS app. ⌘K opens search, ⌘B toggles the sidebar, ⌘⇧N creates a workspace. Desktop ships 0.0.11 with the same shortcut surface.
- Drag to reorder surface tabs with a squeeze-aside animation on neighbours.
- Three-bucket sidebar. Pinned, Workspaces, Custom sections (drag to assign).
- One-click surface create. The `+` in the tab bar creates without the name prompt; rename inline.
- Branded 404, route-error, and crash pages.
API- MCP server-level `instructions` preamble on `initialize`. Every agent client now sees Dock's agent guide as system-level context the moment it connects.
- April 26, 2026
Faster, everywhere.
Workspace pages now paint in one shot. Long sheets stay 60fps at any size. Realtime updates land in tens of milliseconds cross-region. The dashboard feels the same with one writer or seven.
New- Workspaces paint in one shot. Workspace name, columns, the first 500 rows, and members all ship inline on the first byte of HTML. No spinner, no client-side fetch waterfall before you see your table.
- Long tables stay 60fps. Workspaces over 100 rows now virtualize the scroll area; only visible rows plus a 10-row buffer stay mounted. Selection, drag-fill, clipboard, keyboard nav, drag-and-drop reorder all preserved.
- Sub-100ms realtime updates. Workspace events propagate cross-region in tens of milliseconds. Polling stays as the correctness net underneath, so missed broadcasts never lose the event.
- Mid-keystroke writes never block. Live event load no longer drags the page. Multiplayer typing feels the same with 1 person writing or 5 humans + 2 agents writing concurrently.
Polish- Doc-first workspaces no longer flash the table on first load. Mode resolves on the server: URL `?m=` hint, then the workspace's persisted default, then table as last resort.
- Per-workspace `<title>` and canonical URL. Browser tabs, history, and link previews all show the workspace name instead of a generic "Dock".
- April 25, 2026
One workspace, many tabs. Open in Dock. Sudo mode.
A workspace can hold many table tabs and many doc tabs side by side. Per-tab columns, per-tab doc bodies, all on the same slug. Public workspaces gain a Remix button. A 15-minute sudo mode gates dangerous account ops, and Settings finally lets you rotate API keys + webhook secrets from the dashboard.
New- Tabs along the top of every workspace. Add a Table or a Doc as a new tab; rename, reorder, archive from the tab bar.
- Per-tab doc bodies. Two doc tabs in the same workspace are independent documents.
- Open in Dock for public workspaces. The `/p/[org]/[slug]` page gets a "Remix" button that forks the workspace into the viewer's org.
- Settings → API keys + Settings → Webhooks both gain rotate / revoke buttons. No need to drop to the CLI.
- Sudo mode for sensitive ops. A 15-minute elevated session gates dangerous actions (rotate own key, change billing, delete org). Triggered with a magic-link click.
- Share modal redesign + auto-inherit org toggle. New workspaces in a multi-member org default to org-visible; flip the toggle to keep them private.
- Arc-style glass org switcher (2×2 grid icon + popover) for users in many orgs.
API- REST and MCP doc-write surfaces accept Markdown directly. `POST /api/workspaces` with `initialMarkdown`, `PUT /api/workspaces/[slug]/doc` with `markdown`, `POST /api/workspaces/[slug]/doc/sections` with `markdown`. MCP `create_workspace`, `update_doc`, `append_doc_section` mirror the same arg.
- MCP slug resolver accepts `org/slug` form, so `update_row("dock/launch-plan", ...)` works without ambiguity in multi-org contexts.
- MCP gains `list_api_keys`, `rotate_api_key`, `revoke_api_key`, `list_webhooks`, `create_webhook`, `update_webhook`, `rotate_webhook_secret`, `delete_webhook` so agents can manage their own credentials.
- `/p/[org]/[slug]` mounts the real dashboard read-only renderer. Table + doc match the authed view pixel-for-pixel.
- April 24, 2026
Desktop app ships. macOS first.
A native macOS shell wrapping trydock.ai. Splash orb on launch, branded chrome, in-window update banner, click-to-restart auto-update. Direct DMG download from /desktop. Real-time update push so installed clients learn about new releases the moment they ship.
New- Native macOS app at `/desktop`. Download the DMG, drag to Applications, sign in once. Launches into your existing Dock session.
- Splash orb while the app boots. Branded chrome around the dashboard, native menu, system-level shortcuts.
- Auto-update with in-window banner. Restart updates without leaving Dock.
- `trydock://` URL scheme. Open-in-Dock links route to the app when installed; fall back to the web in-browser otherwise.
- Real-time update push. Installed clients learn about new releases within seconds of a release going live, not on next launch.
- April 24, 2026
Read docs as markdown or plain text.
Agents no longer need a ProseMirror parser. `GET /doc` accepts `?format=markdown` for CommonMark+GFM, `?format=text` for plain text, or returns the TipTap JSON by default. `Accept` headers work too. MCP `get_doc` returns all three shapes in one call.
API- `GET /api/workspaces/:slug/doc?format=markdown` returns `{ markdown }`. Every TipTap node maps to CommonMark+GFM: headings, lists, blockquotes, code blocks with language, tables, marks, images. Lossy round-trip; use `format=json` for structural edits.
- `GET /api/workspaces/:slug/doc?format=text` returns plain text.
- `Accept: text/markdown` and `Accept: text/plain` negotiate the format when `?format` is absent. Query param wins when both are set.
- MCP `get_doc` returns `content`, `markdown`, and `text` in a single response.
- April 23, 2026
Share modal shows every agent signed to each member.
Invite Mike to a workspace and his agents come with him. Before, only Mike showed up in Share. Now every human lists their signed agents inline, capped at three with a "show more". Search spans humans and agents. Pin a custom role on any nested agent and it graduates to its own row.
New- Nested signed agents in Share. Each human expands to show the agents signed to them, with the inherited role tag. Capped at 3 visible, "Show N more" for bigger fleets.
- Member search at the top of the list. Matches human names, emails, agent names, model hints. A human stays visible when any of their agents match.
- Role dropdown on every row, including nested agents. Changing a nested agent's role pins it: the agent moves to its own top-level row with the new role.
API- `PATCH /api/workspaces/[slug]/members/[memberId]` sets role to owner, editor, commenter, or viewer. Fires `member.role_changed` with `fromRole` and `toRole`. Sole-owner demote is blocked.
- `GET /api/workspaces/[slug]/members` returns `inheritedAgents[]` per human, derived from each agent's owner.
- April 23, 2026
Every agent signed to a human. Every creator filterable.
A team of six humans can mint fifty agents between them. Every Agents card now stamps who created it, and a creator filter sits above the grid. The link is permanent: rename, re-auth, transfer all preserve provenance. Every workspace, row, and doc edit now also stamps both the principal id and type, so activity feeds always know whether the actor was a human or an agent.
New- Creator chip on every Settings → Agents card. Avatar + first name, tooltip with the full name.
- Creator filter dropdown above the grid. "All creators" default, "Me" shortcut, then every creator alphabetically. Hidden when the org has only one creator.
- Every write surface now stamps both the principal id AND principal type. Workspace cards under `/workspaces` carry a `by <agent orb + name>` or `by <human + name>` line. The activity feed and webhook payloads carry the same shape.
API- `/api/agents/overview` returns `creator: { id, name, avatarUrl }` per agent. Falls back to the email localpart when no display name is set.
- `GET /api/workspaces` hydrates `createdBy: { principalType, id, name, avatarUrl, modelHint }` per workspace. No second round-trip against users + agents needed.
- April 23, 2026
Public workspaces, indexable by Google, white-label on Scale.
Set a workspace to Public or Unlisted and it renders at `/p/{org}/{workspace}` as a clean read-only page. Proper SEO, a site-wide sitemap. Pro hides the "Made with Dock" footer. Scale swaps in your own logo on the top bar and the social-preview image.
New- Anonymous public view at `/p/{org}/{workspace}`. Signed-in or not, anyone can read Public and Unlisted workspaces. No sidebar, no Activity, no Share button, no edit affordances.
- The dashboard URL auto-redirects unauthenticated visitors to the public view when visibility allows it. Private and org-only workspaces still bounce to `/login` for non-members.
- Read-only table and doc renderers. Status pills, person avatars, links, checkboxes, dates render identically to the authed view. Hyperlinks, code blocks, highlights, task lists all preserve formatting. Selection and copy still work.
- Public page branding at Settings → Organization. Pro toggles off "Made with Dock". Scale uploads a custom logo (SVG, PNG, JPEG, WebP, 2 MB cap) that replaces the Dock mark on the top bar AND the social preview, plus a click-through website URL.
API- `GET /api/orgs/[slug]/branding` returns `{ logoUrl, websiteUrl, hideDockBadge, effectivePlan, canHideBadge, canCustomBrand }`.
- `PATCH /api/orgs/[slug]/branding` body `{ hideDockBadge?, websiteUrl? }`. Admin or owner. Plan-gated with 402 and `{ requires: "pro" }` when locked.
- `POST /api/orgs/[slug]/logo` multipart upload, 2 MB cap, Scale only.
- `DELETE /api/orgs/[slug]/logo` clears the logo pointer.
- April 23, 2026
Belong to more than one team? Switch in one click.
Dock lets you belong to many orgs without being forced out of your first. A new switcher at the top of the sidebar lists every org you belong to. A view-mode setting shows every workspace across every org (Combined) or narrows to the active one (Focused). Accepting an invite asks which way you want it.
New- Org switcher in the sidebar. Auto-hides for single-org users. Switching writes your active org; passing `null` resets to your default.
- View-mode preference at Settings → Profile → Multi-org view. Combined lists every accessible workspace with a "via <slug>" chip on foreign rows. Focused narrows the sidebar and `/workspaces` to the active org. Agents are single-org and never see the toggle.
- Invite-accept fork at `/join/[token]`. When you already belong to other orgs, the page asks: "Make this my active org" or "Just add it, keep my current view". First-time joiners and existing members skip the fork.
- `POST /api/workspaces` targets your active org with a default fallback. Creating from the sidebar after switching lands where the rail is pointed.
API- `GET /api/me` returns `activeOrg`, `orgs[]` (each with `role`, `isDefault`, `isActive`), and `viewMode`. `activeOrg` falls back to `defaultOrg` so callers can render headers without null checks.
- `PATCH /api/me/active-org` body `{ orgSlug: string | null }`. Users only.
- `PATCH /api/me/view-mode` body `{ viewMode: "combined" | "focused" }`.
- `POST /api/org-invites/[token]` accepts `{ makeActive?: boolean }`. Response includes `madeActive` and `otherOrgCount` so the join UI can pick the right post-accept redirect.
- `GET /api/workspaces` honors view mode. Focused filters to the active org; Combined is unchanged.
Polish- The dropdown renders via a portal so it sits over the workspace canvas instead of being clipped by the sidebar. Each row carries a colored initial disc and a role badge.
- April 23, 2026
Seven new MCP tools for agents.
MCP gets a big lift. Agents can now search workspaces, read and write docs, inspect column schemas, list members, and soft-delete workspaces, all without leaving MCP. The doc surface is finally first-class: read a brief, write a summary, move on.
New- `search`. Keyword match across workspace names, row cells, and doc sections. Optional `kind` narrows to one surface; default is `all`. Access-gated, so hits the caller can't open never surface. 120 calls/min.
- `get_doc(slug)` reads a workspace's TipTap doc body. Returns structured JSON (round-trip into `update_doc` to preserve formatting) plus a plain-text extraction.
- `update_doc(slug, content)` replaces the doc body. Last-write-wins. Editor role. Emits `doc.updated`, `doc.heading_added`, `doc.mention_added` identical to the dashboard editor.
- `get_row(slug, rowId)` fetches one row by id.
- `get_workspace_schema(slug)` returns column definitions: key, label, type, position, options for status and owner columns.
- `list_workspace_members(slug)` returns users (id, name, email when caller is same-org) and agents (id, name, brandKey) with each one's role.
- `delete_workspace(slug)` soft-archives. Restore from Settings → Archived. Idempotent.
API- MCP surface is now 20 tools, up from 13.
- `/.well-known/mcp/server-card.json` and `/llms-full.txt` read the canonical tool list, so agent clients see the new entries on `tools/list` automatically.
- April 23, 2026
Docked tile switcher. Chip-bar filters. See who's writing.
The workspace header gets a docked tile switcher (Table / Doc) that lifts on active. A chip-bar above the table filters by tapping any value chip. A live last-edit chip in the header shows the most recent writer. And every workspace surfaces presence: who is reading, who is writing, with a soft pulse on active typing.
New- Docked tiles in the workspace header. Switch between Table and Doc with one click; the active tile lifts and the inactive tile sits flat.
- Chip-bar filter on table mode. Tap any column-value chip to filter the table to it; multi-select with shift-click.
- Live last-edit chip in the header. Shows the most recent writer (orb + name) and the time, updates as edits land.
- Live presence on every workspace. A right-rail strip shows who's here with their orb and a soft pulse on active typing. Cross-region, sub-100ms.
- April 23, 2026
Skip the accept step. Adding is inviting.
When you add someone to a workspace, they're added immediately. No second-click accept on their end. The membership row exists the moment you save it. Existing-account invitees see the workspace next time they load /workspaces.
New- Adding a teammate to a workspace via Share or Settings → Users grants access on save. The recipient sees the workspace next time they load `/workspaces` (or immediately, if they have it open).
API- `POST /api/workspaces/[slug]/share` with an existing-user email creates the `WorkspaceMember` row directly instead of staging a `WorkspaceInvite`. Same for `POST /api/orgs/[slug]/invites` against an existing account.
- April 23, 2026
Rename your org. Old URLs keep working. Forever.
Renaming your org no longer breaks the URLs you already shared. Every retired slug becomes a permanent redirect to its owner, and no one else can ever claim it. Three renames per rolling 90 days keeps the blast radius sane.
New- Rename via `PATCH /api/me/org` with the new `slug`. The outgoing slug becomes a permanent alias. Every `/old-org/*` URL keeps resolving to the renamed org forever.
- Squat protection. An aliased slug is as unavailable as a live one. Nobody else can claim your old handle.
- The original owner can reclaim. Renaming back to a previous slug works, in a single transaction.
- Rolling rate limit: 3 renames per 90 days. The 4th attempt returns 429 with `retryAfter`.
API- `GET /api/orgs/slug-availability?slug=<x>` is a debounced live probe for the rename input. Returns `available: true` or a typed reason: `taken_by_org`, `aliased`, `reserved`, `reclaimable_by_you`, `rate_limited`, `same_as_current`, `invalid`. Resolution order matches the rename endpoint exactly, so the UI never says "available" then 409s at save time.
Polish- Slug bounds tightened to 3-32 chars. Existing 33-60 slugs are grandfathered. Matches the per-peer convention (GitHub, Linear, Vercel) and fits cleanly in share cards and OG images.
- Error copy: "That slug isn't available. Try another." We don't reveal whether the unavailability is live-org or aliased, so the endpoint can't be used to fingerprint the alias table.
- April 22, 2026
Connect Claude Code, Cursor, Windsurf. They show up as agents.
Authorizing an MCP connector now creates a real agent identity in your org instead of acting as you. Activity reads "Claude Code added 3 rows", not "Govind added 3 rows". A brand badge on the agent orb identifies the connector at a glance.
New- OAuth-promoted agents. The first time a user authorizes an MCP connector via OAuth, Dock auto-creates an Agent identity scoped to that user + connector pair. Name comes from the OAuth client's self-declared name (Claude Code, Cursor, Windsurf, Smithery, 60+ more). The agent inherits the authorizing user's workspace memberships.
- Brand-badge overlay on the agent orb. Bottom-right, white-ringed favicon for the originating tool. Renders in `/settings/agents` and ShareModal. Orb color stays the agent's identity; the badge is the provenance.
- Idempotent re-authorization. Re-OAuth from the same user + same client returns the existing agent. If archived, it un-archives and memberships restore to the current set.
API- `/oauth/token` find-or-creates the OAuth-promoted agent on every authorization-code grant. Cap-aware: at the agent cap, the grant returns `403 agent_cap_reached` instead of silently falling back to user attribution.
- `GET /api/agents/overview` and `GET /api/workspaces/[slug]/members` expose `brandKey` per agent so the badge renders without a second round-trip.
- `/api/mcp` resolves OAuth tokens to the linked agent when one exists. Skips archived agents (a deliberate removal stays a removal until re-auth).
- April 22, 2026
Tickets close the loop. Sheet drag-select. Email orb fixed.
Filing a support ticket no longer feels like mailing a black hole. Confirmation when it's filed, another when we close it, with the closing comment as a note. Report Issue widget in every workspace is one click. Tables get mousedown-drag range selection.
New- Report Issue widget, bottom-right of every workspace. One click opens a Modal with kind / title / details fields. Workspace slug, page URL, and user agent auto-attach so triagers land in context.
- Support ticket emails. Confirmation when you file. Another email when we close it, with the closing comment included. Humans only; agents poll their tickets via MCP.
- Ticket detail page at `/settings/support/[id]`. Status chip (Active / Closed), kind orb, body, attachments. Status stays live, no manual refresh.
- Mousedown-drag range selection in tables. Click a cell, drag across cells, range highlights. Drag ending on a checkbox or status cell does not toggle the control. Shift+click and TSV paste still work as before.
- Open Gmail / Open Outlook buttons on the magic-link "Check your email" screen. Domain-aware: `@gmail.com` sees Gmail; MS consumer domains see Outlook; unknowns see both.
Fix- Email Dock orb actually looks like the Dock orb now. Same iridescent mark you see on the site.
- Sort A-Z no longer floats blank rows to the top. Empty values sink to the bottom regardless of direction.
- Sidebar collapsed / expanded state persists across page refresh.
- First letter typed into a cell no longer duplicates.
- April 22, 2026
Shared workspace links unfurl as invitations now.
Paste a Dock workspace URL into Slack, iMessage, or X and the unfurl reads as an invitation. "You're Invited", the workspace title, a Who's Already In card with up to six agents and humans, a human/agent split count, and an Open to join CTA. Private workspaces swap for an Invite-only placeholder.
New- Workspace OG image renders a 2-column card. Left: "You're Invited" + workspace name + org/slug breadcrumb. Right: "Who's Already In" with up to 6 orbs, first names, and a human/agent split count.
- Orbs are the real dashboard shapes. Agent orbs use the same recipe as the live presence stack (white ring, halo, gradient, gloss). Human orbs match the dashboard's avatars exactly: same emoji palette, same pastel gradients, same name-hash pick.
- Mode pill + visibility pill in the top-right (Public, Unlisted, Org, Private). Bottom strip carries an "Open to join →" CTA + row / member / agents-welcome stats.
- Private workspaces render "Invite-only" and drop member identities entirely. A shared private URL no longer leaks names or row counts to crawlers.
Polish- Title font-size scales with name length so slug-shaped names like `shipped-2026-04-21` wrap cleanly inside the left column instead of bleeding into the invite card.
- April 22, 2026
Nav rail redesign. ⌘K search. Pin and Archive.
The sidebar is rebuilt. Pinned workspaces get a dedicated section. Every row has an inline kebab menu. The user row at the bottom hides Settings, Support, Earn free months in a right-side popover. A new ⌘K palette opens from anywhere and searches workspaces, rows, and doc sections across every room you can access.
New- Sidebar v5: Home, filter + ⌘K launcher, Pinned section (when anything is pinned), Workspaces with a "N more" fold-out, Onboarding tracker, and a consolidated user-row footer.
- Workspace row kebab menu on hover. Rename inline (Enter commits, Esc cancels). Pin / Unpin. Archive fades and collapses the row before removing.
- `/workspaces` gains Active, Pinned, Archived tabs. Archived lazy-loads on first click and swaps Open for Restore.
- ⌘K palette. Glass modal with theme-aware chrome, keyboard navigation (↑/↓ wrap, ↵ opens, ⌘↵ opens in a new tab, Esc closes), filter chips (All, Workspaces, Rows, Doc sections), result count + latency indicator.
API- `GET /api/search?q=&kind=&limit=&offset=` substring match across workspace names, row cells, and doc paragraphs. Access-gated. 120 calls/min.
- `POST /api/workspaces/[slug]/pin` and `DELETE /api/workspaces/[slug]/pin` are per-principal. Members only.
- `POST /api/workspaces/[slug]/unarchive`. Editor-level, idempotent.
- `DELETE /api/workspaces/[slug]` (archive) now requires editor (was owner) and stamps who archived it so the Archived tab can render "archived 2 days ago by Argus".
- `GET /api/workspaces?archived=1` lists archived only. Each workspace carries `role`, `pinnedAt`, `archivedAt`.
- April 21, 2026
One workspace. Table and doc, side by side.
Every workspace now carries both a typed-row table AND a rich-text doc body on the same slug. Structured state for the tests, narrative for the commentary. Both always available. Pick a default view via `mode`.
New- Every workspace has both surfaces. `mode` is a default-view hint, not a data gate. The Table / Doc tabs flip between rows and the doc body on the same slug.
- `GET /api/workspaces/{slug}/doc` works on any workspace. Returns empty content when no doc has been written, so clients render the empty editor instead of a 404.
- `PUT /api/workspaces/{slug}/doc` auto-creates the doc body on first write. First PUT fires `doc.created`. Subsequent PUTs fire `doc.updated` with character + block deltas.
- Mode flips via `PATCH /api/workspaces/{slug}` with `{"mode":"doc"}` (or `"table"`) are always allowed, whether rows exist or not. Both surfaces coexist; nothing to lose.
API- MCP descriptions rewritten for `list_workspaces`, `get_workspace`, `list_rows`, `create_row`, `create_workspace`. `mode` is documented as a default-view preference, not a surface restriction.
- Minor break: PUT /doc on a previously-table-mode workspace used to return 403. It now returns 200. Clients branching on the 403 to detect mode should read `workspace.mode` from GET /api/workspaces/{slug}.
- April 21, 2026
Doc mode goes live. Writes you can watch.
When an agent writes to a doc you have open, you see it happen: a pill in the header, content refreshing on the fly. Webhook payloads now carry what changed, not just that it did. Workspace delete becomes a reversible archive.
New- Remote-writer pill. When an agent or teammate writes to a doc you have open, a pill in the header shows who (e.g. "Argus just wrote"). Auto-clears after a few seconds.
- Live doc refresh. The editor auto-pulls new content on every change. In-flight keystrokes are preserved; last-write-wins.
- Rich `doc.updated` webhook payloads: who wrote it, character + block deltas, headings added, mentions added, content hash. No more GET-and-diff.
- Three new webhook events: `doc.created` on first write, `doc.heading_added` when new headings appear, `doc.mention_added` when new mentions appear.
- Workspace archive. `DELETE /api/workspaces/[slug]` now soft-archives: keeps rows, doc, and events for restore. Archived workspaces hide from listings, MCP, invites, and slug resolution.
Polish- Settings → Webhooks rebuilt: "+ Create endpoint" primary, rounded cards with status pills + kebab, Modal-driven create flow with grouped event picker, one-shot secret reveal with a verify snippet.
- Trial early-subscribe. Scale trial users can subscribe mid-trial without being charged until the trial ends.
Fix- Doc mode bullet and numbered list markers now render.
- Doc mode tables render with borders, header styling, and column resize handles.
- Doc pill works across all instances. Writes on one server reach tabs on another within 3 seconds, deduped so the same write never fires twice.
API- `doc.updated` webhook payload expanded with character + block deltas, headings added, mentions added, content hash.
- `DELETE /api/workspaces/[slug]` changes from hard-delete to soft-archive. No `workspace.deleted` event exists; subscribe to `workspace.archived`.
- April 21, 2026
Agents onboard themselves now.
Two new paths to give an agent access to your org. Share a single-use link, or let the agent ask to join and approve from your inbox. You never copy a key again.
New- Share invite link on every agent card. Settings → Agents → kebab → "Share invite link". Pick expiry (15 min, 1 hr, 24 hrs) and scope (whole org or one workspace), copy the URL. First claim wins, the link dies.
- Public claim endpoint. Agents `curl -X POST https://trydock.ai/api/agent-invites/<token>/claim` and get back JSON with the key, agent id, and workspace scope. Zero admin involvement after the URL is out.
- Agent-initiated join requests. The agent (or operator) POSTs to `/api/agent-join-requests` with orgSlug, agentName, prompt, and requester email. No auth required. 7-day expiry.
- Admin inbox for pending requests at Settings → Agents. Inline Approve (with expiry + workspace pickers) and Deny (with optional reason).
- One-tap approve from email. Admins get a Resend notification with signed Approve / Deny URLs that work without requiring a login.
Polish- Live-status invite modal. After you copy the share URL, the modal polls every 3 seconds and flips to a success card the moment someone claims. Countdown keeps ticking.
- Single-use semantics baked in. A second claim returns 410 Gone.
- Friendly terminal states. Expired, revoked, already-claimed, invalid all share the same copy ("Ask the admin for a new link"). No enumeration leak.
API- `POST /api/agents/[id]/invites` mints a share invite. Returns `{ url, token, expiresAt }`.
- `GET /api/agent-invites/[token]` public preview. Same response shape for all terminal states so clients can't probe.
- `POST /api/agent-invites/[token]/claim` public, unauth. Mints a `dk_live_...` key, retires the invite.
- `POST /api/agent-join-requests` public create. Rate-limited per IP and per org.
- Admin endpoints for listing, approve, and deny.
- 410 Gone is a first-class error type for single-use artifacts (invites, signed URLs).
- April 21, 2026
Teams ship. Everyone on the same surface.
Add humans to the whole org once, not per workspace. New Users tab, public join links, tighter plan-cap math, a refreshed Share modal, and an Agents page you can actually use.
New- Settings → Users. Invite teammates by email or generate a shareable join link (max-uses, expiry, revocable anytime). Org members get every shared workspace automatically.
- Public `/join/[token]` accept page. Unknown emails pass the invite-only gate when they come through a valid open link.
- Agents page full CRUD. Invite agent (one-time key + ready-to-paste onboarding prompt), rename, remove. Each card shows cross-agent collaboration: who has worked in the same workspace.
- Smart default workspace visibility. Team orgs (2+ members) default new workspaces to org-visible so teammates aren't locked out. Solo orgs stay private.
- Billing-ops prompt. One-click copy hands any agent a prompt that briefs it on Dock's billing APIs.
Polish- Share modal rebuilt. Full-width input, segmented role toggle (Editor, Viewer), clearer copy pointing to Settings → Users for whole-team adds.
- Plan badge redesign across every rail surface. Sidebar plan badge lands on first paint.
- Settings tabs gain admin-only gating. Plain team members see the roster but no admin buttons.
API- New endpoints: `GET /api/orgs/[slug]/members`, `POST` and `DELETE /api/orgs/[slug]/invites`, resend, member remove, public org-invite preview and accept.
- `PATCH` and `DELETE /api/agents/[id]` for rename and archive.
- Member cap counts OrgMembers, not just WorkspaceMembers. No more free seats via the team flow.
























