Guide

The AI App Generator That Opens Its Own App in Chromium Before Saying Done

Lovable, v0, Bolt, Create, Base44. They all write code and hand it to you. mk0r does one more thing: the agent runs your freshly generated app inside a real browser and checks it before the session ends. Here is how that actually works, and why nothing else in the top SERP mentions it.

m
mk0r
7 min
4.8from 10K+ creators
No signup
Agent self-tests in real Chromium
Snapshot boot skips ~11s

The one capability every other AI app generator skips

If you look at the top results for "ai app generator" today, the pitch is the same across the board: describe your idea, receive a working app. The part nobody talks about is the step between "agent stops typing" and "the thing actually loads in a browser." In most tools, that step is you. You open the preview, notice the button is dead, type a follow-up, wait, repeat.

mk0r closes that loop inside the same session. Every VM session comes with a Playwright MCP server already running, on the same network as the dev server, already wired to the agent. When the agent thinks it is done, it can drive real Chromium against its own output. If something throws in the console, or a selector is missing, the agent sees it the same way you would, and keeps going.

This is not an add-on or a second pass. It is baked into the default shape of a session.

What actually runs when you hit generate

Open src/core/freestyle.ts and you can see the VM topology in one place. A single HTTP proxy on the public VM host fans requests out to five backing services by URL prefix. This is the anchor that makes everything else possible.

One URL, five services

  • /acp/*→ port 3002, the ACP bridge that spawns the claude-agent-acp subprocess.
  • /mcp/* and /sse→ port 3001, the Playwright MCP server the agent uses to drive Chromium.
  • /screencast→ Chrome DevTools Protocol WebSocket streaming frames from the agent's tab.
  • /input→ CDP WebSocket that injects your keyboard and mouse events into the same tab.
  • /vnc→ websockify bridge for a full noVNC desktop if CDP is blocked.
  • everything else → port 5173, the Vite dev server serving the generated app.

The two that matter for self-testing are port 3001 and port 3002. The agent on port 3002 talks to the Playwright MCP on port 3001 over loopback and drives a real Chromium instance that is already pointed at the Vite dev server on port 5173. All three ride in the same VM, so there is no network boundary to cross and no extra auth to configure. The startup script pins @playwright/mcp@0.0.70 and @agentclientprotocol/claude-agent-acp@0.25.0 so the behavior is reproducible across sessions.

Generate one and watch the agent test it

No account needed. Describe the app, open the /screencast tab, and you will see the agent clicking its own buttons.

Start Generating

Why it still feels instant

A VM with Node, Vite, Chromium, Playwright MCP, and the ACP bridge takes real time to cold boot. The first time this stack comes up it takes minutes, not seconds. That is not a number anyone wants to wait for when they typed a one sentence idea.

So mk0r does this once, takes a live snapshot of the running VM, and stores the resulting snapshotId in Firestore. The key is a SHA of the exact startup spec (base image setup, startup script, proxy script, ACP bridge script). Subsequent sessions restore from that snapshot with every service already listening, and skip the roughly 11 second service boot entirely. If any of those four scripts change, the hash changes, a GitHub Action rewarms the snapshot, and the new hash becomes the cached one.

The practical effect: the "instant" feel is not a trick with a smaller model. It is a cached image of the full stack, including the browser the agent will use to test its own work.

Two modes, one philosophy

Quick mode

Streams a single self-contained HTML file for small tools and utilities. No VM. Good for a calculator, a dice roller, a landing page, anything that does not need a framework. Under 30 seconds.

VM mode

Spins up a Freestyle VM from the cached snapshot. Vite and React and TypeScript are already running. The Claude agent works through the ACP bridge and drives Chromium through Playwright MCP. This is the mode that self-tests.

How this changes the prompting loop

When the agent can verify its own output, the prompts you send change shape. You stop writing small corrections like "the submit button doesn't do anything" because the agent already noticed and fixed it. You spend your turns on product decisions instead: "make the timer count down instead of up," "add a second tab for stats," "persist to localStorage."

It also means fewer dead ends. An AI app generator that cannot see its own output will confidently ship a page where the canvas element is 0 by 0 pixels. An agent with a real browser attached can see the layout collapsed to zero and try again.

Frequently asked questions

What makes mk0r different from Lovable, v0, Bolt, or Base44?

Most AI app generators write a file and call it done. mk0r runs the generated app inside a Freestyle VM that also hosts a Playwright MCP server. The Claude agent can open its own output in headless Chromium, click around, check the DOM, and fix what it sees before handing the session back to you. The other tools rely on you to notice breakage.

Do I need an account or a credit card to use mk0r?

No. Go to mk0r.com, type or speak a description, and the build starts. There is no email gate, no trial credit card, no onboarding flow. This is intentional and it is why we exist: zero friction from idea to running app.

How does the VM boot fast enough to feel instant?

The first cold boot of a full Node plus Vite plus Chromium plus Playwright MCP plus ACP bridge VM takes several minutes. After that first boot, mk0r takes a live snapshot of the running VM and stores the snapshot ID in Firestore, keyed by a hash of the startup spec. Subsequent sessions restore from that snapshot and skip the roughly 11 second service boot entirely. Change the spec and a CI workflow rewarms the snapshot before anyone hits the cold path.

What is actually running inside each VM?

One HTTP proxy fans one public URL out to five services. Requests to /acp/* go to port 3002, the ACP bridge that spawns the claude-agent-acp subprocess. Requests to /mcp/* and /sse go to port 3001, the Playwright MCP server the agent uses to drive Chromium. /screencast and /input are Chrome DevTools Protocol WebSockets for live video and input injection. /vnc is websockify for a full noVNC fallback. Everything else proxies to the Vite dev server on port 5173. This lives in src/core/freestyle.ts.

Can I watch the agent work?

Yes. The /screencast WebSocket streams CDP frames from the Chromium instance the agent is controlling, so you see the same tab the agent sees. If you want to poke the app yourself, /input sends keyboard and mouse events into that same tab. If CDP is blocked on your network, /vnc gives you the full desktop.

What exact versions of the agent and Playwright MCP does mk0r pin?

The VM startup script installs @playwright/mcp@0.0.70 and @agentclientprotocol/claude-agent-acp@0.25.0 globally before anything else runs. Pinning matters because the snapshot hash includes this script verbatim. A version bump rebuilds the base image.

What happens if the agent's first build is broken?

Because the agent has Playwright MCP available, it can run Playwright checks on its own output inside the same VM before surfacing it to you. If a selector is missing or the page throws in the console, the agent sees it and iterates. This is not a separate review step; it is the same session. You get fewer turns where you have to say 'the button doesn't do anything' because the agent already clicked it.

Do I get real code or a proprietary format?

Real code. Quick mode produces a single HTML file with inline CSS and JS that you can download and host anywhere. VM mode produces a Vite plus React plus TypeScript project with the full source tree visible. There is no lock-in format, no runtime you must pay to keep using.

Try the AI app generator that verifies its own work before handing it to you.

Generate an App