Workspace Prompt project pull request live

From idea to
working project.

Versatil is an AI-assisted workspace for building web products. Describe what you want to build, get a first working version, and keep going on its files, design, preview and code — all in one place.

  • You keep the code
  • Real branches & pull requests
  • Responsive preview
  • Deploy when you say so
New project · Versatil

Your description travels with you into the workspace. Nothing is generated until you say so.

Works with React + Vite Next.js Vanilla HTML GitHub Cloudflare Pages
The workspace

One screen where the project actually lives

Files, editor, AI chat, responsive preview, review panel, Git and deploys — side by side, not scattered across five tools.

Seven panels, one project

Switch files, ask for a change and watch it stream in, resize the preview, accept or reject a diff, branch and commit, open the pull request, publish. Without leaving the page or changing tools.

  • Editor
  • Chat
  • Preview
  • Changes
  • GitHub
  • Deploy
Open the workspace
How it works

Eight steps, one continuous thread

No hand-off between “the AI part” and “the real part”. The project you get in step 2 is the same project you deploy in step 8.

  1. STEP 01

    Describe the idea

    One prompt in plain language. Pick a framework and a model, or keep the defaults.

  2. STEP 02

    Versatil builds v1

    A real file tree with components, styles and config — not a screenshot, not a one-page dump.

  3. STEP 03

    The workspace opens

    Files, editor, chat, responsive preview and a review panel — arranged, not stacked.

  4. STEP 04

    Ask for changes

    “Make the hero calmer.” Versatil edits the files and tells you exactly which ones it touched.

  5. STEP 05

    Edit it yourself

    Full manual editing with syntax highlighting, tabs, formatting and keyboard shortcuts.

  6. STEP 06

    Import what exists

    Bring in a GitHub repository — private ones included — and keep working on it here.

  7. STEP 07

    Branch, commit, PR

    Proper version control: named branches, reviewed commits and pull requests your team can read.

  8. STEP 08

    Publish

    Deploy to Cloudflare Pages manually, or automatically after the pull request is merged.

The friction

Building a site is eight jobs wearing one hat

Every one of them is a place to stall. Versatil collapses them into a single workspace you can actually finish in.

The usual way
Define the idea
Choose the technology
Create the initial structure
Write the code
Design the interface
Set up GitHub
Prepare a deployment
Keep the project alive
With Versatil

Describe it. Then keep going.

One prompt starts a real project
Files and code stay editable by hand
Preview reacts as you save
Git is built in, not bolted on
Publishing is one deliberate click

You start from a description and move forward to a real, editable, versioned project — without changing tools on the way.

Product surfaces

Not a generator. A place to work.

Versatil combines AI generation, code editing, visual design, responsive preview, version control, collaboration and deployment. The AI writes the first version — you keep control of everything after that.

AI chat that shows its work

Streaming answers, cancel and retry, per-message feedback, file attachments and @src/App.tsx references. Every reply lists the files it touched, and you can jump straight into any of them.

IdleProcessing RetryingCompleted FailedCancelledLocal fallback

File explorer

Create, rename, duplicate and delete with confirmation. Modified and remote-sync markers on every row.

src/
  components/
    Hero.tsx M
    Plans.tsx A
  styles/
index.html

Blocked by design: ../ paths, absolute paths, file/folder collisions.

Editor

TS, TSX, JS, CSS, HTML, JSON and Markdown with tabs, search, formatting and a save state you can trust.

SavedUnsavedSaving

Responsive preview

Desktop, tablet and phone widths, zoom, refresh, fullscreen and a real URL path.

Review panel

Created, modified and deleted files with real diffs. Accept or reject one by one — or accept all as a single atomic operation that never silently reverts a newer edit.

  • Destructive changes ask first
  • Truncated diffs say they are truncated

GitHub, first class

OAuth plus a GitHub App that works with private repositories. Inspect the tree, import, branch, commit, open pull requests and watch the sync state — from inside the workspace.

Branches Commits Pull requests Private repos

Deployments

Cloudflare Pages, Vercel or GitHub Pages, with build logs, domain status and a public URL that only appears when it is real.

Settings that matter

AI provider and latency, GitHub installation, appearance and language, deployments, storage, export and account.

The difference

The AI writes v1. You own everything after that.

Most tools hand you a result. Versatil hands you a project: files you can read, history you can trace, and a publish button you press yourself.

Comparison between a typical AI page generator and Versatil
What you actually getTypical AI page generatorVersatil
Source code you can read and keep Export, sometimes Always, file by file
Hand editing in the same place Regenerate and hope Full editor with tabs
Version control Undo history Branches, commits, pull requests
Existing projects Start from zero Import a repo, private included
Review before it lands Changes applied silently Diff, accept, reject
Deployment Locked to one host Cloudflare Pages, Vercel, GitHub Pages
When the model is slow or down Spinner forever Local starter, clearly labelled
Honest by default

A tool you can trust is a tool that tells you the truth

Versatil names every state it can be in, and never dresses one up as another. If the preview is a projection, it says projection. If the model timed out, it says so.

What we refuse to show

“Project ready ✓”
…while rendering a static projection of a project that never compiled.

Optimistic success messages are the fastest way to lose a user's trust — and the slowest bug to find.

What Versatil says instead

“Versatil is using the local starter because the remote model took too long.”

Plain language, the reason, and a retry when retrying can help. No success message is shown if no file changed.

Every one of these has a designed screen: what happened, what you can do, and a retry when retrying helps.

Who it is for

Made for people who want to finish

Versatil meets you wherever your comfort with code ends — and doesn't make that the ceiling of what you can ship.

Designers

Turn a layout you can already see in your head into a real product, with the CSS still in reach.

Founders

Validate an idea this afternoon instead of booking a week of setup you may never use.

Developers

Skip the scaffolding ritual. Land in a project that already has structure, then take the wheel.

Small teams

Iterate through branches and pull requests without standing up infrastructure for three people.

People who don't code

Describe what you want in your own words. The code is there when you're curious, not in your way.

Maintainers

Import a project that already exists and improve it with the same tools, on the same branch model.

Craft

The parts nobody demos, built in anyway

A workspace lives on a laptop at 1440px and on a phone in a queue. Both have to be good.

Genuinely responsive

Nine breakpoints, from a 320px phone to a 1440px desktop. On mobile, Files and Preview open as drawers that never fight each other, and the editor never steals your keyboard on arrival.

44×44 touch targets16px inputs safe-area insetslandscape horizontal overflowhover-only actions

Accessible on purpose

Real labels, not placeholders pretending to be labels. Dialogs trap focus, restore it on close and answer to Escape. Errors announce themselves; states report quietly.

aria-currentaria-selectedaria-pressed aria-expandedrole="dialog"aria-modal role="alert"role="status"

WCAG AA contrast, complete keyboard navigation, no nested buttons or forms.

Fast where it counts

Settings, Publish, Command Palette, the model selector, the preview and the editor all load on demand. Typing a character doesn't recompute the project, redraw the preview, or rewrite local storage.

code splittingdebounced writes local editor statedeferred persistence virtualized file lists

Secrets stay server-side

The frontend ships public identifiers only. Provider keys, client secrets and signing keys never reach the bundle — authenticated calls go out with cookies, not tokens pasted into JavaScript.

VITE_GOOGLE_CLIENT_IDVITE_GITHUB_CLIENT_ID VITE_TURNSTILE_SITE_KEYVITE_SENTRY_DSN
GITHUB_PRIVATE_KEYGOOGLE_CLIENT_SECRET STRIPE_SECRET_KEYRESEND_API_KEY
For developers

One typed client. No calls scattered across components.

Every request lives behind a single API client, with errors translated into sentences a user can act on — and technical detail kept in the logs where it belongs.

GET/api/auth/me
GET/api/auth/google/start
GET/api/auth/github/start
POST/api/auth/logout
GET/api/github/setup
GET/api/github/installation
GET/api/github/repositories
GET/api/github/repositories/:owner/:repo/tree
POST/api/github/repositories/:owner/:repo/import
POST/api/github/repositories/:owner/:repo/files
POST/api/github/repositories/:owner/:repo/branches
POST/api/github/repositories/:owner/:repo/pull-requests
POST/api/ai/generate
POST/api/ai/modify
GET/api/generations/:id/events
POST/api/generations/:id/cancel
GET/api/models
GET/api/health
types.ts
type Project = {
  id: string
  name: string
  framework: 'React + Vite' | 'Next.js' | 'Vanilla HTML'
  status: 'ready' | 'building' | 'draft' | 'error'
  github?: {
    repository?: string
    branch?: string
    syncState: 'not-connected' | 'synced' | 'pending'
  }
}
client.ts
// every authenticated call, one place, cookies attached
export async function api<T>(path: string, init?: RequestInit) {
  const res = await fetch(path, { ...init, credentials: 'include' })
  if (!res.ok) throw await toUserError(res)
  return res.json() as Promise<T>
}

UI components, API client, state and types stay in separate layers — so a change on the server never means rebuilding the interface.

Questions

The ones people actually ask

You get the project: a normal file tree you can read, edit, download as a ZIP, or push to your own GitHub repository. Versatil writes the first version — it doesn't hold it hostage afterwards.
No. You can work without an account, and your files stay in your browser. Connect GitHub when you want branches, commits, pull requests or a repository to import — Versatil will tell you clearly when a provider isn't configured.
Yes. The Versatil GitHub App is designed to work with private repositories once it's installed on the account or organization that owns them. If the App isn't installed yet, the repository is shown as “App not installed” rather than silently failing.
Versatil falls back to a local starter and says so, in those words. You'll see the generation state — queued, processing, retrying, failed, cancelled — instead of an ambiguous spinner, and you can cancel or retry at any point.
For Vanilla HTML and React + Vite projects it runs in an isolated runtime with your real CSS, and refreshes on save. When a project uses imports the runtime can't resolve, Versatil renders a safe design projection and labels it as one — it never calls a projection “ready”.
That's the point. Chat and the editor operate on the same files. Use whichever is faster for the change you're making, and review both the same way in the Changes panel.
Cloudflare Pages first, with Vercel and GitHub Pages as configured providers. Deploy manually, or automatically once a pull request is merged into your production branch. The public URL appears after a successful build — never before.

Describe an idea.
Get a project you can keep.

Versatil turns a sentence into an editable, viewable, version-controlled web project — and stays useful long after the first version.

No account? Start anyway — your files stay in this browser until you connect one.