The No-Editor App Building Floor
Most no-code copy sells the ceiling: build mobile apps in minutes, ship anything, no limits. The interesting question is the opposite one. If you commit to never opening a code editor, what is the floor? The realistic minimum you can ship. For mk0r it is much higher than the no-code category implies, and the specifics live in the open repo, not in a marketing deck.
Direct answer (verified 2026-05-14)
The floor of no-editor app building on mk0r.com is a working full-stack web app on a real React + TypeScript stack: Vite + Tailwind v4 at /app in a sandboxed Chromium, with PostHog, Resend, Neon, and a GitHub repo already provisioned, all wired up before your first prompt. You get ANON_TURN_LIMIT = 6 anonymous turns (src/app/api/chat/route.ts line 23) running on Claude Haiku 4.5 (FREE_MODEL = "haiku" at src/app/api/chat/model/route.ts line 5). That is the literal floor, not the ceiling.
The category sells the ceiling. The floor is more useful.
Read the homepages of any ten AI no-code tools and you will see the same shape of promise: build any app, in minutes, without writing code. The ceiling. It is a wide promise on purpose, because the audience the page is fighting for is everyone with an idea.
That copy is useless if you are the person standing at the beginning of the flow, deciding whether to commit to a no-editor path at all. The question that decides commit is the floor: if I take this seriously and never open a code editor, what is the minimum thing I will end up holding when the session is done? Is it a screenshot of a mockup? A vendor-locked artifact? A real codebase someone could fork? An app that has a real database row when it claims to?
The floor is a more honest description of a tool than the ceiling because it does not ask the reader to trust ambitious framing. It asks the reader to look at what is already wired in, before any prompt fires.
What is wired in before turn one
The system prompt that scopes the agent on every new mk0r session is one paragraph and lives at line 184 of src/core/e2b.ts. Verbatim:
"You are an expert app builder inside an E2B sandbox with a Vite + React + TypeScript + Tailwind CSS v4 project at /app. The dev server is running on port 5173 with HMR. You have Playwright MCP for browser testing. Read your CLAUDE.md files for detailed workflow, coding standards, and memory instructions."
That one paragraph is the floor of the stack. Vite, React, TypeScript, Tailwind v4, HMR, and a Playwright-driven browser attached to the same sandbox. None of it is mk0r-specific syntax. None of it is a proprietary export format. If you never open an editor, that is still the stack the agent is writing into, and if you outgrow the no-editor path you take the repo and you go.
The four backing services come from src/core/service-provisioning.ts. The provisionServices function on line 346 walks PostHog, Resend, Neon, and GitHub in order, collects credentials, and buildEnvFileContent on line 393 writes them into /app/.env before the first user turn arrives. The agent is told (in the project CLAUDE.md) to read /app/.envfor pre-provisioned services before asking the user for any API keys. So when you type “add email signup” on turn two, that is one prompt, not five.
The GitHub org the repo gets created under is hard-coded as GITHUB_ORG = "m13v" on line 52 of the same file. The repo URL lands in /app/.env on turn zero. Your first prompt commits to that repo automatically.
The anchor fact
Six anonymous turns. Claude Haiku 4.5 pinned. A full Vite + React + TypeScript + Tailwind v4 project at /app. Dev server on port 5173 with HMR. A real Chromium driven by Playwright MCP. Four services (PostHog, Resend, Neon, GitHub) auto-provisioned and written into /app/.env before turn one. All free, all anonymous, all verifiable in the open repo at github.com/m13v/appmaker.
The verification loop is part of the floor
The reason the floor goes higher than the category implies is that the agent checks its own work in a real browser before handing control back. The five steps are quoted in the in-VM CLAUDE.md at src/core/vm-claude-md.ts lines 278 to 283:
- Navigate to http://localhost:5173 via Playwright MCP.
- Take a snapshot to verify the DOM rendered correctly.
- Check
browser_console_messagesfor runtime errors. - If the page is blank, verify the component is imported in
App.tsx. - Do not report completion until the browser shows the expected result.
Most one-shot AI app makers stop at step zero, ship the diff, and trust that the next page load will render. mk0r ships the diff, opens the page, looks at it, reads the console, and only hands control back if the render matched intent. From a no-editor reader's point of view that is the difference between “the AI wrote some HTML” and “the AI wrote some HTML and verified it on a DOM”. That second thing is what the floor includes.
mk0r.com
1/6You land on mk0r.com. Anonymous session UUID written to localStorage on first paint. No account form.
Where the floor stops
The point of writing about the floor honestly is to also write about where it ends. Four edges of the floor matter for a no-editor user.
- Interaction state. The snapshot is a DOM check at one moment in time. The agent does not click every button to see what state the app enters next. A bug that only surfaces after three clicks slips through.
- Backend writes. The agent confirms the UI rendered, not that the POST to Resend, Neon, or Stripe actually wrote a row. A green toast is not a green database.
- The six-turn anonymous gate.
ANON_TURN_LIMIT = 6on line 23 ofsrc/app/api/chat/route.tsand the gate fires on line 197. Once you cross it you sign in to keep iterating. Six is enough for a single-screen shipped app, but you should know about it before you commit the first three turns to a vague prompt. - The idle pause.
E2B_TIMEOUT_MS = 3_600_000on line 33 ofsrc/core/e2b.ts. After one hour of inactivity the sandbox is paused. Your work survives byte-exact and reconnecting is automatic, but a non-coder coming back two hours later who sees the preview spinner needs to know that is normal.
A coder reading this catches the first two on instinct. A no-coder needs to be told. That is fine. The point of writing the floor down is to remove the surprise.
The floor versus the no-code category
The honest comparison is not feature-for-feature against Bubble or Glide. Those tools have years of polish in places mk0r does not (drag-drop precision, library size, native mobile output paths). The honest comparison is on the floor specifically.
Most platforms in the AI no-code category give you a floor inside their runtime: their database, their visual canvas, their renderer. The thing the agent produces lives there. If you leave the platform, you export to a format that is not quite a real codebase, or you start over. The floor is high on guardrails and low on portability.
mk0r's no-editor floor is the inverse. The output is a standard Vite + React + TypeScript project. The dev server is a real Vite dev server. The browser checking the work is a real Chromium driven by Playwright. The repo lives at github.com/m13v/<your-app> the moment service provisioning finishes on turn zero. You can clone it and open VS Code on it the same day. The trade is the inverse: more portable, less of the drag-drop polish.
Practical floor: what to actually do in your six turns
Six anonymous turns is not a lot if you spend them wandering. It is plenty if you commit to a shape. A pattern that works for the no-editor reader who has never used the product:
- Turn one. One short noun-phrase sentence describing what the app is. “A flashcard deck for Spanish verbs.” The agent will scaffold the screen and ship a draft. Resist the urge to pack five ideas into the first sentence.
- Turns two and three. Layout fixes. “Make the cards bigger.” “Move the deck-switcher to the top.” These are the cheapest, fastest changes the agent makes.
- Turn four. One real feature. “Add a button that saves my deck to the database.” This is where the pre-provisioned Neon connection earns its place, and where the agent goes from writing UI to writing wiring.
- Turn five. The copy and the polish. “Replace the placeholder text.” “Pick a real accent color.”
- Turn six. Look at the GitHub repo URL that has been in your
/app/.envsince turn zero, and decide whether you want to keep going past the gate.
Six turns is the floor of effort that produces a screen worth sharing. The ceiling, with a paid account and a longer session, is wherever you take it.
Want to map your idea to the floor first?
Twenty minutes, we open mk0r.com together, and I show you what the first six turns can produce for the specific thing you are trying to build. No slide deck.
Frequently asked questions
What is the no-editor app building floor on mk0r?
The floor is the minimum scaffolding that is already in place before you type a single prompt. On mk0r, that is a Vite + React + TypeScript + Tailwind v4 project mounted at /app inside an E2B sandbox, the dev server running on port 5173 with HMR, a Playwright MCP server attached to a real Chromium so the agent can open the page and verify its own work, and four pre-provisioned services (PostHog for analytics, Resend for email, Neon for Postgres, GitHub for source control) written into /app/.env before your first turn. Verbatim from the system prompt at src/core/e2b.ts line 184: 'You are an expert app builder inside an E2B sandbox with a Vite + React + TypeScript + Tailwind CSS v4 project at /app. The dev server is running on port 5173 with HMR. You have Playwright MCP for browser testing.' Service provisioning lives in src/core/service-provisioning.ts.
How many turns do I get before mk0r asks me to sign in?
Six. src/app/api/chat/route.ts line 23 sets ANON_TURN_LIMIT = 6 and the gate on line 197 returns sign_in_required only after that count. The earlier two-turn cap was too tight and 'users were getting blocked before they finished their first prompt cycle' (the comment is on line 20 to 22 of the same file). Six is enough to ship a single-screen app, iterate on the layout twice, fix a copy thing, and add one small feature without ever creating an account.
Which model runs for an anonymous, no-editor session?
Claude Haiku 4.5, pinned. src/app/api/chat/model/route.ts line 5 declares FREE_MODEL = 'haiku' and the route returns 403 with subscription_required if a free user tries to upgrade (lines 17 to 24). The floor model is the fast cheap one, on purpose: the response streams while you read it, and the host absorbs the per-token cost so an anonymous prototype is not metered against you. The ceiling (Sonnet, Opus) is only unlocked for entitled accounts.
Do I really never have to touch code?
If you stop at the floor, no. The agent edits files in /app/src/ for you, the dev server hot-reloads via HMR, and the agent runs its own browser check before reporting done. The five-step verification loop is quoted from src/core/vm-claude-md.ts lines 278 to 283: navigate to http://localhost:5173 via Playwright MCP, take a snapshot to verify the DOM rendered, check browser_console_messages for runtime errors, if the page is blank verify the component is imported in App.tsx, and do not report completion until the browser shows the expected result. You can iterate by sentence and never open a file. The catch is that the floor stops where the agent's blind spots begin (see the next question).
Where does the no-editor floor stop?
Four places. First, interaction state: the DOM snapshot is a moment-in-time check, not a click-every-button test. Second, backend writes: the agent confirms the UI rendered, not that a POST to Resend, Neon, or Stripe actually wrote a row. Third, the six-turn anonymous gate: once you cross ANON_TURN_LIMIT you need to sign in to keep going (src/app/api/chat/route.ts line 197). Fourth, the one-hour idle pause: E2B_TIMEOUT_MS = 3_600_000 in src/core/e2b.ts line 33, after which the sandbox is paused. Your work survives byte-exact, but a non-coder coming back two hours later sees the preview spinner and may not know why. A coder would catch the first two on instinct. A non-coder needs to know the gate boundaries up front.
What does the floor cost me?
Nothing for an anonymous session. mk0r runs Claude Haiku 4.5 against the host's ANTHROPIC_API_KEY, the host absorbs per-token cost, and the four backing services (PostHog, Resend, Neon, GitHub) are auto-provisioned against the platform's accounts at src/core/service-provisioning.ts, not yours. After six turns you sign in, after the first paid feature you pay, but the literal floor (open the tab, ship one screen, save the .html or push to a GitHub repo) is free.
Is the output a real codebase or a vendor lock-in format?
Real codebase. The sandbox boots a local git repo at /app and pushes to a private GitHub repo auto-created under m13v/ (the GITHUB_ORG constant is set on src/core/service-provisioning.ts line 52). A developer friend who looks at it later sees a Vite + React + TypeScript + Tailwind project, not a Bubble export and not a Figma file. If you outgrow the no-editor path, you can clone the repo and open it in VS Code without converting anything.
How is this different from Bubble, Glide, or other no-code tools that also have an AI mode?
Those tools build apps inside their platform's runtime: their database, their visual canvas, their renderer. The no-editor floor is high on UI polish and low on portability. mk0r's no-editor floor is the inverse: portability first. The thing the agent writes is a standard Vite + React + TypeScript project with Tailwind v4. The dev server is a real Vite dev server on port 5173 with HMR. The browser checking the work is a real Chromium driven by Playwright. None of that is mk0r-specific syntax. If a year from now you want to host the app on Cloudflare Pages instead, you take the GitHub repo and you go.
Can the floor actually verify the app, or does the agent just hope it works?
It verifies. The Playwright MCP server is configured in src/core/e2b.ts line 189 to 205, pointing at the in-VM Chromium via CDP on port 9222. The agent calls into it after each set of file edits, takes a DOM snapshot of http://localhost:5173, and reads browser_console_messages before saying it is done. That closes the gap that most one-shot AI app makers leave open: 'looks finished' versus 'is finished on a real DOM'. It does not close every gap (see the floor-stop question above), but it closes the obvious one.
Where can I verify these specifics?
The repo is open source at github.com/m13v/appmaker. Floor model: src/app/api/chat/model/route.ts line 5. Anonymous turn cap: src/app/api/chat/route.ts line 23. System prompt that lists the stack at /app: src/core/e2b.ts line 184. Sandbox idle pause: src/core/e2b.ts line 33. Browser verification loop: src/core/vm-claude-md.ts lines 278 to 283. GitHub org used for auto-created repos: src/core/service-provisioning.ts line 52. Provisioning of PostHog, Resend, Neon, GitHub: same file, function provisionServices on line 346.
The floor is the part you can verify without trusting any marketing. Open the repo and read the lines, or open the tab and use your six turns.
Start a session
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.