Real buildClaude's output, uneditedRecorded demo
I want AI to build me a dashboard, CRM or spreadsheet tool
Five plain-English prompts made a password-protected customer list with spreadsheet import. Upload two files to GitHub and Cloudflare puts it live: free, no terminal.
- Prompts
- 5
- Claude's time
- 15 min 44 s
- Got wrong
- 7 things
- Tests passed
- 10 of 10
- Model
- claude-sonnet-5-5
- Run on
- 1 October 2026
For: A one-person business that keeps its customers in a messy spreadsheet, wants a private list it can use on a phone and a laptop, and has never built a website or opened a terminal.
What the five prompts made Today






01 · Before you start
Before you start.
You need three free accounts, set up once: Claude, GitHub and Cloudflare. The set-up page walks through each. In Claude, switch on “Code execution and file creation” (Settings, then Capabilities; it’s on the Free plan) so Claude can hand you files to download. On GitHub, make an empty repository with “Add README” switched on; ours was called brightside. Connecting Claude to GitHub is part of the set-up too, but on the Free plan it only reads your files, so you upload what Claude gives you.
Nothing to install, and no terminal. Have your spreadsheet to hand, saved as a CSV file (most spreadsheet programs offer it under Save As or Download). It never goes on GitHub: it goes straight into the app once it’s live.
Our example is made up: Brightside Window Cleaning, a one-person round with about 150 customers in a spreadsheet that’s a mess on a phone. Claude made up 12 sample customers so there was something to test with, which is what you want on day one anyway. Swap in your own business.
02 · Set up once
Set up once, then just talk to Claude.
Free accounts you make one time and reuse for every build. Each links to the step-by-step on the set-up page, with what each screen looks like.
- 1. Get a free Claude account. It's where you describe what you want and Claude makes it. The Free plan covers every guide on this site; Pro adds the shortcut where Claude saves changes to GitHub itself.
- 2. Let Claude hand you files. A website is a handful of files. With this switched on, Claude can make them and give them to you to download, ready to upload to GitHub.
- 3. Get a free GitHub account and an empty repository. A repository is a folder on GitHub that keeps every version of your files. It's the one place your site lives: you (or Claude) change the files there, and Cloudflare publishes whatever is in it.
- 4. Get a free Cloudflare account and connect it to your repository. Cloudflare is where your site is live on the internet. Once it is connected to your repository, every change to the files on GitHub goes live by itself, in a minute or two. A site made of plain files costs nothing to host: Cloudflare says requests to static files are "free and unlimited".
- 5. Connect Claude to GitHub. So Claude can read the files that are live now before it changes them, even in a brand new chat. On Pro, the same connection is what lets Claude Code on the web save its changes to your repository.
03 · The prompts
Paste these five, in order.
Plain English, typed into an ordinary Claude chat. On the left, exactly what we sent, word for word; change the details to yours. On the right, what came back. One conversation with claude-sonnet-5-5, run on 1 October 2026. Read the full transcript.
Prompt 1 of 5
Describe what you keep and what you need, and ask for a plan first.
You say: I run a one-person window cleaning round called Brightside Window Cleaning. I have about 150 customers and I keep them all in a spreadsheet, which is a mess on my phone. I'd like a simple customer list and dashboard I can use on my phone at the door, and on my laptop at home. For each customer I keep: name, address, phone, email, price per clean, how often I clean (every 4 weeks or every 8 weeks), the date I last cleaned, whether they've paid for the last clean, and notes (like "side gate code 1234" or "dog in garden"). What I need it to do: - Show me who is due a clean this week, and who is overdue. - Let me tick off a clean as done, and tick it as paid, with one tap. - Show who owes me money and how much in total. - Show what I've earned this month. - Add, edit and delete customers, and search by name or street. - Bring in my existing spreadsheet (I can save it as a CSV file), and save everything back out to a spreadsheet as a backup. - Only I must be able to see it, with a password. My customers' addresses and gate codes are private. I'm not technical and I've never made a website. I'd like it to be free to run, and I've heard Cloudflare can do that. Before you make anything, ask me anything you need to know, and tell me in plain English what you're going to make and where my customers' details will be kept.
1,837 output tokens back · read the full reply
Prompt 2 of 5
Answer its questions, show it a design you like, and ask for copy and paste only.
Attach: a screenshot of a website you like the look of · the one we attached
You say: Thanks, that sounds right. My answers: 1. Yes, I've made a free Cloudflare account and I'm happy to follow your steps on my laptop. But I don't want to use the terminal or install anything. I've read that Cloudflare lets you paste code into its website and set up a database by clicking, so please make it so all I have to do is copy and paste. 2. Just every 4 or every 8 weeks for now. 3. Keep a history of each clean, like you said. "Earned this month" should be money I've actually been paid this month. 4. Yes: today's date and unpaid, but let me change the date if I tick it off later. 5. Monday to Sunday. 6. Yes, due straight away. 7. My spreadsheet's headings are: Name, Address, Phone, Email, Price, Every (weeks), Last cleaned, Paid, Notes. Dates are written like 14/09/2026 and Paid is Yes or No. Please make up a sample file with 12 pretend customers in that layout so I can test bringing them in. 8. The free address is fine for now. 9. Only me. I've attached a screenshot of a website I like the look of. I like the boxes with big numbers and small capital labels above them, and how tidy it is. I'd like mine light rather than dark, though, because I use it outside in daylight. Don't copy its words, just the feel. The buttons need to be big enough to tap with wet hands. Please make it now. Keep it as simple as possible: just what I'll need to paste into Cloudflare, nothing I have to install. Tell me in plain English what each file is for.
80,277 output tokens back · read the full reply
Prompt 3 of 5
Ask it to check its work at the door, and like someone trying to break it.
You say: Thanks. Before I put it online, please check it carefully as if you were me on a small phone screen at someone's door, and as if you were trying to break it: - bringing in a spreadsheet with commas or quotes inside an address, blank rows, prices typed as "£15" or "15.00", dates typed as 3/9/2026, or a missing column - bringing in the same file twice - ticking a clean as done twice by accident, or ticking the wrong customer and needing to undo it - a customer I clean every 4 weeks who I've never cleaned yet - someone who isn't me finding the link and trying to see the list some other way - a bad signal halfway through saving Tell me in plain English what you found, then fix it in the files.
46,082 output tokens back · read the full reply
Prompt 4 of 5
Change something, the way you will once you're using it.
You say: A few of my customers have asked to go to every 6 weeks. Please add that as a choice, alongside every 4 and every 8 weeks, including when I bring in a spreadsheet. Imagine I've already been using it for a few weeks with my real customers, so it mustn't lose anything. Then tell me exactly what I need to paste into Cloudflare again to put the change live.
3,253 output tokens back · read the full reply
Prompt 5 of 5
Ask how to put it live from GitHub by clicking, then bring in your real spreadsheet.
You say: I've made free GitHub and Cloudflare accounts, and a new repository on GitHub called brightside (I switched on "Add README"). I'd like Cloudflare to put it live by itself every time the files on GitHub change. I've read that Cloudflare can do this from Workers & Pages, Create application, "Import a repository". I don't want to use the terminal or install anything. If Cloudflare needs any extra files for that, please make them. Then tell me, step by step, how to get the files into my repository using the GitHub website, how to connect it in Cloudflare, how the database and my password are set up, what I should see at each step, and how I put a change live later (like the 6 weeks). Also, how do I bring in my real spreadsheet once it's live, and keep a backup?
6,097 output tokens back · read the full reply
After prompt 1 of 5
Reply to prompt 1 · 18.4 s · 1,837 output tokens
Describe what you keep and what you need, and ask for a plan first.
A plan and some questions, and nothing made yet. Ours planned Today, Money, Customers and import and backup screens behind one password, the details kept in a Cloudflare database in your own account, and a record of every clean so 'earned this month' stays right. It asked nine questions.
Reply to prompt 2 · 8 min 35 s · 80,277 output tokens
Answer its questions, show it a design you like, and ask for copy and paste only.
Files to download. Ours saved three: worker.js, the whole app in one file (1,434 lines), sample-customers.csv with 12 pretend customers, and SETUP.md with click-by-click steps. The app makes its own tables, so there's nothing to type into the database. It said it hadn't run any of it.


Reply to prompt 5 · 46.1 s · 6,097 output tokens
Ask how to put it live from GitHub by clicking, then bring in your real spreadsheet.
One new settings file, wrangler.jsonc, with a line to paste your database's ID into, and a rewritten SETUP.md: make the repository private, make the database, upload two files, paste in the ID, connect the repository in Cloudflare with a matching name, add the password as a secret. Then how to save the spreadsheet as CSV and bring it in, and backups. It said it hadn't tested any of it.
04 · The result
The real thing, on the stage.
Screenshots of exactly what Claude produced, running on our machine on 1 October 2026. Nothing retouched.
We typed five plain-English prompts into one conversation with claude-sonnet-5-5 on 1 October 2026. One caveat: we ran them through Anthropic’s command-line tool with only its file tools switched on, so Claude could save files into an empty folder, much like file creation on claude.ai. We didn’t use the claude.ai website itself, so your screen will look different. Prompt 5 was asked again later for the GitHub route, carrying on from exactly where prompt 4 left off, so Claude saw the whole conversation. The replies are published as they came back and we edited nothing by hand. Claude spent 943.9 seconds writing them, most of it on the first build.
The first prompt listed what we keep for each customer and what the tool must do, said it had to be private behind a password, and asked for questions before anything was made. Claude planned four screens (Today, Money, Customers, and import and backup) behind one password, with the details in a Cloudflare database in your own account. It also planned to keep a record of every clean, so “earned this month” stays right when prices change. Then it asked nine questions.
In the second prompt we answered them, gave our spreadsheet headings, and attached a screenshot of one of our own sites: we liked the boxes with big numbers and small capital labels, but wanted it light, because it’s used outdoors. Claude saved worker.js, the whole app in one file (1,434 lines), sample-customers.csv with 12 pretend customers, and a set-up guide. There’s nothing to type into the database, because the app makes its own tables the first time it runs.
Prompt 3 asked it to check the app as the owner at someone’s door, and as someone trying to break it. It found real problems. After tapping Cleaned, the card jumped to another list, so a quick second tap could land on the next customer. There was no way to undo a clean on the wrong customer once the message had gone. Excel’s older spreadsheet format garbled the £ sign, and a dropped signal could save a customer without their last clean. It fixed those, having checked by reading the code, not running it. Prompt 4 added every 6 weeks, with no change to the database.
Prompt 5 asked how to get Cloudflare to put it live by itself whenever the files on GitHub change, how the database and password are set up, and how to bring in the real spreadsheet. Claude made one extra file, wrangler.jsonc: a short settings file with the app’s name and the database to connect, and a placeholder for the database’s ID, the only thing you change. It rewrote SETUP.md for GitHub, starting with “make the repository private” and “never upload your real customer spreadsheet to GitHub”. It got the one thing Cloudflare warns about right: the name in the settings file must match the name you give the app in Cloudflare. It said it hadn’t tested any of it.
Then we tested it ourselves on a local copy, with Claude’s settings file (a made-up ID in place of the placeholder) and its other files unchanged. Nothing went on GitHub or Cloudflare. Cloudflare’s own checking tool read the settings file without complaint. Before the password was set, the page said “Nearly there - setup is not finished” and where to add it, as Claude said it would. With the password, the app passed all 23 checks at laptop and phone size. Claude’s sample file gave exactly the numbers it said we’d see on 1 October: 3 overdue, 5 due this week, 2 cleaned, £58 owed, £0 earned. Our deliberately messy file came in properly too, with the bad rows listed and skipped.






Not hosted live: it is a password-protected customer list that saves to a database, so a public copy would mean publishing the password and letting anyone add, change or delete records. The screenshots and the full transcript are the recorded output of our run.
SETUP.md
sample-customers.csv
worker.js
wrangler.jsonc
05 · What we tested
We tried to break it. Here's what held.
Run on our own machine against the unedited files. Nothing deployed while testing.
| What we tried | What happened | Result |
|---|---|---|
| Claude's wrangler.jsonc, read by Cloudflare's own tool (a dry run, nothing uploaded) | Name brightside, worker.js, the database bound as DB; 74.18 KiB. The dry run doesn't check the database ID, so the placeholder must be replaced before the first real build | Pass |
| Final files before the password secret is set | The page says "Nearly there - setup is not finished", that the password hasn't been set, and where to add it, as Claude's SETUP.md says | Pass |
| Final files (after prompt 5), as a stranger with the link | Customer data, the backup download and adding a customer all refused when signed out, and with a forged sign-in cookie; the wrong password refused | Pass |
| Final files: Claude's sample spreadsheet, then the Today screen on 1 October 2026 | 12 customers in; 3 overdue, 5 due this week, 2 cleaned, £58 owed, £0 earned, exactly what Claude said we'd see | Pass |
| Final files: the same spreadsheet brought in twice | "Nothing new to import. 12 skipped"; still 12 customers | Pass |
| Final files: our messy spreadsheet | Quotes and commas inside an address, £15, 15.00 and 3/9/2026 all read correctly; a price of 'twelve', every 5 weeks and 31/02/2026 skipped with the row and the reason; every 6 weeks accepted | Pass |
| Final files: Cleaned, ticked twice, then Paid | The card stays put; a second tick the same day isn't recorded twice; Paid £28 (this clean plus an unpaid one from the spreadsheet) took Earned this month to £28 | Pass |
| Final files with Claude's own wrangler.jsonc: laptop (1440x900) and phone (390x844) in headless Chrome | 23 of 23 checks overall: phone signs in separately, Cleaned button 60px tall, no sideways scrolling on any tab, no script errors, nothing loaded from other websites, backup file downloads, 5 wrong passwords then even the right one blocked for 15 minutes | Pass |
| The final worker.js over a database the first build had been using | 9 of 9: customers, a payment, notes and amounts owed kept, still signed in, and a customer switched to every 6 weeks | Pass |
| First build (after prompt 2), same browser test | Every check that applied passed, including the sample numbers; every 6 weeks didn't exist yet | Pass |
06 · Ship it
Put it live from GitHub, no terminal.
Your files go into your GitHub repository and Cloudflare publishes them by itself. The steps start from Claude's own answer and are checked by us against GitHub's and Cloudflare's documentation, which the sources below link to.
These clicks follow GitHub’s and Cloudflare’s documentation, so the button names are theirs. Claude’s order is right: the database comes first, because the settings file needs its ID before Cloudflare’s first build. We haven’t hosted this demo publicly, because it would mean publishing the password and letting anyone change the records; the screenshots are from our own machine.
- Make the repository private: on GitHub, open it, then Settings, and under Danger Zone select Change visibility. Nothing secret goes in it, but there’s no reason for anyone to browse it.
- In the Cloudflare dashboard, go to the D1 SQL database page, select Create Database, name it brightside-db and select Create. Copy the database’s ID from its page in the dashboard. Leave it empty; the app makes its own tables.
- Download Claude’s worker.js and wrangler.jsonc. On GitHub, select Add file, then Upload files, drag in those two files (the files, not the folder they’re in) and select Commit changes. The sample file is fake, so it can go up too if you like; your real spreadsheet never does.
- On GitHub, open wrangler.jsonc and select the pencil icon at the top right. Replace PASTE-YOUR-DATABASE-ID-HERE with your ID, keeping the quote marks, and commit. Do this before the next step, or the first build fails.
- In Cloudflare, go to Workers & Pages, select Create application, then Get started next to “Import a repository”. Choose your GitHub account (sign in and allow Cloudflare access the first time), pick brightside, and keep the name exactly brightside, as in the settings file. Leave the build settings as they are and select Save and Deploy. You should see a build finish and an address ending in workers.dev.
- Pick a password of at least 10 characters, such as three or four random words. Open the app in Cloudflare, then Settings, then Variables and Secrets, and select Add. Choose Secret, name it PASSWORD (exactly), type your password as the value and select Deploy. A secret stays put when the app is rebuilt later.
- Open the workers.dev address. If it says “Nearly there - setup is not finished”, it tells you what’s missing. Otherwise you’ll see the sign-in page. Sign in, go to the Backup tab and bring in sample-customers.csv to see it working, then use “Delete everything” on the same tab and bring in your own spreadsheet.
- To put a change live, such as the 6 weeks, download a backup from the Backup tab first. Ask Claude in the same chat and download the files it changed. On GitHub, select Add file, then Upload files, drag them in and select Commit changes. Files with the same name are replaced; the rest stay. Cloudflare rebuilds by itself within a minute or two, and your customers stay in the database.
If the first build fails, the usual causes are a name that isn’t exactly brightside, or the placeholder still in wrangler.jsonc; Claude asks you to paste the end of the build log back to it. If an update goes wrong, open the app, then Deployments, select the three dots next to the previous version and choose Rollback; GitHub still holds the broken file, so put a working worker.js back there too. For your own domain, the domain has to be on Cloudflare first; then it’s Settings, Domains & Routes, Add, Custom Domain.
On Claude Pro, you can skip the downloading and uploading. Ask Claude Code on the web for the change and it saves it to a branch of your repository; you merge it on GitHub and Cloudflare puts it live. The set-up page shows how.
No GitHub? You can paste worker.js straight into Cloudflare’s online code editor instead, and add the database and the password by clicking, but every change means pasting it in again.
Free plan: Claude makes the files, you upload them
FreeTo change something: ask Claude, download the files it changed, and upload just those the same way. Files with the same name are replaced; the rest stay as they are.
£0: Claude Free, GitHub Free and Cloudflare's free plan.
Pro: you chat, Claude saves the change, Cloudflare publishes it
Claude Pro, $20 a monthClaude edits the files and saves them to GitHub on a separate branch, a draft copy. Cloudflare gives that branch its own preview address, so you can look before anything changes. Happy with it? Select Create PR, then on GitHub select Merge pull request, then Confirm merge. Cloudflare puts it live by itself.
07 · What it costs
What it costs.
£0 a month on Cloudflare's free plan at this size. No domain needed; your own is optional.
£0 a month at this size. On Cloudflare’s free plan as of October 2026, Workers get 100,000 requests a day with 10 ms of CPU each. D1, the database, allows 5 million rows read and 100,000 rows written a day, 5 GB in total and 500 MB per database. A round of 150 customers is nowhere near that. GitHub’s Free plan holds the files, private repository included.
You don’t need a domain; the workers.dev address works without one. Claude’s Free plan includes file creation, but the first build was one long reply, and we didn’t check whether replies that long fit within the Free plan’s usage limits.
08 · What it got wrong
7 things Claude got wrong, or left to you.
If Claude gets something wrong, we say so here. We never fix its files by hand; a fix is a follow-up prompt you can see above.
It never ran its own code
Claude said so every time. All the testing on this page is ours, on a local copy on our own machine; we did not put it on GitHub or Cloudflare or try it on a real phone.
Button names that don't quite match Cloudflare's
Claude said to go to "Storage & databases" for the database; Cloudflare's guide calls it the D1 SQL database page. It said to choose Import a repository; Cloudflare's guide says Get started next to Import a repository. Claude warned names might differ, and the steps below use Cloudflare's.
Paid means paid for everything
One tap on Paid marks everything a customer owes as paid, not just the last clean. Claude said so, and the button shows the total, but check it before you tap.
Old payments don't count
Cleans marked 'Paid = Yes' in your spreadsheet have no payment date, so they never count toward 'earned this month'. Claude chose this on purpose and said so.
Backups are by hand, and a restore is partial
You download the backup yourself from the Backup tab. Claude's SETUP.md says you can import the customers file back after "Delete everything". That file has your spreadsheet's columns, so it brings back each customer with their last clean, not the record of every clean or the dated payments; the clean history downloads separately and has no import. We didn't test a restore.
No signal, no app
There's no offline mode, so it can't open or save without a signal. Claude left it out so addresses and gate codes aren't stored on the phone.
Google sees addresses you tap
Tapping an address opens Google Maps. Nothing else is sent anywhere, and Claude said so.
Ours, disclosed
Built it? Where we can help next.
Ours: made by the same studio that runs this site. None of them changes anything above.
Ours
Adapt Progress Evolve
We build these properly, if you'd rather not.
Questions
Questions people ask.
Can Claude build me a CRM?
A small one, yes. Five prompts in one Claude conversation made a private customer list with due dates, one-tap Cleaned and Paid, money totals, search, and spreadsheet import and backup. It passed all our checks on a local copy, but Claude never ran it, so test it with the sample file first.
Do I need to use a terminal or install anything?
No. You make the database and set your password by clicking in Cloudflare, and upload two files on the GitHub website. The app makes its own tables.
Are my customers' details on GitHub?
No. They live in the database in your own Cloudflare account, and the password is a Cloudflare secret. GitHub holds only the app and a settings file; Claude still says to make the repository private, and never to upload your real spreadsheet there.
Can I bring in my existing spreadsheet?
Yes, saved as a CSV file, through the app's Backup tab once it's live. The preview shows what will come in and lists any rows it will skip, with the reason, before anything is saved. Bringing the same file in twice doesn't double anyone up.
Can Claude put it online for me?
Not from a chat on the Free plan, as of October 2026: Claude's GitHub connection there only reads your files. But once the repository is connected to Cloudflare, uploading the files to GitHub is putting it live. On Claude Pro, Claude Code on the web can save a change to a branch of your repository for you; you merge it on GitHub and Cloudflare puts it live.
Does it cost anything?
Not at this size on Cloudflare's free plan: £0 a month. GitHub's Free plan holds the files, and a domain name is optional.
Sources for this page
18- Claude help: create and edit files with Claude (all plans; Settings > Capabilities)
- Claude help: uploading files to Claude (screenshots)
- Claude docs: GitHub integration (every plan, reads files only)
- GitHub Docs: adding a file to a repository (Add file > Upload files; 100 files at once, 25 MiB each)
- GitHub Docs: editing files (the pencil icon)
- GitHub Docs: setting repository visibility (Danger Zone > Change visibility)
- Cloudflare Workers Builds: Create application > Import a repository; the Worker name must match the settings file
- Cloudflare Workers Builds configuration (default deploy command; the auto-created API token's permissions)
- Cloudflare Wrangler configuration: automatic provisioning of D1 databases, including deploys from GitHub
- Cloudflare D1 get started, dashboard steps (D1 SQL database page > Create Database)
- Cloudflare D1 and Prisma tutorial (a database's ID can be found in the dashboard)
- Cloudflare Workers secrets: add a secret in the dashboard (Settings > Variables and Secrets)
- Cloudflare Workers rollbacks (dashboard: Deployments > Rollback)
- Cloudflare Workers custom domains (Settings > Domains & Routes; needs an active Cloudflare zone)
- Claude Code on the web: get started (Pro, Max and Team plans)
- Cloudflare Workers pricing (free: 100,000 requests a day, 10 ms CPU each)
- Cloudflare D1 pricing (free: 5 million rows read, 100,000 written a day, 5 GB)
- Cloudflare D1 limits (500 MB per database on the free plan)
For developers
For developers.
Skip this if you've never used a terminal. You don't need it.
The command-line route
With the repository connected through Workers Builds, every push to main runs npx wrangler deploy (the default deploy command):
git clone https://github.com/<you>/brightside.gitcp worker.js wrangler.jsonc brightside/cd brightsidegit add worker.js wrangler.jsoncgit commit -m "Add the app"git push origin mainClaude’s wrangler.jsonc names an existing D1 database by ID. Cloudflare also documents automatic provisioning: leave database_id out ("d1_databases": [{ "binding": "DB" }]) and the database is created on deploy, including deploys from GitHub. Workers Builds’ auto-generated API token lists Workers Scripts, KV and R2 edit permissions, not D1, so we haven’t confirmed that works from a Builds deploy; making the database first, as Claude did, avoids the question.
We tested with Claude’s own wrangler.jsonc: wrangler deploy --dry-run put it at 74.18 KiB (21.55 KiB gzipped) with env.DB bound, and wrangler dev with a local D1 and PASSWORD in .dev.vars ran our browser test. Without GitHub, the first, command-line version of this page (claude-sonnet-5-5, 1 October 2026) deployed with Wrangler directly, with a schema.sql and two secrets; its commands, condensed:
npx wrangler loginnpx wrangler d1 create brightside --location=weurnpx wrangler d1 execute brightside --remote --file=schema.sqlnpx wrangler deploynpx wrangler secret put APP_PASSWORDnpx wrangler secret put SESSION_SECRETThis version’s worker.js needs no schema file (it creates its tables) and reads env.DB and env.PASSWORD. Our test scripts and the messy test file are in demos/build-me-a-dashboard/tests/.
