The browser IDE opens an app's code in VS Code for the web, next to a live preview of the app running against your workspace. You edit, see the change, and commit, without setting anything up on your own machine.
The browser IDE is a preview. It is off by default and is turned on per workspace or organization, on top of Apps. On a self-hosted deployment, an administrator turns it on and sets up its sandbox. See Running the IDE on a self-hosted deployment.
Open an app in the IDE
On an installed app's Manage page, click Open in IDE. The button shows only for an app managed from this workspace, and only while the IDE is on.
You need write access in the workspace, and your permission group must allow App Building. Without both, the IDE page says so and opens nothing.
What the IDE opens depends on the app:
- An app with a connected repository: the IDE clones the repository's default branch.
- An app without one: the IDE opens the installed version's bundle, read-only. Connect a repository to commit.
The first start takes a moment while the sandbox is created. If you already have a session for the app, the IDE returns to it.
What the page shows
| Panel | What it does |
|---|---|
| VS Code | VS Code for the web, with the app's code. New tab opens it in its own browser tab. |
| Preview | The app served by agentserve app dev, in the same sandboxed frame people see, using your own access. It reloads as you edit, and restarts by itself after a failed build. |
| Commit & push | Commits everything changed in your session with your message and your name, and pushes the branch. |
| Proposals | Code changes Chat proposed into this session, each with Accept and Reject. |
Stop ends the session and removes its sandbox.
Commit and push
Commit & push pushes to the connected repository like any other push, so the normal Git deploy runs: a push to the default branch, or to a branch a branch rule names, builds a draft version. You can also use VS Code's own Git panel; it pushes the same way.
Pushing needs a repository connection that allows it. A GitLab connection gives the session a short-lived project token; a GitHub connection uses the Agent Serve GitHub App installation, renewed while the session is active.
Code changes from Chat
While your session is running, you can ask Chat to change the app's code. Chat proposes the change as a diff into your own session. It never edits files directly:
- The diff is checked against your working tree and stored as a pending proposal.
- Under Proposals, Accept applies it and runs the repository's tests in the sandbox (
testfrompackage.json, orpytest). The result shows next to the proposal. - Reject discards it.
Nothing a proposal does is committed or pushed. That stays your Commit & push. A proposal can only reach your own session; Chat cannot write into anyone else's.
Sessions and cost
- Each person has their own session per app. Nobody else can open it.
- A session stops after 30 minutes without activity, and after 4 hours in any case.
- The browser reaches the session only through a gate inside the sandbox. Each time you open the IDE or the preview, Agent Serve checks your sign-in and gives the gate a one-time ticket that lasts a minute. A copied link does not work in someone else's browser.
- Sandbox time is metered by the minute to you, in the app's workspace. A session does not start when you, or whoever pays for the workspace, are over a usage limit, and a running session stops when you go over.
- Starting, stopping, committing and deciding a proposal are recorded in the audit trail.
Running the IDE on a self-hosted deployment
The IDE runs each session in a Daytona sandbox. Other sandbox providers are not supported for the IDE. To turn it on:
-
Turn on Apps (
APPS_RUNTIME=true) and the IDE (APP_IDE=true). -
Use Daytona as the sandbox provider:
SANDBOX_PROVIDER=daytonawithDAYTONA_API_KEYset. See Sandboxes. -
Build the IDE snapshot and point the app at it:
bun run --cwd packages/agentserve-cli build DAYTONA_API_KEY=... bun run apps/agentserve/scripts/build-ide-daytona-snapshot.ts --name agentserve-ide:<tag>The name needs an explicit tag; Daytona rejects
latest. Then setDAYTONA_IDE_SNAPSHOT_ID=agentserve-ide:<tag>.
If something is missing, Open in IDE says what: a different sandbox provider, no snapshot set, or a snapshot that does not exist. A snapshot Daytona has deactivated is reactivated, and the IDE asks you to try again in a few minutes.