Build on the real canvas.

Real components, live bindings, Tailwind theming — photographed from the builder you ship with. An AI drives the same UI.

// no credit card · one real page, free forever

app.codelab.app
Component

Real libraries. Plus the ones you build.

Drop in production component libraries, then author your own on the canvas and reuse them everywhere. Nesting rules keep the markup valid.

builder · palette
Component palette in the Codelab builder
Page

Compose a page. Ship that page.

Drag on the canvas, nest with real markup rules. The canvas renders through the exact same pipeline as production — what you see is what ships.

builder · canvas
Building a page on the Codelab canvas
Bind · live

Any prop can be a live expression.

A value is a literal or a {{ }} expression resolved at render. Change the store once — every bound prop updates. No glue code.

builder · inspector
Inspector with a live expression binding in the Codelab builder
Theme · ship

Theme it like real code, because it is.

Tailwind tokens on the canvas, then promote to production on your domain. No editor-vs-site drift, and no eject hatch — there is nothing to escape.

builder · theme
Codelab builder chrome — the same UI that ships
Built with Codelab

Real, shipped, running

Published apps, not a feature list. Click through to the live site.

No featured apps yet — check back soon.

Touch it

These are the real builder panels

Not mockups. The same palette, store, theme, and binding layer you get in the product — click around.

palette · components
store · user · state + actions
theme · tokens · live editor
app.codelab.app / homeLive
Heading
Hi, Ada 👋
children ← {{stores.user.name}}
Inspector · Heading
children{{stores.user.name}}
size2xl
weightbold
Store · user
name"Ada"
plan"free"
change the store once — every bound prop re-renders. no wiring.
No eject

Every builder eventually says no.
Ours doesn't.

Codelab runs on real code from the first click, so there's no wall to hit and nothing to escape.

eject → own the codeno eject, because no dead end
From the blog

Notes from building Codelab

Engineering

The binding layer is the spine

Every prop on the canvas is a live expression. Here’s what falls out once your UI reads straight from state.

Jul 2026 · 6 min read
Product

No eject, because no dead end

Real code underneath means the ceiling never arrives — and you never have to leave the builder to break through it.

Jul 2026 · 4 min read
AI

Give an agent your builder tools

The same MCP tools you use by hand, handed to an AI: scaffold real elements, bind state, ship — live on the canvas.

Jun 2026 · 5 min read
Start free

Build something with no ceiling

One real page, free forever. Bring an AI, or build it yourself.