Design with your real components

A Figma-like canvas for your React app. Every layer is your code, your agent edits it through MCP, and every change ships as a pull request.

Star on GitHub
Home● Live · page.tsx
Truecanvas · playground
The Truecanvas editor with a SessionRow component selected and its typed props in the design panel
Works with

Between your stack and your agents

Truecanvas runs next to your Next.js app and speaks MCP. Your components render as they are, and the agents you already use can see and edit them.

+ any MCP client
Next.jsReactTailwindTypeScriptClaude CodeCursorGitHub

A design tool where the design is the code

Design tools draw pictures of your product. Someone rebuilds them in code, and the two drift apart. Truecanvas skips the picture: you design with the components you ship.

The usual way

Two sources of truth. Every change is made twice, and they never quite match.

With Truecanvas

One source of truth: your repo. What you design is what ships.

Sessions
Review release readiness2m
Draft the Q4 changelog3h
Migrate billing webhooks5h
Fix the flaky billing test1d

Layers are your components

Every layer is a real instance. Props become controls from their TypeScript types, so a status union is a dropdown.

app/page.tsx
- <h1 className="text-4xl">
+ <h1 className="text-6xl">
Design with your

The code is the document

Edits are small patches to your TSX that keep your formatting. Your editor and the canvas stay in sync both ways.

Home● Live · page.tsx
AcmeInvoices that pay themselvesSend, chase and reconcile in one place.Start free
Explore a copyApply to page

Design on your real pages

Link a page and its layers are your page.tsx. Explore a copy for bold ideas, then apply it back as a clean diff.

LaunchPlaying
Launch week, day one
<MeshGradient speed={0.6} /><TextAnimate effect="words">

Motion and shaders

Scroll reveals, text animations and Paper shaders are components in your repo. Press play on a frame to watch them run.

Running in your app in about a minute.

Needs a Next.js App Router project with Tailwind, and Node 20 or newer. Production builds are untouched.

  1. Run it from your project root. It asks once, then adds a dev dependency, wraps next.config and writes a canvas with your homepage on it.

    ~/acme-webzsh
    $ npx truecanvas
    
      ◆ Truecanvas v0.1.0
    
      This adds Truecanvas to acme-web: a dev dependency, a wrapper in next.config,
      a canvas script and a canvas with your homepage.
    
      ✓ Wrapped next.config.ts with withTruecanvas()
      ✓ Added the "canvas" script (npm run canvas)
      ✓ Ignored /app/truecanvas/ in .gitignore
      ✓ Canvas folder canvas
      ✓ Truecanvas added to .mcp.json
    
  2. Your page is already on the canvas. Linked frames render the real route, desktop and phone side by side. Edits go straight to page.tsx and the components it uses.

    The Truecanvas editor showing this website's homepage as two linked frames, desktop and iPhone 16
    This page, open in Truecanvas.
  3. Commit from the Git panel. Every change is listed by frame in plain words, and it suggests a branch so nothing lands on main by accident.

    Homedesign/home-hero
    • Changed h1 text to “Design with your real components”
    • Restyled h1 (+text-6xl +tracking-tight -text-5xl)
    • Added a fade-up reveal to Features (claude)
    Home: restyle the hero, add a revealCommit design changes

Your agent gets the same canvas you do.

Truecanvas is an MCP server with no model inside. Claude Code, Cursor or any MCP client reads your frames, edits the real files and screenshots its own work. Its cursor shows up on the canvas while it does.

Agent setup
claude · ~/acme-web3 files changed
> the selected cards feel loose. tighten them and check on a phone
⏺ truecanvas - get_selection (MCP)
⎿ 3 nodes: PricingCard in Pricing (components/pricing-card.tsx)
⏺ truecanvas - set_class_name (MCP)(id: "…/pricing-card.tsx#9:4")
⎿ Restyled PricingCard (+gap-3 +p-5 -gap-6 -p-8)
⏺ truecanvas - create_frame (MCP)(name: "Pricing mobile", device: "iphone-16")
⎿ Added frame Pricing mobile
⏺ truecanvas - screenshot_frame (MCP)(frame: "Pricing mobile")
⎿ [image 393×852]
⏺ Cards use 20px padding now. On an iPhone 16 they stack cleanly and the Pro CTA stays above the fold.
Pricing
Hobby$0/moOne project, local onlyStart
Pro$12/moUnlimited projects and PR previewsUpgrade
Pricing mobile
Hobby$0/moOne projectStart
Pro$12/moPR previewsUpgrade
Claude
Tools include

get_canvas · get_selection · get_design_tokens · insert_component · insert_jsx · set_text · set_class_name · wrap_nodes · create_variants · add_animation · explore_copy · apply_to_page · screenshot_frame · list_comments · resolve_comment and more

Design review happens in the pull request.

Canvases are .tsx files.
Frames, comments and linked pages live in canvas/ next to your code, so they branch and merge like everything else.
Commit and open the PR from the canvas.
It renders every changed frame before and after, and writes the description for you.
Reviewers open the PR in Truecanvas.
One click checks out the branch and shows the real thing, not an export of it.
How teams work with Truecanvas
Home: restyle the hero, add a reveal #42
Openines wants to merge into main from design/home-hero

Design changes

Made in Truecanvas.

Home home

BeforeAfter
Design in the browserA Figma-like canvas for your React app. Every layer is your code.Get started
Open sourceDesign with your real componentsA Figma-like canvas for your React app. Every layer is your code.Get started
  • Changed h1 text to “Design with your real components”
  • Restyled h1 (+text-6xl +tracking-tight -text-5xl)
  • Set variant to primary on Button
  • Added a fade-up reveal to Features (claude)
All checks have passed3 files changed

Built by you, or your agents

Open source and MIT licensed. Runs on your machine next to your app, with nothing to sign up for.

Star on GitHub

New app? npm create truecanvas