ClipSpacesClipSpaces Docs
Back to app

All releases

Connectors pared back to what works, and a real MCP setup guide

Added

  • A recognised AI client wears its own logo. Claude Code, Claude Desktop and claude.ai now show Anthropic's mark instead of a generic plug — the real logos:claude-icon glyph, inlined into BrandIcons.tsx like every other brand mark rather than pulled from an icon dependency at runtime. It is also the one place a warm clay tone is allowed in app chrome: it's somebody else's brand colour, not ours, and a monochrome Claude mark reads as a generic asterisk. The icon is matched by name, and the name is not verified — it arrives through open OAuth registration, so anything registering as "Claude Code" gets the mark. That is fine on a screen listing grants you already approved, and is exactly why the consent screen still shows plain text with no logo: there, a borrowed mark would be doing the lying, at the one moment someone is deciding whether to trust the thing. Both halves of that decision are written into the code at the two call sites.

Changed

  • A connected app is one row, not a paragraph with a border. The card stacked the client name, two badges, the spaces and the timestamp into four ragged lines of mixed weight and size. The same facts fit two lines once you decide what leads: the name (with the re-authorize pill beside it when the token is dead), then what it reaches and when it last did — 🎨 MCP Test · 23h ago. The permission moves to the right edge next to the disconnect button, where the controls are, and drops below sm so a phone keeps the name and spaces legible instead of wrapping four ways.
  • The section no longer appears out of nowhere. It rendered nothing at all until the grant fetch resolved, so on an account with connections the pane jolted a beat after opening. It now shows a skeleton row of the same shape while the request is in flight, then crossfades to the real rows — an arrival that reads as a swap rather than an insertion. Disconnecting the last app collapses the section with a height transition instead of vanishing it, which is what makes it legible as "that was the last one" rather than as a glitch. Curves and durations come from lib/motion.ts rather than being picked per-component.
  • Settings → Connectors only lists things you can act on now. The pane carried a grid of nine "suggested sources" — Figma, YouTube, GitHub, Spotify, X, Loom, plus Google Drive, Linear and Pinterest marked Soon — behind a "+ 5 more integrations" expander, and two more Soon teasers (Google Docs, Slack) under Export. None of them were connections: pasting a Spotify link is just paste, and the app has unfurled those since long before this screen existed. Nine chips you cannot click buried the two controls that do something, so they are gone, replaced by one line saying what a paste turns into and pointing at the docs page that lists it properly. What is left is Notion, connected apps, and export — every row does something. Net −134 lines, including four hand-inlined brand SVGs that existed only for the teasers.
  • The Notion row no longer says "Soon" while it's loading. Its connect control rendered a Soon badge until the status fetch came back, which read as "this feature isn't built" for the first few hundred milliseconds of the only integration that ships. It is now a skeleton the exact size of the button that replaces it, so the row doesn't reflow either.

Added

  • A step-by-step guide for connecting an external AI at /docs/connect-ai, in the docs sidebar under Guide. The previous coverage was four paragraphs that described what a connection is and then said to "point it at /api/mcp" — true, and useless to anyone who hasn't set up an MCP server before. This is the actual sequence: add the server, run /mcp, approve in the browser, tick your spaces, verify with a prompt whose answer proves it worked. Plus what the three tools do, the two limits that are deliberate, a seven-row troubleshooting table keyed on the exact message you see, and the localhost variant.
  • Copyable command blocks in the docs — new components/docs/CodeBlock.tsx. A header bar with a terminal glyph (or a filename, for config you paste into an editor), an optional tab strip, and a copy button; the copy button copies the active tab only, because a reader who copies another client's command and pastes it into a terminal gets a confusing error. Setup steps use it with one tab per client, so Claude Code, Claude Desktop and a generic mcp.json sit in one block instead of three stacked ones. Both rows scroll independently, so a long command never widens the page on a phone. Numbered .docs-steps styling lands with it.
  • MCP is discoverable from the screen that manages it. Connected apps renders nothing until something is connected — correct, but it meant a user with no connections had no way to learn the feature exists from Settings. One always-present line under Connectors now links to the guide.

Fixed

  • Cancel didn't work on any confirm raised from a modal — and Escape was worse. A Radix dialog (Settings, and every other shadcn Dialog/Sheet) sets pointer-events: none on <body> and re-enables it only inside its own content branch. The app-wide confirm in lib/confirm.tsx rendered in the ordinary React tree, so it inherited the block and every button in it was dead to the mouse. What made this dangerous rather than merely broken: the confirm auto-focuses its confirm button and binds Enter to it, so the dialog still had exactly one working answer — yes. Escape didn't rescue it either. Settings listens for Escape on document in the capture phase and calls stopPropagation(), so the confirm's own bubble-phase listener never ran: Escape closed Settings and left the confirm stranded over a dead page. The confirm now portals to <body> with pointer-events: auto, and owns Escape/Enter from the capture phase with stopImmediatePropagation() — the topmost layer takes the key, and nothing underneath sees it. Reported against the disconnect-app dialog; it affected disconnecting Notion, deleting a saved model and every other confirm opened from Settings identically.
  • Answering a confirm no longer dismisses the dialog that asked. Making the confirm clickable reintroduced its pointer events to Radix, which reads a pointerdown outside a modal's content as "dismiss me" — so cancelling would have closed Settings underneath. The confirm overlay is tagged data-confirm-layer and Dialog/Sheet skip their outside-dismiss for interactions coming from it. Fixed in the primitives, not at one call site, so it holds for every dialog in the app.
  • The releases page hadn't shown a new release since 24 July. /releases renders every ## heading in this file, taking the date from the heading itself. Two weeks of shipped work — the billing and plan-enforcement release, and the whole MCP effort — had been written up in full and left under ## Unreleased, so instead of appearing as releases they fused into one undated entry called "Unreleased", filed under a month group labelled Earlier, at /releases/unreleased, with a summary taken from whatever its first bullet happened to be. The activity heatmap skips undated entries entirely, so it showed nothing had shipped at all. Promoted to two dated releases (2026-07-25 and 2026-07-28), and CLAUDE.md now states the promotion step explicitly rather than leaving it as folklore — "update the changelog" was being followed to the letter and still producing a stale page.
  • Undated entries sorted above the newest month. Month groups are emitted in document order, and an undated entry maps to a group called Earlier — so a heading with no date sat at the very top of /releases, above July, which is the opposite of what its label promises. Earlier now sorts last wherever it appears.
  • Docs search didn't know about half the docs. DocsSearch's index is hand-maintained and had never been updated for Let AI edit your board or Connect an external AI, so ⌘K couldn't find either. Both are indexed now, along with every section of the new page, and the new page is in sitemap.xml.