Features

HTML previews in chat

Last updated: 2026-09-19

On iOS, an agent can show an interactive HTML file directly in a workspace chat. The file is loaded when you first open the sheet or expand the card; collapsed cards do not fetch their HTML. Closing and reopening reuses the loaded preview.

Save the file inside the workspace and reference it on its own line:

text
visualize{"path":"output/preview.html","title":"Preview"}

An absolute path inside the same workspace also works. The file is read from the device serving that workspace. HTML files outside the workspace cannot be loaded. The file must be HTML or HTM text, at most 1 MiB.

Tap the title or globe to open the preview sheet; tap its leading X to close. The sheet opens at full height and shows only the preview title. The page always gets the whole visible area as its viewport, so height: 100% and 100vh layouts fill the sheet or the expanded card. The chevron on the right expands or collapses the HTML inline. The card uses the selection fill and a tilted globe. Interactive state survives switching between inline and sheet views. A missing or unavailable file shows Retry; an empty file shows Preview is empty. Retry after reconnecting the host or restoring the file. Code-fenced markers stay visible as examples.

Add "mode":"wide" for a horizontally scrollable layout at least 1,024 points wide. Omit it for a responsive layout that fits the phone.

Previews support HTML, CSS, and JavaScript in an isolated session. They do not share browser sign-ins or access RepoGo's native actions. Static dependencies may load from cdnjs.cloudflare.com, esm.sh, cdn.jsdelivr.net, unpkg.com, fonts.googleapis.com, fonts.gstatic.com, and fonts.bunny.net. API requests, forms, navigation, and local sibling-file resources are not supported.

Include the styles and scripts the file needs. The preview supplies basic layout styles, but does not include another application's visualization runtime or host globals such as window.openai, Tweak, or Lucide.

Workspace custom tab#

On iOS, add .repogo/tab.json to show a workspace HTML page beside Browser and Terminal:

json
{
  "label": "Dashboard",
  "path": "docs/dashboard.html",
  "icon": {
    "ios": "chart.bar.fill"
  }
}

The path is relative to the workspace root. The optional icon.ios value is an SF Symbol name, used in the preview tabs and inspector picker. Missing or unavailable symbols use the existing default icon. The icon object also accepts android and web strings, but those platforms do not currently read this custom tab manifest or render those icons.

To ship several pages, list them under tabs. The top-level label and icon name the tab itself (defaulting to "Pages"); each entry names a row. The tab then opens as a list, and tapping a row pushes that page:

json
{
  "label": "Pages",
  "icon": { "ios": "doc.richtext" },
  "tabs": [
    { "label": "Dashboard", "path": ".repogo/dashboard.html", "icon": { "ios": "chart.bar.xaxis" } },
    { "label": "Runbook", "path": ".repogo/runbook.html", "icon": { "ios": "book" } },
    { "label": "Metrics", "path": ".repogo/metrics.html" }
  ]
}

A tabs list with one entry behaves like the single-page form and opens straight into the page.

File citations#

An inline :codex-file-citation{path="apps/resources/report.pdf" purpose="output"} renders as a tappable filename with a document icon. It uses the normal workspace file-link handler. Absolute paths use file URLs; relative paths remain relative. purpose does not grant additional file access. Citations inside code spans or code blocks remain literal, and incomplete citations have no file tap target.

HTML files in the file viewer#

The file viewer also runs embedded JavaScript in HTML previews, with a private web session. Ordinary view updates preserve interactive state; changing the HTML or opening a different file reloads the document. Closing the viewer ends that preview session.