---
title: "Build in Studio"
description: "Edit plugin files and forms in the tenant workspace."
canonical_url: "https://docs.oz0.ai/build/plugins/studio"
---
# Build in Studio

> Edit plugin files and forms in the tenant workspace.

For: plugin authors.

Use Studio to write and test agents and flows in the console. Studio edits the tenant's workspace: plugin folders stored on the server as immutable revisions alongside plugins from Git.

A workspace revision passes the same checks, quality gate and rollout as a Git plugin. You can export it to a repository at any time.

The file is always the source. The graph is drawn from the files each time you look at it, and forms edit the YAML in place (an agent in one file's front matter), comments and layout kept.

Open it from Build / Studio in the sidebar. Files and Inspector toggle the side panes; Focus gives the editor the full workspace width. On a narrow screen, choose Files, Editor, or Inspector to show one pane at a time. Selecting a file or a problem returns to the editor. Find a file filters by any part of its path.

The main tabs follow the work: Build, Test, Review, and Release. Build offers forms, source editing, the graph, Studio AI, and setup for your own coding agent. Test validates the draft and opens comparisons or the test bench. Review holds changes and revision history. Release holds installation and Git export. While building, the inspector keeps Checks and Explain beside the file.

## Write

The left pane lists the folder's files; the middle pane opens structured files in Form, with an Editor tab for YAML and Markdown. Other files open in the editor. Pick a folder at the top, or start one with New plugin from a template: An agent, in one file (`<folder>.md`, its fields in the front matter and its instructions below, with no manifest: the plugin is that one agent, a capability), a flow with an agent and an eval, or a manifest alone.

The agent in one file lints, draws and installs like any plugin; when it needs code, evals or more parts, eject it with `oz0 plugin eject` and start a folder from the result. While a plugin is open, create another through More / New plugin, including when viewing a saved revision or a Git source. When no plugin is selected, New plugin is available in the header. Drafts keep Save revision and, when there are changes, Cancel changes in the header; More also contains Test bench and Discard draft.

On a phone, choose Files, Editor or Inspector to use the full screen width; opening a file returns to the editor.

- Your draft. What you type goes into your own draft of the folder a moment after you stop, and at once with `Ctrl+S` (`⌘S` on a Mac). Nobody else sees it until you save it. Files you changed show `M`, added `A` and deleted `D` in the tree. Discard draft, under More, throws it away.
- A failed save. The current text stays in the editor, and file navigation and revision saving stop until the write succeeds. Discard waits for writes already sent to finish before removing the draft, so a delayed autosave cannot restore discarded text.
- Delete a file. Use the trash button beside the selected file (also shown on hover or keyboard focus for other files). Apply or reset any form changes first. Studio finishes pending editor saves before deleting, then opens a remaining file or shows No file selected. A deleted saved file stays marked `D` until Save revision; More / Discard draft restores the saved files and discards all draft changes. Deleting a file added only in your draft removes that entry from the tree.
- Lint as you type. After each pause, the server runs `plugin lint`'s checks on the folder with your unsaved text laid over it. A finding is underlined at its place in the file, marked in the gutter, and listed under Problems on the right; click it to go to its line. The count of errors and other findings is in the bar above the editor.
- Revisions. Save revision saves your draft as a new, immutable revision with a message, as a commit does. If someone saved the same file since your draft began, the save is refused and says which files; otherwise your draft is laid over their revision.
- Changes. The Changes tab shows the open file against any revision: by default the one your draft builds on. The Revisions tab lists the folder's revisions with who saved them and what changed; open one to read it as it was, or see its changes against the one before.

Plugins from Git show in the folder list too, read-only, with a link to their repository at the installed commit. To change one, change its repository, or start a workspace folder from it.

Readers of the tenant can look at everything; editing, saving and installing need the admin role.

## Forms

For an agent or a flow, Form opens first and shows its flat fields: name, model or alias, the contract, tools, limits, delegation, a flow's steps with their conditions, and so on. Markdown agents also have an Instructions editor for the body below their front matter. Editing instructions alone preserves the front matter exactly. Agent and model fields stay open; the other sections open when they contain a value or an error, and their headings let you reveal empty sections when needed.

Change what you need and choose Apply: the server edits the YAML at those paths and keeps comments, and the form stays open. The Editor tab shows the updated source. A field left empty is taken out of the file. A value a form cannot hold, such as an object as a step's input, says so and links to its place in the file.

Flow forms can add agent, tool, and approval steps, move steps up or down, and remove a step. Unknown properties and complex inputs stay in the YAML; the controls move the existing YAML nodes. Removal refuses while another field still references that step. Moving steps can change which results are available to later steps, so run checks and evals after reordering. The graph remains a view of the canonical files, with no separate canvas definition to synchronize.

Model, alias, agent and tool references search the tenant's installed configuration. Single-value fields show the selected value in an editable selector; replace or clear its text directly. Fields that accept multiple values, such as tools and fallback models, accumulate removable chips inside the same selector. Time fields offer presets and manual entry. Form edits stay in place when switching Studio views; apply or reset them before changing files, folders or revisions. Clicking Studio again keeps the current file.

Cancel changes restores your entire draft to the last saved revision, including unapplied form edits and files added or deleted in the draft. Confirm Discard changes, or choose Keep editing. Reset in a form only cancels its unapplied fields. Cancelling waits for any write already in flight; a failed cancellation keeps your edits.

More / Delete plugin permanently deletes a Studio-created plugin's files, revisions and everyone's drafts. It requires `workspace.write`. An installed plugin must first be uninstalled, which separately requires `plugins.install`; uninstalling keeps the source and does not automatically delete it. Dependencies may prevent uninstalling. Deletion waits until nodes no longer report the plugin, including offline nodes whose last report still lists it, and until a node that has just connected has sent its first report; delete a node that is gone for good. Plugins from Git remain read-only in Studio. The server enforces the same checks for API and CLI deletion.

Routines are kept apart from plugins. Their page (Build / Routines) opens in Form too, which edits the definition in its editor the same way; Save then makes it the routine's next version, as before.

## The graph

Use Fit to bring the whole graph into view, then zoom in to read a branch. Focus gives the graph the full workspace width.

The Graph tab draws the plugin: agents and the agents they may delegate to, flows with their steps in order and the conditions on their branches, the tools and functions agents use, and hooks with the functions that answer them. Nodes named from other plugins have a dashed outline. Every node links to the file and line it is defined at: click it, or focus it with `Tab` and press `Enter`.

The drawing is laid out each time it is shown, and nothing about its layout is stored. Turn kinds of nodes off at the top, zoom, or switch to List to read the same graph as text.

## Build with your coding agent

Build / Coding agent provides setup commands for Claude Code, Codex, Gemini CLI, Cursor, GitHub Copilot, OpenCode, and Goose, plus a handoff prompt that asks for regression tests and actual validation evidence. Export a workspace revision to Git or open the installed plugin's repository, check it out, and run the selected `oz0 setup` command there. The [build kit](https://docs.oz0.ai/build/plugins/claude-code) supplies the plugin rules and check workflow. Your own coding agent handles code, dependencies, and test execution in that checkout; the Studio shortcut does not install the coding tool or sign in for you.

## Studio AI

Build / Studio AI proposes file changes through an ordinary agent job. On first use, Create assistant plugin creates a `studio-assistant` workspace folder. Review its files, choose a model alias, and install it through Release. Its initial configuration uses your tenant's `default` alias and has no tools. It needs a compatible node and a configured model, just like another agent; no vendor account or external service is added by Studio.

Select the source files to share, describe the change, and set a run budget. Selected context is limited to 30 text files and 200 KB. The request and response follow the normal job content permissions, retention, model routing, metering, and audit rules. The assistant proposes complete file contents and suggested tests; it does not execute those tests or install its changes. Open run shows the job, and Cancel run requests cancellation.

Review each proposed diff, then choose Check proposal to lint its files as an overlay on the draft. The lint result is bound to that proposal. Apply reviewed files writes to your draft; it never saves a revision or installs one. Existing files must have been shared as context, and files changed after generation are refused.

Writes are checked in advance but are not an atomic batch: another browser can still change the draft during application, and a network failure can leave some writes applied. Studio reloads the draft and reports confirmed and uncertain writes so you can review the actual state before continuing.

A source file shared as context can steer the model, so a proposal can carry text you would never see: characters no screen draws but a model reads. Studio's editors and diffs write each of them out as `\u{XXXX}`, and a proposal that has any names the files and how many. Apply reviewed files then stays off until you confirm you read them; the confirmation covers that proposal alone, and a revision asks again. A file path with such characters is refused.

The assistant conversation and proposal stay in memory while switching Studio tasks. Leaving the workspace stops its live subscription; a running job continues in Jobs unless canceled. Model-suggested checks are labelled not run. Use Test and Review for evidence, then explicitly save and release a revision. For unrestricted code changes and running a plugin's own test suite, use your coding agent and the build kit.

## Related tasks

- [Test and explain a draft](https://docs.oz0.ai/build/plugins/studio/test-and-explain): Inspect coverage, compare a draft and debug its runs before release.
- [Release a workspace plugin](https://docs.oz0.ai/build/plugins/studio/release): Install a workspace revision or export it to Git.

<legacy-sections>

- <span id="compare-a-draft-with-the-installed-version">

Section

</span>

: [compare a draft with the installed version](https://docs.oz0.ai/build/plugins/studio/test-and-explain#compare-a-draft-with-the-installed-version)
- <span id="explain">

Section

</span>

: [explain](https://docs.oz0.ai/build/plugins/studio/test-and-explain#explain)
- <span id="export-to-git">

Section

</span>

: [export to git](https://docs.oz0.ai/build/plugins/studio/release#export-to-git)
- <span id="install-and-roll-out">

Section

</span>

: [install and roll out](https://docs.oz0.ai/build/plugins/studio/release#install-and-roll-out)
- <span id="policy-coverage">

Section

</span>

: [policy coverage](https://docs.oz0.ai/build/plugins/studio/test-and-explain#policy-coverage)
- <span id="the-debugger">

Section

</span>

: [the debugger](https://docs.oz0.ai/build/plugins/studio/test-and-explain#the-debugger)
- <span id="the-test-bench">

Section

</span>

: [the test bench](https://docs.oz0.ai/build/plugins/studio/test-and-explain#the-test-bench)

</legacy-sections>


## Sitemap

See the full [sitemap](https://docs.oz0.ai/sitemap.md) for all pages.
