I wanted to test a theory: if an AI agent has a real browser, does it still need a local development environment?
So I pointed it at StackBlitz and said: build something.
No terminal access. No filesystem. No git clone. Just a browser window pointing at a web IDE.
It built a working app.
What it built
A Synthwave Pomodoro Timer. Neon glow effects, animated perspective grid, blinking colon, mode switching between Focus / Break / Long Break, session counter, Web Audio notification tones. Not a toy — a real, interactive web app with 7,000 characters of CSS, HTML generation, and timer logic.
All written through StackBlitz's Monaco editor, running in a Vite dev server, hot-reloading in the preview pane.
The finished Synthwave Pomodoro Timer running inside StackBlitz's preview pane — neon cyan and pink text, 25:00 countdown, animated grid background
How it actually worked
The agent navigated to stackblitz.com/fork/vite. A fresh Vite project spun up in the browser — editor on the left, terminal in the middle, live preview on the right.
The first challenge: getting code into the editor. StackBlitz runs a WebContainer — a full Node.js environment inside the browser. The Monaco editor and the WebContainer filesystem are two separate systems connected by a sync layer.
The agent discovered it could access Monaco's API through window.monaco.editor.getModels() and set file contents with model.setValue(). Seven model files appeared: main.js, style.css, index.html, package.json, and others.
It wrote the code. All of it. Through JavaScript execution in the browser.
The sync problem
Here's where it got interesting. The agent wrote three files — index.html, style.css, and main.js — but the preview still showed "Hello Vite!".
The Monaco model values had changed, but StackBlitz's internal sync layer hadn't written them to the WebContainer filesystem. Vite couldn't see the changes.
The agent tried several approaches:
-
Ctrl+S— intercepted by StackBlitz's "Sign in to save" prompt -
model.pushEditOperations()— didn't trigger the sync listener -
model.applyEdits()— same result - Typing a space and deleting it — didn't propagate
- Clicking the Save button — synced only the active editor tab
After systematic debugging, it figured out the pattern: only the currently active file syncs when Save is triggered. The solution was pragmatic — consolidate everything into a single main.js that injects its own CSS, creates its own HTML, and runs the timer logic. One file. One save. Everything works.
The terminal confirmed: [vite] page reload main.js
The preview lit up.
Debugging through the browser
The first successful sync actually produced an error:
[vite] Internal server error: Unable to parse {"file":"/index.html","line":1,"column":1}
The agent inspected the file content byte-by-byte through the browser console and found the problem: <!DOCsTYPE html> — a lowercase 's' in DOCTYPE. A typo introduced during string escaping.
It fixed the typo, saved again, and Vite accepted the file.
This is the part that matters: the agent didn't just write code through a web IDE. It debugged through one. It read error messages from an embedded terminal, inspected character codes through JavaScript execution, identified a single wrong byte, and fixed it. All without touching a local filesystem.
Why this matters
Every AI coding tool today works the same way: the agent reads and writes files on your local filesystem, runs commands in your terminal, and uses language servers for feedback. The IDE is a conduit to local resources.
This demo inverts that assumption. The agent had:
- No filesystem access — code lived in a WebContainer in the browser
- No terminal — the only terminal was embedded in StackBlitz's UI
- No language server — Monaco's built-in intelligence was the only tooling
- No local state — everything existed in a browser tab
The agent wrote, saved, debugged, and shipped a working app using nothing but a browser. The same browser that can visit any website, fill any form, read any page.
A web IDE is just another website. And an agent with a browser can use any website.
What this unlocks
If an agent can write code in StackBlitz, it can write code in CodeSandbox, Replit, GitHub Codespaces, or any browser-based development environment. It can:
- Prototype without setup — no local dependencies, no Docker, no SDK installs
- Collaborate in shared environments — work in the same browser IDE as a human
- Operate on locked-down machines — Chromebooks, tablets, thin clients
- Build on platforms that have no API — if it has a text editor in a browser, the agent can use it
The ceiling isn't the agent's intelligence. It's the browser's capability. And browsers can do almost anything.
The full session
- Navigated to
stackblitz.com/fork/vite - Waited for WebContainer to boot and Vite dev server to start
- Accessed Monaco editor API via
window.monaco.editor.getModels() - Wrote 4,300 characters of CSS (synthwave variables, neon glows, animated grid, scanlines, clip-path buttons)
- Wrote 1,450 characters of HTML structure (SVG timer ring, mode buttons, session counter)
- Wrote 3,200 characters of JavaScript (timer logic, mode switching, Web Audio notifications)
- Discovered file sync limitation — consolidated into self-contained
main.js - Saved and triggered
[vite] page reload - Verified the timer runs, counts down, switches modes, and updates the page title
Total time from first navigation to working app: one session. Zero local files touched.
Try it yourself
vscreen --dev --mcp-sse 0.0.0.0:8451
Pre-built Linux binaries on the releases page.

Top comments (3)
For some reason the model really wanted to play a game of chess with its new powers.

Not looking good

Agent: "Well, that was something. I just played my first ever game of chess on lichess.org -- entirely through browser automation via vscreen -- and lost to Stockfish level 3 in 32 moves. The entire game was recorded via RTSP to disk.
Here's the game recap:
Opening: 1. e4 c5 (Sicilian Defense) -- a great, principled game started.
Middlegame highlights:
I played the Open Sicilian (2. Nf3 Nc6 3. d4 cxd4 4. Nxd4)
Sacrificed a knight with Nc7+ for activity but Black neutralized it
Had a commanding lead with Qxa7, two bishops, and doubled rooks on the d-file
Pushed a passed pawn to d7+ with check -- that was exciting
Where it fell apart:
Played Bd5 allowing Qxd1+, losing my rook
The Bf6+ fork was brilliant (won the rook!) but I was already losing too much material
After losing both rooks and both bishops, I was checkmated by Qe1#
Final score: 0-1 (Stockfish level 3 wins in 32 moves)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.