Blank · Start blank. Finish shipped.

Describe a site. Get one you own.

Real React, written into a real project. Read every file, connect your own database, point your own domain, and clone the repository whenever you want it elsewhere. Nothing here is a preview you cannot take with you.

100 credits free · no card

Before

A blank page.

No template to fight, no theme to override, no starting point somebody else chose for you. This is the part every other builder skips past.

Phase one

You describe it once.

One sentence, in plain language. No wireframe, no component picker, no brief. What it does not ask for is as much the point as what it does.

Phase two

It writes real files.

React and TypeScript into a real folder structure, against mock data through a seam that later talks to a real database. Open any file and read exactly what was written.

Phase three

Then it stops and asks.

The moment it needs to store something it halts and submits the routes and the tables for approval. There is no tool that can approve this — only a person. A frontend built against a schema nobody agreed to has to be rewritten when the real one arrives.

Phase four

And it ships.

Row Level Security on every table, metadata and a sitemap from the route table, and an accessibility audit measured inside the running page. Then a live URL, your domain, and the whole project pushed to your own repository.

kissa.blank.buildLive

Builder

Skill · design-system

Wrote app/layout.tsx

Wrote app/page.tsx

Saved assets/hero.jpg

propose_architecture

Applied 3 tables · RLS

Wrote seo.json · sitemap

Audit · 0 issues

Kissa

A room built around a pair of Altec horns and four thousand records. Bandra West, from six.

Reserve a seat

Waiting for you

3 tables — sessions, bookings, records. Row Level Security on each.

ApproveChange it

01What you keep

Most builders hand you a preview. This hands you a project.

Every file, readable

React and TypeScript in a real folder structure. Open the Code tab and read exactly what was written — no compiled bundle, no black box, and the editor saves back.

Your database

Connect your own Supabase account. Tables land in your organisation with Row Level Security on every one, and you keep the data when you leave.

Your domain

Publish to a subdomain, or point a domain you already own. Hosted on our servers, or deployed to your own Cloudflare account for nothing.

Your repository

Push the whole project to GitHub in one commit, assets included. Nothing here is a preview you cannot take with you.

02Phase three of five

Then it stops and asks you.

The moment it needs to store something it halts and submits the routes and the tables for approval. There is no tool that can approve this. Only a person. A frontend built against a schema nobody agreed to has to be rewritten the moment the real one arrives — which is why so much generated software feels like a demo that cannot be finished.

The order is fixed in code rather than requested in a prompt, and the gate is not automatable: the build engine has no tool that can approve a schema.

Waiting for you

3 tables proposed, each with Row Level Security and a policy in the same statement.

  • sessions
  • bookings
  • records
ApproveChange it

Anything not in the approved plan is refused rather than warned about.

03For the reader who will check

It writes code you would have written.

No compiled bundle, no proprietary component format, no black box. Typed React in a conventional folder structure, with the design and accessibility rules enforced by skills the build engine reads before it writes anything.

  1. 01FrontendRoutes, components, real copy, motion.
  2. 02PlanIt stops and asks before it stores anything.
  3. 03BackendOnly the tables you approved, each with Row Level Security.
  4. 04SEOMetadata and a sitemap from the route table.
  5. 05AuditContrast, labels and tap targets, measured in the page.
app/sessions/page.tsx
import { useCollection } from "@foundation/data";
import { revealOnScroll } from "@foundation/motion";

type Session = {
  id: string;
  artist: string;
  startsAt: string;
};

export default function Sessions() {
  const { data, loading } = useCollection<Session>("sessions");

  if (loading) return <SessionsSkeleton />;

  return (
    <ul className="grid gap-4">
      {data.map((session) => (
        <li key={session.id} className="reveal">
          <h3>{session.artist}</h3>
          <time dateTime={session.startsAt}>
            {formatDate(session.startsAt)}
          </time>
        </li>
      ))}
    </ul>
  );
}

And it is safe to run

Every generated site is served from its own hostname, and this application is unreachable there. So nothing a generated page contains can read your session — or anybody else’s. How the isolation works.

04Hosting and price

We host it, or you do.

Hosting is included on every plan, not sold separately. Paid plans add your own domain, and the top two give you a dedicated instance nobody else’s traffic can affect — or deploy to your own Cloudflare account and pay us nothing for it.

Shared hosting

Served from a blank.build subdomain on shared infrastructure.

Included free

Shared hosting, your domain

Your own domain on our shared infrastructure. Fast, and it shares capacity with other sites.

From ₹499 a month

Private hosting

A dedicated instance for your sites. Predictable performance that nobody else's traffic can affect.

From ₹1,999 a month

Start on 100 free credits.

One credit is one build on a fast model. No card, and paid plans from ₹499 a month when you need more.

Compare plans

Start with a blank page.

100 credits and 3 projects, hosted on a subdomain. Enough to finish one real site and decide for yourself.