Changelog
Latest updates, features, and fixes in Trellis.
Changelog
Documentation
- Projections and whiteboards: Calendar manual events and agent
calendarCRUD tool, pin picker with rail × unpin,.whiteboard/ Excalidraw files, fullscreen Whiteboards projection, agentwhiteboardtool and corpus, Trellis system prompt +<whiteboard-tool>hints, auto-attached boards from Code tabs and Whiteboards projection,@opencode-ai/whiteboard/browserfor Vite, and troubleshooting (unstyled Excalidraw, schema 500, agent denies tools). Studio introduction updated (graph entity sidebar frontmatter on Details). - CLI reference updated:
seed,repair, expandedissuesubcommands,refs,search,reindex,studio, anddbquick start. - Documented
-p/ cwd repo-root resolution andissue create --descriptionalias (shipped in 3.1.14). - Ecosystem desk guide:
just trellis -rrepo aliases, Studio vs desk indexing, VS Code search excludes. - Multi-agent desk hooks (Cursor, Windsurf, Codex, Copilot CLI, Gemini) and
just docs-check/ sync-docs workflow. - Ecosystem desk: local
just publish-studio/publish-resume, desk.envNPM_TOKENfor non-interactive npm publishes. - Trellis Kernel API docs now cover concurrent local writers: lock-guarded
ops.jsonappends, atomic temp-file rename writes, and lock-protected monotonic issue IDs (TRL-<n>).
Trellis Cloud
- Sandbox CLI PATH: broker wraps E2B
commands.runshells with npm globalbinonPATHsotrellis initand CLI upgrades work when the template already started Studio (wrapSandboxShellincloud/src/studio-shell.ts).ensureStudioClialso verifiescommand -v trellisbefore skipping install. Fixes Provisioning failed /trellis: command not found(exit 127). See Cloud hosting. - Studio stack restart: when upgrading turtlecode,
startStudioInSandboxnow kills both the turtlecode shell (3333) and the OpenCode backend (4096) before relaunching. Fixes Method Not Allowed onPOST /session/…/prompt_asyncwhen a new UI talked to a staleopencode serve. See Cloud hosting and Cloud AI proxy. - AI proxy (Vercel AI Gateway): broker routes
/ai/chat,/ai/chat/stream, and/ai/v1/chat/completionsthrough Vercel AI Gateway (default model: Gemini Flash Lite viaGEMINI_DEFAULT_MODEL, for examplegoogle/gemini-2.5-flash-lite). Server-sideAI_GATEWAY_API_KEYonly; sandboxes authenticate with InstantDB bearer tokens. Per-user daily token budget (AI_DAILY_BUDGET), RPM/concurrency limits, andGET /ai/usagefor the Studio status-bar gauge. BYOK (body.apiKey) bypasses the gateway and hits Google directly. See Cloud AI proxy. - AI proxy tests:
cloud/src/ai-proxy.test.tsexercises model aliases, OpenAI-shaped responses, auth, rate limits, budget caps, and SSE streaming with a mocked AI SDK (no gateway key in CI). Runs underbun test src/and passes brokerbun run typecheck. Optional live checks:bun run test:ai-smokeincloud/. - Projects grid: simplified project cards show the thumbnail, project name, last opened time, and an actions menu; large screens use a 3-column grid instead of four.
- Publish (backend): broker endpoints
POST /project/:id/publish/begin,POST /project/:id/publish/commit, andGET /publish/checkfor slug registry, R2 presigned uploads, and live pointer updates. InstantDB schema addspublishedSlugs,publishedVersions, andpendingPublishes. Edge router package atcloud/publish-router/serves*.studio.trellis.computerfrom R2 (deploy is operator-driven; see the publishing guide).
Trellis Studio
- Graph entity sidebar (markdown frontmatter): file Preview no longer squeezes YAML Properties into a side rail; frontmatter edits live on Details in a full-width block. Code view keeps the collapsible Properties column. See Trellis Studio introduction.
- Whiteboard agent context: open
.whiteboardfiles attach on composer send from Code tabs and from the Whiteboards projection fullscreen editor (recent tabs, no@required). OpenCode Trellis system prompt documents thewhiteboardtool; synthetic<whiteboard-tool>hints fire when boards are in context or the prompt mentions diagrams. See Projections and whiteboards. - Whiteboards projection (context fix): fixed a crash when opening a board fullscreen (
ReferenceError: set is not defined) so projection context registration and composer auto-attach work. See Projections and whiteboards. - Projection rail unpin: pinned projection icons show the corner × only on hover or keyboard focus, keeping the rail uncluttered. See Projections and whiteboards.
- Whiteboard package (browser entry): Studio UI imports
@opencode-ai/whiteboard/browserso Vite does not bundle Node corpus loaders; fixes 500 onlib/whiteboard/schema.tsand broken Whiteboards projection. Agents still use the full@opencode-ai/whiteboardpackage and OpenCodewhiteboardtool. See Projections and whiteboards. - Whiteboard agent corpus (
@opencode-ai/whiteboard): versioned shapes, figures, layouts, and templates for.whiteboardfiles. OpenCodewhiteboardtool:list_catalog,describe,apply_template,insert_figure. Elements can carrycustomData.trellisbindings (issue:…,entity:…) for graph cross-links. Shipped templates: sprint retro, flow diagram, system context; figures include mindmap node and API endpoint. See Projections and whiteboards. - Whiteboards projection (fullscreen): clicking a board in the Whiteboards lens opens Excalidraw fullscreen in the projection panel with a Back toolbar control to return to the card grid (no jump to Code view). New whiteboard opens the new file the same way. Code view and file tabs still open
.whiteboardfiles in the editor pane. See Projections and whiteboards. - Session icon rail: reordered core views to Graph → Plan → Code → Database → Assets → Design → Review → Preview → Logs. Code, Assets, and Design use folder, boxes, and pencil-ruler icons. The preview panel tooltip is Preview (
?view=browser;?view=previewstill works). Mobile bottom dock matches the same order. See Projections and whiteboards. - Whiteboards (Excalidraw CSS): fixed broken whiteboard UI (vertical toolbar, empty black canvas) by loading Excalidraw through a Vite-bundled React bridge (
excalidraw-react-bridge.tsx) soindex.cssis injected; removed development CDN fallback.optimizeDepsincludes Excalidraw and React. See Projections and whiteboards. - Calendar events: manual
calendar_evententities in the Trellis store (title, schedule, all-day/timed, color, description). Studio Plan → Calendar and the Calendar projection: click a day to add/edit events, title chips on the grid, day panel editor. HTTP:GET /trellis/calendar/events,POST /trellis/calendar/save,POST /trellis/calendar/delete. Agentcalendartool:list,create,update,delete(optionalyear+monthfilter on list). See Projections and whiteboards. - Calendar projection: optional icon-rail lens (
?view=projection&lens=calendar) sharescalendar-view.tsxwith Plan → Calendar (graph markers plus manual events). Pin from + orprojections.pinned; not in workspace default pins. - Projection pin picker:+ opens On rail / Add to rail groups; hover a pinned icon for × to unpin (at least one projection required).
- Whiteboards (
.whiteboard+ Excalidraw): open*.whiteboardfiles in Code view with an embedded Excalidraw editor (Excalidraw JSON on disk, debounced save). New Whiteboards projection on the icon rail (?view=projection&lens=whiteboards) lists boards and createswhiteboards/<slug>.whiteboard. Default pins for app and productivity workspaces include Whiteboards alongside Notes. Excalidraw mounts in a React 18 island inside the Solid app (excalidraw-react-bridge.tsxlazy chunk; Vite bundles@excalidraw/excalidraw/index.css). Requiresbun installfrom the studio repo root and a dev-server restart. Studio strips ephemeralappStatekeys on save, suppliescollaboratorsas aMapat runtime, repairs corrupt ExcalidrawlocalStoragekeys on open, and uses a per-file storagename. Unit tests inpackages/app/src/lib/whiteboard/schema.test.ts. See Projections and whiteboards. - Cloud default agent (
trellis-cloud): OpenCode registers a built-intrellis-cloudprovider that points at the broker/ai/v1OpenAI-compatible API. Studio defaults the composer togemini-flash-lite-lateston cloud;CloudProviderSyncwrites the iframe auth token and broker base URL to OpenCode then disposes to reload providers. OpenCode Zen (Nemotron) remains a fallback. See Cloud AI proxy. - Cloud default agent (
trellis-cloud): OpenCode registers a built-intrellis-cloudprovider that points at the broker/ai/v1OpenAI-compatible API. Studio temporarily defaults the composer tominimax-m2.5-freeon OpenCode Zen while the metered broker → Vercel AI Gateway path is being stabilized;CloudProviderSyncstill wires the iframe auth token and broker base URL sotrellis-cloudis ready to use. OpenCode Zen (Nemotron) remains a fallback. See Cloud AI proxy. - Cloud model constants tests:
opencode-zen-model.test.tslockshostedFreeModelKey()toopencode/minimax-m2.5-freeand Zen/Nemotron as the fallback key. - Desktop graph (Tauri): fixed the live graph and other Trellis panels returning empty data in the desktop app. Several client helpers called
/trellis/*with unauthenticatedfetch; the embedded sidecar requires Basic auth, which produced 401 on/trellis/graphand similar routes. All Trellis HTTP helpers now use the authenticated SDK fetch (same path as stats and issues polling). - Code view layout: fixed the Explorer and editor stacking vertically in the Code rail view; the file tree and editor now share a horizontal row (tree left, editor right).
- Publish (preview UI): cloud workspaces show a state-aware Publish / Live control in the preview and browser panels (
packages/app/src/components/preview-publish-control.tsx). First publish openspublish-first-popover.tsxwith slug validation (packages/app/src/lib/publish-slug.ts), debouncedGET /publish/check, taken-slug suggestions,GET /publish/planbuild overrides (command, output folder, SPA fallback), and public/unlisted visibility. Republish runs from the Live chevron menu. Session transcript sharing is labeled Share session so it is distinct from static publish. See Publish to the web. - Publish (backend): OpenCode module
packages/opencode/src/publish/orchestrates build (reusing preview inference), manifest hashing, broker begin/commit, and direct R2 upload. Routes:GET /publish/plan,GET /publish/check,POST /publish. Build logs go to the preview console. See Publish to the web. - Session status and streaming (cloud): assistant replies stream incrementally over SSE during a turn. The composer, timeline thinking indicator, and sidebar derive “working” from completed assistant messages as well as
session_status, so UI recovers when the idle event is dropped in cloud iframes. While a turn is active, Studio pollssession_statusevery few seconds; a full message reload runs only when busy status is stale, so streaming is not replaced by a single wall of text. - Default model on studio.trellis.computer: cloud workspaces temporarily default to MiniMax M2.5 Free via OpenCode Zen (default model id
minimax-m2.5-free). When the meteredtrellis-cloudpath is re-enabled as default, agent LLM calls route through the broker AI proxy and Vercel AI Gateway; no user API key is required for the default model. CloudProviderSync pushes the iframe InstantDB token to OpenCode on load sotrellis-cloudis ready. Fallback remains Nemotron 3 Super Free (OpenCode Zen) whentrellis-cloudis unavailable. Status bar shows daily token budget fromGET /ai/usage. See Cloud AI proxy. - ChatGPT Pro/Plus (Codex) on studio.trellis.computer: remote workspaces now default to device code sign-in instead of browser OAuth (OpenAI only allows
http://localhost:1455/auth/callbackon the machine running Studio). Browser sign-in remains available for local Studio. After OAuth connect, Studio selects the best available Codex model (prefers GPT-5.3 Codex, then other Codex tiers; skips Codex Spark models that ChatGPT OAuth does not support) and shows a confirmation toast; new sessions prompt Connect ChatGPT until OpenAI is linked. The ChatGPT subscription catalog also exposes GPT-5.2, GPT-5.4, and GPT-5.4 Mini alongside Codex models; Studio detects subscription OAuth vs API-key catalogs so defaults stay on Codex after connect. MiniMax M2.5 Free remains the default when OpenAI is not connected. - ChatGPT Codex OAuth allowlist: OpenCode filters the OpenAI provider after ChatGPT sign-in to subscription Codex models only, so the first prompt no longer targets GPT-5.3 Codex Spark (Zen/API-only) and fails with "not supported when using Codex with a ChatGPT account".
- Agent tool schemas (Big Pickle / DeepSeek): fixed first-turn failures when the default model rejected tool definitions with
type: null(notably theassettool). Tool parameters now use flat object schemas where needed, and OpenAI-compatible providers sanitize union schemas to roottype: "object"before each request. Opencode regression tests cover theassetschema on the Big Pickle path plus link and image asset actions. - Backend resilience: Trellis graph and store polling pause while the local server is unhealthy (for example during a dev restart or
[vite] server connection lost), then resume automatically when health returns. Avoids repeatedERR_CONNECTION_REFUSEDnoise in the browser console. - Session streaming: assistant tool accordions no longer trigger
aria-hiddenfocus warnings during streaming; the turn container usesaria-busyinstead. Auto-scroll coalesces layout updates to one frame while content grows. - Go to file:⌘P / Ctrl+P and the header search bar open a files-only quick open picker (VS Code-style), with fuzzy path search, space-separated segment matching, and up to 100 results. Search input is debounced (200ms) and in-flight
/find/filerequests are cancelled when you keep typing. The file index is warmed on workspace open. The command palette (⌘⇧P / Ctrl+Shift+P) remains a separate mixed picker for commands and sessions. - Open project by path: the Open project dialog accepts pasted absolute or tilde paths (for example
/Users/you/projector~/Projects/foo) in the search field; press Enter or choose the Paste path row to open that directory. - Composer focus: fixed inputs across the IDE (composer, file editor, search, sidebar prompts) sometimes becoming unclickable after an agent response. Modal UI layers could leave
document.bodywithpointer-events: none; Studio restores pointer events when overlays close, on the next click when no modal is open, and defaults dropdown menus to non-modal. Errored assistant turns no longer keep the session in a “working” state whentime.completedis missing. The todo dock no longer blocks the composer overlap (only its toggle and list accept clicks while open). Graph, Plan, Preview, and other rail views stay interactive without opening the review drawer; only Review requires the review panel. The composer usespointerdownto focus the prompt when clicks land on the editor. - Theme preload:
oc-theme-preload.jsdefaults to the Cursor palette and migrates legacyoc-1installs to Cursor on first load (clears stale cached theme CSS). - Provider errors (
invalid argument): OpenCode filters empty message content for Google/Gemini and OpenAI-compatible models (including Nemotron on Zen) before follow-up requests, reducingRequest contains an invalid argumentfailures after tool rounds. Error text in the timeline includes a short hint to retry, switch models, or start a new session when this message appears. - File listing:
GET /filelists the open project workspace when the SDK sends a projectdirectoryquery param; the legacy~/.turtlecodelisting applies only under that home directory (fixes empty explorer on desk/symlink layouts). - Symlinks: symlinked folders in the file tree resolve to
directoryorfilenodes based on their target. - Search indexing: git worktrees use ripgrep with symlink following where ignore rules allow. Desk-style roots (no git at the orchestration folder) use a shallow index that does not traverse symlink spokes; open a spoke path as the project to search inside that clone.
.trellis/is excluded from Studio file and text search. - Session navigation: removed the separate Home icon from the left rail. Graph is the default session view when you open a workspace (and when the
viewquery param is omitted). Legacy links with?view=homeredirect to?view=graph. The mobile bottom dock leads with Graph as well. - Workspace-scoped editor tabs: open files, rail selection, and review scroll state persist per project, not per agent session. Switching session tabs or creating a new session no longer resets the IDE layout; chat, composer, and model stay per session.
- Default theme: Studio now defaults to the Cursor palette on first launch (local and cloud). Legacy
oc-1theme ids migrate to Cursor. Previously saved themes inlocalStorageare unchanged.
Debugging focus issues (development)
Studio logs when an input field gains or loses focus, and logs every pointerdown with hit, hitIsInput, inertAncestor, and bodyPointerEvents (useful when focus never fires). Filter DevTools for [input-focus]. When you click an input and focus still does not move, Studio retries focus() on the field under the cursor.
For deeper tracing (programmatic .focus() calls, focusout, mousedown hit targets), enable verbose logging and refresh:
localStorage.setItem("trellis_debug_focus", "true");
Filter the DevTools console for [focus]. Each log includes the click target, elementFromPoint at the cursor, and bodyPointerEvents when the body is stuck at "none". Disable with localStorage.removeItem("trellis_debug_focus") and refresh. Telemetry events no longer print to the console in dev; cloud tracking is unchanged.
3.1.14
- CLI
trellis --versionnow reports the real package version frompackage.json(was hardcoded0.1.0). - CLI
-p/ cwd resolution walks up to the nearest.trellisrepo root (monorepo subfolders work without passing the root path). - Clearer "not a repository" errors: show looked-from path, cwd, and
-phint. issue createaccepts--descriptionas an alias for--desc.bin/trellis.mjslauncher finds Homebrew Bun when Node'sPATHis minimal (npx trellis/ agent shells).
3.1.2
- Fixed
trellis/cmscollection reads for inferred collections whose normalized key differs from the stored entity type casing, such asblogpostreadingBlogPostentities. - Added graph-link awareness to CMS entries so reference links such as
post --author--> authorappear infieldsand can be expanded. - Added
statusfact fallback whencms_statusis absent, preserving content created by agents or lower-level store tools. - Added shared polling for CMS subscriptions so duplicate subscribers to the same collection or entry reuse one poll stream.
- Added
onErrorand customequalssubscription options. - Fixed CMS entity pagination to respect the opencode store route's 1000-entity page limit.
- Added CMS client/scaffold tests and included them in the default test script.
- Added
directorysupport to CMS consumer scaffolds for multi-instance opencode routing.
3.1.1
- Published the first
trellis/cmsSDK package update after adding scaffold helpers.
3.1.0
- Added the
trellis/cmssubpath withcreateCmsClient, collection reads, entry reads, polling subscriptions, reference expansion, collection discovery, and consumer scaffold helpers for vanilla, React, Solid, and Vue.