In development. The console and the publisher are built and running. There is no extension download and no store listing yet.
Client sites that live in your GitHub and your Cloudflare.
Pick a template, describe the client, and get a complete multi-page site (landing page, privacy policy, terms of use) published to your own Cloudflare from your own GitHub. Then keep editing it by chatting with an AI while you look at the live page.
The unusual part is still what is missing. Your clients' site content, briefs and generated copy never land on Rocket Lab infrastructure: they transit and are discarded. The extension goes further and makes no request to us at all, and the workflow that publishes a site runs in your Actions, not ours.
Who it is for
Agencies that build marketing sites for other people.
It assumes you already work the way an agency works: a GitHub organisation, a Cloudflare account, and a new client every few weeks who needs a small, fast, static site that you will keep editing after launch.
A fit if
- You build sites for clients and hand them over, or hold them on the client's behalf.
- You want each client site in its own repository, with its own history.
- You would rather own the hosting relationship than rent it from a site builder.
- You are comfortable creating one Cloudflare API token and getting it into each site repository's Actions secrets, either by pasting it there yourself or by letting the console seal it for you.
Not a fit if
- You want a site for your own business, with a credit card and no GitHub account. Self-serve site builders do that well, and they do it by hosting the site for you, which is the opposite of the model here.
- You need a content management system, dynamic pages, or a shop. These are static sites.
- You need one login that every colleague shares. Every person signs in as themselves.
- You run paid acquisition for the client and need a conversion pixel or a tag manager on the site. A published Rocket Site loads nothing from a host it does not control, so there is no Google Ads or Meta tag and no Google Tag Manager container. The refusal is not a policy, it is a check on the built files that fails the publish. Traffic numbers have a route and attribution does not: Cloudflare Web Analytics is four clicks in your own Cloudflare dashboard, on the Pages project, and Cloudflare injects the beacon at its own edge, so nothing enters the repository and no cookie banner is needed. Worth saying plainly that this is something you switch on rather than something we ship. There is no analytics feature here and no code of ours involved.
How it works
Four steps, then the site is a repository you own.
-
Pick a template
Each template is a complete, launch-ready site rather than a fragment: a landing page, a privacy policy, terms of use, and a 404. Plain HTML with Tailwind classes, so what the AI edits is what the browser renders.
-
Describe the client
Write a brief. The model fills named slots in the template rather than doing freehand HTML surgery, which is what makes the result predictable enough to review. The legal pages keep their placeholders for entity, jurisdiction, and contact, with a visible banner saying so, because a confident-looking policy full of invented specifics is worse than an obviously unfinished one.
-
Review the preview
Look at the site before anything is committed. Nothing has left your browser except the calls you made to your AI provider with your own key.
-
Publish
You make an empty repository in your own GitHub organisation. The site is committed into it as its first commit, and your own GitHub Actions deploys it to your own Cloudflare Pages. You are asked before that commit, and it shows up in your organisation's audit log.
Rocket Sites does not create repositories, on any surface. No code in the extension, the console or the shared library makes that call, and tests enumerate the whole reachable surface to keep it that way. The permission it would need, repository Administration, also allows deleting, transferring and flipping to public every repository in an organisation, which is more than saving one click is worth.
Being exact about that permission, because a security review will ask and the honest answer has two halves. The code gave it up on 13 August 2026. The App registration still carries it, and taking it off is a form only the App's owner can submit, followed by a re-approval round in every organisation that installed it. Until that happens the capability exists even though nothing uses it, and this page is not going to describe it as gone while our own record of the App says otherwise. What you can do about it in the meantime is the thing that always worked: uninstall the app, which ends every permission at once.
Before the commit, the repository is read and refused unless it can be proved empty, so a site is never written over anything you already have. Attaching a custom domain is yours too.
After that, open the client's live page in a browser and keep going. The side panel attaches to the page you are looking at, you describe a change, you review the diff, and the edit is committed to the repository under your own GitHub identity. The page knows which repository backs it because every page it generates says so:
<meta name="source-repo" content="your-agency/acme-dental">
One tag, no registry, and no hostname guessing. The extension reads the page it is attached to and asks nobody. The console does keep a list of which of your repositories are sites, and it is worth being exact about that rather than letting the old sentence stand: it is a crawl of your own GitHub that can be thrown away and rebuilt, not a record only we have.
A change you are not making now becomes a GitHub issue on that client's own repository, labelled so the product never touches an issue it did not create, and when a commit answers it the issue gets one comment naming the file, the lines added and removed, and the commit. The backlog is the client's, in the client's repo, and it outlives us and the extension both.
The conversation is in there too, and this page said the opposite until 15 August 2026. It told a reader the issue carried the request and not the exchange that produced it. That stopped being true on 13 August, when the decision was reversed on the grounds that a conversation living in one person's Chrome profile is single-player and this is a tool a team uses. The issue body is the request and the comments are the turns, so your prompts and the model's replies are written to the client's repository, and the browser's copy became a cache you can throw away.
Read that as a privacy consequence rather than a feature note, because it is both. An issue is readable by everyone who can read the repository, which is your whole organisation, and the issues travel with the repository when a client relationship ends and you transfer it. That now includes what you tried, how you phrased it, and any candid remark typed into the composer. Better met here than at handover. Two things are still kept out by a check rather than by a habit: no credential ever reaches an issue, and a file body is refused, meaning a unified diff, a whole HTML page, or a fenced block over 2,000 characters. A short fenced snippet is allowed on purpose, since refusing every fence would refuse a model explaining itself with three lines of HTML.
The centrepiece
Three things get held, and none of them is your client's site.
This page used to say there is no backend, and that was the strongest sentence on it. It was retired on purpose, so the reason belongs here rather than in a quiet edit. An agency running forty client sites wants a fleet console, and a console needs somewhere to sign you in and somewhere to write down what happened. Neither of those fits inside a browser extension. So a control plane was built, and what it is allowed to hold was published before it existed rather than after. It now exists, and the list below did not grow on the way.
What it holds
- Who is signed in and which agency they belong to, in an encrypted session cookie.
- A list of which of your repositories are sites, built by crawling your GitHub for a topic. If it is ever wrong it gets rebuilt, because it is a copy and not the original.
- An append-only record of what was done in the console, and by whom.
- One Cloudflare API token per agency, encrypted, if you hand one over through Connect Cloudflare. It is what lets us set up your next client site without asking you to paste it again. The paragraph below this box explains why, and how it is kept.
What it does not hold
- Your clients' page content. It transits a request and is discarded with it. The copy that survives is the commit in your repository.
- Your briefs, your prompts, and the copy a model wrote for you. Same rule, same reason.
- Any AI provider key of ours. There is no free tier, so there is no key to hold, and your own key stays in your browser.
One line moved from the right-hand list to the left on 18 August 2026, and it is the most sensitive line on this page. Until that day this box promised that we held your Cloudflare API token at rest in no form whatsoever: Connect Cloudflare checked it, sealed it into your repository, and threw it away inside the one request. That is no longer what happens, and you are owed the reason rather than a quiet edit. Rocket Sites now sets a client site up with nobody in the loop, and a repository that did not exist an hour ago has to be given a Cloudflare credential before its first deploy runs. GitHub never hands a secret back, not even to the app that wrote it, so the only way to give the new repository one is to have kept it. What you get for that is a token you paste once instead of once per site.
How it is kept, stated plainly so you can weigh it rather than take our word for the shape of it. One row per Cloudflare account. Encrypted with a key generated for that row and used for nothing else, which is itself wrapped by a key that lives outside the database and is separate from the one protecting our sessions, so replacing either does not force the other. No screen and no part of our API will return it, in full or in part, and there is one function in the product that can decrypt it: the one that seals it into a repository we are setting up for you. If you would rather we held nothing, set the two values on your repository yourself and use Connect Cloudflare never, in which case nothing of ours ever receives the token. Either way it stays a credential you can revoke in your own Cloudflare account without telling us. The privacy policy sets out both routes and the difference between them.
That leaves two surfaces with two genuinely different answers, and blurring them together would be the easy dishonest move. So, separately:
The extension makes no request to us at all
Not a telemetry ping, not a licence check, not a config fetch. It talks to GitHub and to your AI provider and to nothing else. That is a rule with a test behind it rather than an intention: a build that reaches a Rocket Lab host fails the check and does not ship, and the check is an allow-list, so a hostname nobody thought to ban fails too. If you never open the console, nothing of yours reaches us, which is the same claim this page has always made.
The console is a service, with everything that implies
It has an origin, a session, a database, and secrets at rest. Content still transits and is discarded, but that is now a property of code we wrote rather than of a thing that does not exist. Those are not the same strength of promise, and that difference is why this section was rewritten instead of trimmed.
Here is every piece of state the product has, and where it lives.
| State | Lives in | Why there |
|---|---|---|
| Site content: HTML and assets | Your GitHub repository | The source of truth. Read and written through the GitHub API. It transits a browser, and for a console edit a request, and is written down at neither end. |
| Briefs, prompts, and the copy a model wrote | Nowhere | They transit. What survives the request is the commit in your repository, which you can read. |
| Per-site config: template, brand tokens, slot values | rocket-site.json, in the site repository |
Versioned with the site it describes, so the config and the site can never disagree. |
| Site inventory: which repositories are sites? | GitHub, as repositories carrying the rocket-site topic, with a rebuildable copy in the console |
The topic on the repository is the truth and the console's list is a crawl of it. Deleting that list loses nothing, which is the test of whether something is a copy. It carries repository names, so it carries your clients' names. |
| Who is signed in to the console | An encrypted session cookie, and a record of you and your agency | Identity and nothing else. A console cannot sign anyone in without knowing who they are, and this is the part of the old claim that could not survive. |
| Your Cloudflare API token | Your site repository's Actions secrets, put there by you or by Connect Cloudflare | Set it yourself and nothing of ours ever receives it. Use Connect Cloudflare in the console and it passes through one request, which verifies it, seals it into that repository, and keeps one encrypted copy so the next site we set up for you needs no second paste. That copy is encrypted per row, under a key held outside the database, and no screen or API of ours returns any part of it. Either way you can rotate or delete it without asking us. Per repository rather than per organisation, because on GitHub Free an org secret is invisible to a private repo and produces an empty value instead of an error. |
| Auth tokens, AI key, preferences | chrome.storage, in your browser profile |
Never sent anywhere except the provider they authenticate to, and never to us. |
| Audit trail | Git history and the Actions run log, plus a log of console actions | The git side is append-only, in your organisation, and already exists. The console side is the one record we genuinely own. |
| The published site | Your Cloudflare Pages | Deployed by your own CI, with your own Cloudflare token. Nothing of ours sits between a visitor and the page. |
| Access policy: who can see a site before launch | Your repository variables, reconciled into Cloudflare Access | Declared in the repository, applied on every deploy, so a manual change never quietly persists. |
Your clients' site content, briefs and generated copy never land on Rocket Lab infrastructure. They transit and are discarded, and we hold no credential that can reach your Cloudflare: your token either never reaches us at all, or reaches us for the length of one request and is gone when it ends.
And the part an outage makes real: no piece of ours sits between a visitor and a client's page, or between a repository and its deploy. If everything of ours is down, you can still ship a client's site.
This is a weaker claim than the one it replaces, and it would be a poor start to pretend otherwise. "There is nowhere to hold it" was something you could check by reading a manifest and a workflow. "We hold it briefly and discard it" is something you have to believe, and every competitor in this category says it too. What is still checkable is narrower, and it is what the argument now rests on: the sites are in your repositories, the deploys run in your Actions, the pages answer from your Cloudflare, and the token that reaches it is one you can rotate without asking us.
The same list, said once more in the language a compliance question is asked in, is the privacy policy. It goes further than this section does: every column the console stores, the retention answer that does not exist yet, and the claims we are not making.
What that costs
Four consequences, stated here rather than discovered later.
Adding a console is not free either, and the bill is different from the old one rather than smaller. This section used to list what having no backend cost. It now lists what having one costs, which is the more useful list because most of it did not exist before. If you read one section on this page, it should probably still be this one.
Something central to revoke now exists
This used to sit here as the opposite entry: nothing central to revoke, nobody can switch you off, including us. Half of that was a feature and half of it was a support problem, and now both have flipped. A session can be killed and an account can be disabled, which is exactly what you want the day a laptop goes missing. It also means there is a switch we own, and the old answer no longer applies. What survives is narrower and still true: switching off the console does not take a published site down, does not touch your repositories, and does not stop a deploy.
Secrets at rest, on our side, for the first time
A console means a database, a key encrypting what sits in it, a sign-in secret, and an application key that can now act on repositories in every organisation that installed it. None of those is a client's page, and your Cloudflare token is only ever held inside the one request that seals it into your own repository. But "there is nothing to breach" was an answer we could give and no longer can. What replaces it is an exact list of what is there, which is the table above and this paragraph.
An outage of ours becomes something you can feel
The console can be down, and while it is you lose the fleet view across all your clients, the deploy status of each one, the crawl that keeps that list current, creating a site from a brief without the extension, the button that seals your Cloudflare token into a new client's repository, the button that redeploys a site, and the screen that changes a site's publish mode. That is a real list and it is the reason this entry exists. Every item on it has a manual route through GitHub and Cloudflare directly, which is slower and is not nothing.
The publish mode entry is a correction rather than an addition. This paragraph used to list it under what cannot be down, on the grounds that the mode is a line in the site's own repository and the console only links you there. The second half was not true: the console writes that line itself, as a commit plus the repository variables beside it, and the deploy that commit triggers is what makes it real. It is still your repository and still your Actions run, so the manual route is to edit the same line yourself, which is why this is a slower day rather than a blocked one.
What cannot be down: publishing, because the workflow runs in your Actions. Serving, because the pages answer from your Cloudflare. The extension, because it does not call us at all. So an agency with the extension installed can still ship a client's site with every host of ours dark. You lose the operations around your sites, not the sites. That separation is deliberate and it is the property to hold us to.
One qualification, because "every host of ours dark" is a claim worth getting exactly right. Your Actions resolve the publishing workflow from a public GitHub repository we own, so a new deploy needs that repository to still be readable. Nothing of ours runs during your deploy and no server of ours is contacted, and an already published site is untouched either way. But it is GitHub availability rather than ours, and it is the one thread still attached. If you want it cut entirely, pin the workflow to a commit and vendor it.
We are not quoting an uptime figure, because we have not measured one and a number invented for a marketing page is worse than no number.
Still no free tier, and still no pricing
You bring your own AI provider key: Anthropic, OpenAI, or GitHub Models. Generating a site costs whatever your provider charges, billed to you, visible to you. What changed is the reason. A free tier used to be impossible, because there was no server to hold a key. It is now a choice we are not making. How the product itself is paid for is genuinely not settled, and there is no price to quote.
A fifth thing belongs here because this page has now been wrong about it twice, in opposite directions, and leaving the corrections visible is more use than a silent edit. An early draft said the Cloudflare token step was automated before any code did it. The correction to that then said nothing of ours would ever receive the token, and stayed on this page after the console shipped a form that receives one. Both are gone. What is true today: you choose. Set the two secrets on the repository yourself and nothing of ours receives the token, or use Connect Cloudflare and it transits one request that verifies it, seals it into that repository and discards it. The first is a claim you can check without trusting us; the second is a claim about code we wrote, tested for, but which you cannot see from outside. We would rather say which is which than let the convenient one borrow the checkable one's credibility. Cross-device sync improves only halfway too: your identity and your site list follow you to a second laptop, and your AI key does not, because it stays in one browser profile.
The per-repository part catches people out, so it is worth stating once here rather than only in the docs. On GitHub Free, an organisation-level Actions secret is not readable from a private repository. It does not error: it arrives empty, and the deploy fails somewhere that looks unrelated while the organisation's settings page shows the secret sitting there, apparently correct. Set the two Cloudflare secrets on each site repository.
Publishing model
Public by default. Gated only when you ask for it.
A client's marketing site exists to be found, so that is the default and it is not something you have to remember to switch on. The opposite mistake is the dangerous one: a site that is quietly gated is invisible to the customers it was built for, answers every visitor with a login page, drops out of search, and nobody notices, because the only people who check are the ones who can get past the gate.
| Mode | Who can reach it | What a deploy has to prove |
|---|---|---|
| Public, the default | Anyone | The site returns HTTP 200 and the response body carries that repository's source-repo tag. |
| Gated, opt in for the review window | Only the client email addresses you name, through Cloudflare Access | An unauthenticated request redirects. No access gate means no publish. |
Restriction is never inferred
A site is gated because its repository says so, and for no other reason. Not from the branch, not from the environment, and not from an access rule the publisher happens to find lying around on your Cloudflare account. Asking for the review window is an explicit change committed to the repository, reviewable before it happens and visible in the history afterwards.
Proof, not assumption
A deploy never reports success on an unproven state. HTTP 200 on its own is not proof a site is live, because placeholder pages and unrelated projects return 200 too. A gate is proven by a redirect, and it covers wildcard preview URLs as well as the main address, since a static host cannot simply turn preview deployments off.
Your Cloudflare token is never on the machine that builds the site
This one is worth a paragraph because it is not obvious and it is the part of a deploy an agency has the most to lose from. Cloudflare cannot scope a Pages token to a single project, so the token in one client's deploy can reach, redeploy and delete every Pages project on your account. Put that credential on the same machine as anything a client repository can make run, and push access to one site becomes push access to all of them.
That was not hypothetical. Under Tailwind 3 the build read a config file out of the site's own repository and executed it as Node, which is the documented behaviour of the tool rather than a trick played on it, and it happened in the job holding the token. The build now pins Tailwind 4, whose theme is CSS and which has no config module to run, and the brand values are read as JSON and checked before they are written. So nothing in the repository is executed during a build today. The separation stayed anyway, and that is the point: it is what makes the property survive the next tool that decides to read a file.
So the build runs in a separate job with no credential in it at all, on its own machine, and hands the finished files on as an artifact. The job that talks to Cloudflare never checks the site out and never runs a line of its code. That is a job boundary rather than a step boundary, deliberately: every step of one job shares a runner and a user, so code running in an earlier step can read a later step's environment, and the separation has to be a property of the machine to be worth anything. A test plants a config file that really does steal the token, proves it works where the credential lives, and proves it captures nothing where the site is built.
What you bring
Three things, all of which you keep.
A GitHub organisation
Client site repositories are created inside it. You install the app on the organisation, and you uninstall it whenever you like, which is the switch that ends our access entirely.
A Cloudflare account
Sites deploy to Pages projects in your account. You create one API token, scoped to Pages and to Access, and it ends up in each site repository's Actions secrets alongside your account id. Put it there yourself and it goes to GitHub and nowhere else; let the console do it and it transits one request and is discarded. Two things worth knowing before you start: on GitHub Free those secrets have to be per repository rather than org-wide, and Cloudflare allows 100 Pages projects per account, which this model uses one of per client site.
An AI provider key
Anthropic, OpenAI, or GitHub Models. Your key, your account, your bill, your rate limits. The prompt goes from your browser to that provider and nowhere else.
FAQ
The questions an agency should ask.
Some of these still follow from how the thing is built, which is the strongest kind of answer. Since there is now a console, some of them are promises about how we intend to behave. Those two are not worth the same and they are marked apart below rather than blended.
- Where does my client's content go?
- Into a repository in your GitHub organisation, and onto a Cloudflare Pages project in your Cloudflare account. On the way there it passes through your browser and your AI provider, because you asked a model to write it. Through the extension it passes through nothing else at all. Through the console it passes through a request of ours on its way to GitHub, and is discarded with that request rather than written down. That second sentence is a promise about our code and the first is a property of the design, and the difference is real.
- What happens if Rocket Lab disappears?
- Every published site stays up, indefinitely, with no action from anyone. The sites are static files in your repositories served from your Cloudflare account, and nothing about serving them involves us. Deploying again is very nearly as safe and the difference is worth naming rather than rounding off: the workflow runs in your Actions, but your Actions fetch it from a public GitHub repository we own, so a future deploy wants that repository to still be there. Pin it to a commit and copy it into your own org and even that goes away. What is no longer true is that you would lose nothing else. An agency whose fleet view lives in our database, and whose console audit trail we hold half of, loses the operations around their sites even though the sites keep serving: the inventory across all their clients, the deploy statuses, the ability to onboard a new client or create a site from a brief without the extension, and eventually the ability to sign in at all. The console's own record of who did what stops being written, and you lose the screen that reads it back, which is a smaller loss than it sounds: it covers console actions only, and the audit trail that covers your actual work is your git history and your Actions log, in your own organisation. The sites survive us, and so does the extension, which needs nothing from us to work. The way you run a fleet of them does not, and that is a real change from what this page used to say.
- Can you see our prompts?
- Not from the extension. The prompt goes from your browser directly to the AI provider you chose, authenticated with your key, with no intermediary to log it and no key of ours involved. From the console a prompt passes through our origin, so the accurate answer there is that it is not stored rather than that it could not be seen. Two related things we should not have claimed in the same breath before: your clients' page content follows the same rule as the prompt, and the names of your clients do not, because the site list is built from your repository names and those are usually client names.
- Who else can is the more useful question, and the answer changed on 13 August 2026. Prompts and model replies are now written as comments on the issue in the client's own repository, so everyone who can read that repository can read them, and they transfer with it. That is your GitHub rather than ours, and it is deliberate, because a conversation held in one person's browser profile cannot be picked up by a colleague. It is worth knowing before you type something into the composer that you would not put in a ticket.
- What if we stop paying?
- This answer used to be "nothing is switched off, because there is nothing central to switch off", and that is no longer true: a console account can be disabled. What cannot happen is the part that mattered. Your sites keep serving, because they serve from your Cloudflare. Your deploys keep running, because they run in your Actions. Your repositories stay yours, and the extension does not check in with anyone before it works. So a lapsed relationship costs you the console and not the websites. Being honest about the current state: pricing does not exist yet, so there is nothing here to sign.
- Who owns the repository?
- You do. It is created in your organisation, at your request, and every commit is attributed to the GitHub account of the person who made it. Commits go straight to the default branch, and where a branch protection rule blocks that, a pull request is opened instead and you are told it happened.
- Is it available yet?
- Not as something you can install. There is no Chrome Web Store listing and no download, so the extension is not a thing you can get today. The rest is further along than that sounds and it would be coy not to say so: the console runs, the publisher has published a real site from a real repository to a real Cloudflare Pages project, and the parts this page describes are built rather than drawn. What has not happened is a release to anybody outside the people building it. If it sounds like it fits how your agency works, the most useful thing you can do is tell us which part of it does not.
Interested, or unconvinced?
Both are useful. It is being built for agencies, so the fastest way to change it is to be an agency with an opinion about it.