# Reported issues for Compose Preview Catalogs

Pod holds 18 of 41 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [Compose Preview Catalogs](/mcp/compose-preview-catalogs).

## Most discussed

### `ui_builder_render_native` returns no frame for a CMP catalog on preview.coo.ee

> **Status (2026-09-07).** Retitled: the first of the two findings below is fixed, the second is not.
>
> - ~~`verticalScroll` blocks the whole export~~ — **fixed.** `ScreenDocumentProjection` now emits `.verticalScroll(rememberScrollState())` with the state constructed inline, and its KDoc records that the old refusal "mislocated the state … a wrong diagnosis". Covered by `OrdinaryScreenExportTest`, which asserts both the call and its import with `assertEquals(emptyList(),…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/481) · 2026-09-06 · closed · 7 comments

### Tracking: OpenAI MCP Extensions (ChatGPT/Codex desktop entrypoints, file viewers, mentions, model context)

OpenAI published [MCP Extensions](https://github.com/openai/mcp-extensions/blob/main/docs/spec.md) ([docs](https://developers.openai.com/plugins/build/extensions)). They are `openai/*` additions to MCP and MCP Apps, declared in tool and resource `_meta`, and hosts that don't understand them ignore them. They let a plugin appear on ChatGPT and Codex desktop surfaces the user opens directly, instead of only when the model decides to call a tool. This issue tracks what we build on them. Each…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1235) · 2026-09-30 · open · 4 comments

### test: live verification of chat surfaces (Claude in Slack) — smoke script + manual script

Tracks **live verification** of the chat-surface work from #1254, which shipped in #1258. Server tests cover the contract. This issue covers what only a real deployment and a real Slack workspace can show. It has enough context to pick up cold.

## Background (read first)
- **What shipped (#1258):** on a host with a public origin, every hosted `/mcp` result that shows a picture also carries a **signed https PNG link**, which expires after 10 minutes. The link appears three times:
  - as a…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1262) · 2026-10-01 · open · 3 comments

### ui-builder: remote-m3 declares `asset/image` but the widget generator refuses every one, so no widget with artwork exports

## What happens

`remote-m3` lists `asset/image` among its components, so the builder lets you place artwork in a widget's content slot and the canvas draws it. The Remote Compose generator then refuses the whole document:

```
// `asset/image` has no Remote Compose counterpart this generator can write
```

with one diagnostic:

```json
{"severity":"error","code":"UNEXPRESSIBLE_DOCUMENT",
 "message":"`asset/image` has no Remote Compose counterpart this generator can write"}
```

## Reproduce

A…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/508) · 2026-09-06 · closed · 2 comments

### feat: chat surfaces (Slack first) — text+image fallbacks, pick-from-chat, thread links, notifications, unfurls

Part of #1235. Written so another session can pick it up from scratch.

## Why
The work under #1235 targets ChatGPT/Codex desktop, which offers file viewers, thread tabs, MCP Apps, pickers and sidebar apps. Teams also discuss and decide in **chat tools: Slack first, then Teams, Discord and Google Chat**. There, agents run as Claude in Slack or the ChatGPT Slack app, connected to our **hosted `/mcp`** (`ServeCatalogMcp`, `ServeUiBuilderMcp`), with **no MCP Apps, no file viewer and no editor**.…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1254) · 2026-10-01 · open · 1 comment

### Stale render after notify_file_changed (Antigravity, 3.78.0)

**Seen** in Antigravity 1.2.12 with server 3.78.0, on the ComposeStarter Wear sample.
- The prompt was: "Edit the header to "Hello Android" and re-render".
- The agent edited `MainActivity.kt` (+1 −1).
- It then called `notify_file_changed`, `render_preview` and `render_preview` again.
- It looked at the returned image, then ran `./gradlew :app:compileDebugKotlin` itself.

That Gradle step means the renders after the notification were still stale (the old "Header"). The turn took 44 s and was…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1169) · 2026-09-27 · closed · 1 comment

### Local MCP (mcp/): send short initialize instructions

## Problem

The local `compose-preview mcp serve` server (`mcp/`) sends **no** `instructions` in its `initialize` result. The hosted `/mcp` does (`ServeCatalogMcp.kt`). Antigravity saves each server's instructions to `~/.gemini/antigravity/mcp/<server>/instructions.md` and agents read that file. For this server the file holds only an internal ID.

In an observed Antigravity 1.2.12 session, the agent was asked to "Render ListScreenPreview and show it to me". It worked out the workflow by itself:…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1163) · 2026-09-27 · closed · 1 comment

### fix(mcp): undeclared or wrong-typed knob overrides are accepted and reported as applied

Found by a live knob test against https://preview.coo.ee (3.91.0, 2026-10-02) with a live grant.

## What works
Declared knobs reach the renderer through `catalog_render_preview` and `catalog_render_matrix` as `knob.<key>` overrides. I verified each one by looking at the PNG, not only by its hash:

| Preview | Override | Result |
| --- | --- | --- |
| compose-m3 `button-filled__ideal__default__light` | `knob.label: "Hello MCP"` | button reads "Hello MCP" |
| same | `knob.enabled: false` | grey…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1277) · 2026-10-02 · closed · 0 comments

## Most recent

### feat(mcp): structured settings on the plugin page (openai/settings)

Part of #1235. Works on every platform.

## What
Today's preview defaults are flags and environment variables. They become native controls on the plugin's page in ChatGPT/Codex.

## Design
- **Capability.** Advertise `capabilities.extensions["openai/settings"] = {readTool, updateTool}`: through `server/discover` for MCP `2026-07-28`, and through `initialize` for older versions.
- **The two tools.**
  - `settings_read` accepts `{}`, is read-only, and declares an `outputSchema` of…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1242) · 2026-09-30 · closed · 0 comments

### feat(mcp): sidebar apps + deep links for the preview catalog and UI Builder (global entrypoints)

Part of #1235.

## What
The preview catalog and the UI Builder open full screen from the ChatGPT/Codex sidebar, on every platform, without asking the model first. Deep links then point straight at one preview or one design, from a PR comment, the diff bot or the CLI.

## Design
- **Local server (`mcp/`).** A `previews_library` tool with entrypoint `{type:"global"}` and input `{}`. It renders the viewer in a library mode: registered projects, then modules, then previews, with search and a render…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1241) · 2026-09-30 · closed · 0 comments

### feat(mcp): visual choices as thumbnail pickers (OpenAI form elicitation)

Part of #1235. **Builds on #1120** (elicitation for rule-driven decisions): this issue is only the OpenAI form extensions layered on top of it, and should start after #1120 has settled on its elicitation plumbing.

## What
When a choice is visual, the user picks from rendered thumbnails rather than from names. Examples:
- which of three layout variants the agent proposed;
- which preview was meant, when a `render_preview` query matches several;
- which device or theme to use for a matrix.

##…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1240) · 2026-09-30 · closed · 0 comments

### feat(mcp): composer @-mentions for previews

Part of #1235. Desktop only (per the spec).

## What
The user types `@ProfileScr…` in the composer and picks a preview. The message then carries its exact `compose-preview://` URI, so the agent renders it directly. It never has to search source files, which is the #1163 failure mode (6.7 minutes spent to do a 3-second render).

## Design
- **Tool `preview_mentions`.** `_meta["openai/extensions"]["mentions/search"]: {}` and `_meta.ui.visibility` including `"app"`. It takes `{query: string}`,…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1239) · 2026-09-30 · closed · 0 comments

### feat(mcp): thread "Previews" tab — point at a node, it becomes context for the next prompt

Part of #1235.

## What
A **Previews** tab inside each conversation shows the previews for the source files this thread has touched, and re-renders them as the agent edits. The user clicks a node in a render, and it is attached to the next prompt: the crop, its semantics and its source location. "Make this bigger" then refers to exactly that node, where today the user has to describe it.

## Design
- **Tool `previews_tray`.** Entrypoint `{type:"thread"}`; accepts `{}`; renders…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1238) · 2026-09-30 · closed · 0 comments

### Local daemon doesn't provide compose/semantics (ComposeStarter, CLI 2.28.0)

**Seen** in Antigravity 1.2.12 with the compose-preview plugin, CLI 2.28.0 (`mcp serve`), on the Wear ComposeStarter sample. The agent reported:

> Programmatic semantic tree inspection (`compose/semantics`) was unavailable on the local daemon, so layout validation was performed directly against the rendered bitmaps

**Why it matters:**
- `render_preview` defaults to `observe=semantics` (the tree, sha256 and dimensions, with no base64). That default is the token-cheap path for agents.
- Without…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1166) · 2026-09-27 · closed · 0 comments

### Hosted /mcp list_previews with no catalog runs for more than 3 minutes (client timeout)

## Observed

In Antigravity 1.2.12 (`clientInfo.name` `antigravity-client`), an agent called the hosted catalog server's `list_previews` with **empty arguments** (`{}`):

```
call_mcp_tool(ServerName="compose-catalogs_compose-preview-catalog", ToolName="list_previews", Arguments={})
→ MCP tool call … timed out after 3m0s: context deadline exceeded
```

The same session then rendered a local preview in about 3 s. So this single call took up about 3 of the 6.7 minutes the turn lasted. The agent…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1162) · 2026-09-27 · closed · 0 comments

### Remote render results: add a fetchable signed https PNG URL

## Problem (observed in Antigravity 1.2.12 today)

The hosted `/mcp` `render_preview` returns the PNG as inline base64 plus a `resource_link` with a `compose-preview://…` URI. Hosts without an MCP Apps bridge can't use either to show the image:

- **Antigravity** renders `<agent-embed>` cards as `iframe srcdoc`. Inside the card, `about:srcdoc` drops `#`/`?`, relative and `file://` images fail, while `data:` and **`https:` images load** (checked with a gstatic PNG: LOADED).
- To show a catalog…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1160) · 2026-09-27 · closed · 0 comments

### ui-builder: server-rendered read-only fallback when the browser has no WebGL

## Problem

The Wasm editor (compose-ui-builder `ui-builder/src/wasmJsMain/.../Main.kt`) needs WebGL for Skiko. When the browser refuses a context, the editor now shows a "WebGL required" message and stops (`showWebGlRequiredMessage`). The person gets nothing to look at, even for a design they only wanted to view or share.

## Ask

Serve a read-only fallback page for a design: the revision-pinned PNG (already produced by the render port), plus title, revision and comments. The editor's no-WebGL…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/1021) · 2026-09-23 · closed · 0 comments

### serve --module: a failed render build is reported as "matched no discovered preview module" (exit 3, not 2)

## What is wrong

#956 made `--module` select the requested module **before** the build result is checked, so a failed build and a misspelled module are now reported the same way — and the wrong way for the build failure.

`ServeRunner.kt` (main, ~line 980):

```kotlin
val discovered = discoverAndBuild(silenceStdout = false)
val outcome =
  explicitModule?.let { requested ->
    selectRequestedModule(discovered, requested)
      ?: run {
        System.err.println(
          "serve: --module…

[Read the thread](https://github.com/yschimke/compose-preview-server/issues/957) · 2026-09-19 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/yschimke/compose-preview-server/issues).
