From "I've got a bunch of HTML files I want to share" to a live, branded resource library on Cloudflare, in under an hour. Every prompt, decision, snag, and lesson.
Created by Chris MBS Latham 🍔 with support of the AI Robotsthelatham.net
Built Oct 14–15, 2026 · with Claude Code in the Mac Terminal
< 1 hrIdea → live page. "An hour and a half at most. Honestly, even less."
$0Hosting on Cloudflare's free plan
0Lines of code Chris wrote. He made the decisions; the AI built, tested, and shipped
~17Prompts across the whole build, including tweaks and promotion
At a glance
The idea
One domain to host lots of single-page HTML files, with a homepage that works as a visual directory
The result
chrismbs.link: a searchable, branded library with a self-building homepage, short links, analytics, and a favicon
Built with
Claude Code (Claude running in the Mac Terminal)
Why so fast
The groundwork already existed: brand colours, brand guides, social and newsletter links, all saved and ready to reuse
Stack
HTML pages · a small Node.js build script (no dependencies) · Cloudflare Workers static assets · GitHub (private repo) · Plausible + Piqo analytics
Prompts are quoted exactly as typed, typos included. That's the real process.
★Before the build
Why "chrismbs.link"?
"The domain is something I just came up with, in thinking it would be something that's brandable and short. I like the dot-link because it's an easy way for me to remember that it's something to be shared. It's not really like an inbound page for sharing who I am; it's really just for the goal of it being shareable resources."
Chris
Short and brandable. Easy to say out loud in a video or type from a slide.
.link signals the job. This domain is for sharing resources, not for introducing Chris. chrislatham.ca and THE LATHAM (thelatham.net) do that.
MBS is a middle name Chris has used online for a long time. It wasn't given at birth; he chose it, and it stands for Mind, Body, and Soul.
1Phase one
Starting point: a guide worth sharing
The site started with one file: a Custom GPT to Plugin Migration Guide (version 3). It was a useful, well-built HTML guide, but it had generic corporate styling and no author.
Prompt 1 · Rebrand the guideChris
I want you to take this html file and rebrand it to match my brand COlours, and include me as the author and a link to https://thelatham.net here is the file that is about converting OpenAI CustomGPTs to a PLugins ~/Coding/Chris Creator/input/custom-gpt-to-plugin-migration-guide-v3.html
Key concept & purposeTake an existing asset, something you’ve already made. Maybe it’s already online somewhere, maybe you created it and never shared it, or maybe it’s been sitting in drafts for months. Then make it yours: your colours, your name, and a path back to your newsletter.
What happened
Claude found the brand colours in brand/creative-kit.md (Warm Paper, Vibrant Magenta, Deep Teal, Warm Crimson) and the fonts from THE LATHAM newsletter site (Space Grotesk, Inter, JetBrains Mono).
It saved a new file and left the original untouched.
The gradient hero became a near-black block with warm paper text and a magenta underline.
It added a THE LATHAM top bar, a byline, a newsletter sign-up block, and a footer, all linking to thelatham.net.
It took screenshots at desktop and phone widths to check the result.
Decision worth noting: the guide content stayed word-for-word. Only the design, the credits, and two "internal guide" labels changed.
2Phase two
The idea
With the rebranded page done, the real question came up: where do these pages live?
Prompt 2 · The ideaChris
I have this idea I want to help solve: how to host a lot of single-use, single-page HTML files. It's easier to design and more mobile-friendly that way. The goal is to have everything live on one domain so that it's much more easily shared, instead of sending files. Essentially, it would be almost like a static HTML site, where the homepage is really just a directory of all the other pages. In a more visually appealing way, and each page would be its own little island, pretty much.
I'm trying to figure out the best way to set that up in Cloudflare. If you could show me how that would work, I'd appreciate it. And if that's not the best idea, please share other ways this could work best, because there are other HTML files on different topics that I want to share. I want one place to have them all hosted, saved, and easy to access from anywhere.
Key concept & purposeDescribe the problem and the outcome, not the tech. Name the platform you're leaning toward (Cloudflare), but invite pushback: "if that's not the best idea…"
"This was done in Claude using Terminal. That helped create the guide and the plan. It gave me two options, and I picked the best option to move forward with."
Chris
What Claude did
Loaded its Cloudflare skill and checked Cloudflare's current docs before recommending anything.
Recommended: Cloudflare Workers with static assets, deployed from a GitHub repo, plus a small build script that reads every page and generates the homepage automatically.
Explained the workflow: drop an HTML file in pages/, publish, and it's live. Each page's title and description become its card on the homepage.
Covered privacy: "unlisted" pages (work by link, hidden from the homepage and Google) and truly private pages behind Cloudflare Access.
Compared alternatives: Claude Artifacts, Cloudflare Pages drag-and-drop, Netlify/GitHub Pages, and R2 storage, each with a "good for" and a "downside".
Asked two questions before building: which domain, and where the project should live.
Why this mattered: Claude didn't jump straight to building. It gave a recommendation, showed the trade-offs, and asked the two questions only Chris could answer.
3Phase three
The build: empty folder to live site
Prompt 3 · Build itChris
Because this a direct to production build I want you to build the WOrkers Github reco in this folder ~/Documents/GitHub, and name the project a descriptive name. The Site URL will be https://chrismbs.link. Also include a favicon by copying this file to use [Image #2] ALso include a deescriptive page title and meta description
Key concept & purposeAnswer the open questions (folder, domain), hand over the brand asset (favicon), and set the bar. "Direct to production" means build it properly and ship it, not a demo.
What Claude did, step by step
Checked before building. Confirmed git, the GitHub CLI, and Wrangler (Cloudflare's command-line tool) were installed and logged in. Confirmed chrismbs.link was already on Cloudflare and that nothing was live on it yet, so there was nothing to overwrite.
Created the project:~/Documents/GitHub/chrismbs-link-html-library
Made the favicon set. Copied the avatar as-is, plus PNG versions made with the Mac's built-in image tool: 32px for browser tabs and 180px for iPhone home screens. WebP alone doesn't show up in every browser.
Wrote the build script (build.mjs, no outside dependencies). On every deploy it:
copies every page into the published folder
adds the favicon to any page that doesn't have one
reads each page's title, description, category, and date
generates the homepage: cards sorted newest-first, a search box, and category filters
generates a branded 404 page, a sitemap.xml, and a robots.txt
Designed the homepage and 404 in the brand colours, with a THE LATHAM sign-up block.
Wrote the page title and meta description: "Chris Latham's Library: Free Guides, Checklists & Tools", plus social-share tags and structured data for search engines.
Wrote the Cloudflare config: serve the published folder as a static site, use the 404 page for missing URLs, and attach the custom domain.
Added basic security headers.
Tested locally before going live. Ran the site on the Mac, checked every route (homepage, guide, .html → clean URL, favicon, 404, sitemap), and took screenshots at desktop and phone widths.
Wrote a README explaining how to add a page.
Saved and published the code to a private GitHub repo.
Deployed, and hit the first real snag.
Went live. Under an hour after the idea prompt.
🧱 Snag #1: "More than one account available"
The Cloudflare login had access to 11 accounts, most of them client accounts. Cloudflare's deploy tool refused to guess which one to use. Claude didn't pick one at random. It used the Cloudflare API to look up which account actually owns chrismbs.link (Chris's personal one), then pinned that account in the config, so a deploy can never land in a client's account.
🧱 Snag #2: "Could not resolve host"
After deploying, the site didn't load on Chris's Mac. Claude had checked the domain before the deploy, so the Mac had cached a "this domain doesn't exist" answer. Checking through Cloudflare's own DNS showed the site was live. The fix is to wait a few minutes or flush the Mac's DNS cache.
Small prompts, each deployed and checked live within a minute or two.
Prompt 5 · The credit lineChris
I want to adjust the page we created to say Created by Chris Latham with support of the AI Robots
Key concept & purposeBe transparent that AI helped. That fits Proof of Human: the human makes the decisions, and AI does a lot of the work.
Claude updated the byline and footer and deployed. The change took about 20 seconds to show up, because of Cloudflare's cache.
Prompt 6 · The nameChris
I want to swap the Name Chris Latham by Chris MBS Latham 🍔 include the emoji
Claude updated it in 4 places (byline, footer, author tag, meta description), then flagged that the homepage still said "Chris Latham" and asked before changing it.
Prompt 9 · Homepage creditChris
on chrismbs.link homepage I want you to adjust my name there as well for the message to say "Created by Chris MBS Latham 🍔 with support of the AI Robots"
Claude updated the homepage footer (shared with the 404 page) and the author info. It deliberately left the homepage title and Google description as plain "Chris Latham", because search results often drop emoji and that's the name people search for. It flagged that choice for Chris to decide.
5Phase five
Saving the rules
Claude Code has a memory that carries between conversations. These prompts turned one-off decisions into standing rules.
Prompt 7 · Where projects liveChris
save a note that when I am building a dev product to put it in the GItHub folder.
Prompt 8 · The correctionChris
I made a mistake not when creating a prodcut I want it in the github folder. I meant when I create a procject that is going straight to production then have it in the Github folder
Key concept & purposeTeach the assistant your filing system once, so you don't repeat it every time. Correct it as soon as the rule's wrong.
The note was rewritten: projects going straight to production go in ~/Documents/GitHub/; prototypes and experiments go in the existing dev-projects folder.
The incorrect note was deleted so the two couldn't conflict.
Claude also saved, unprompted, which Cloudflare account is Chris's, so future deploys never land in a client account.
Prompt 12 (part 2) · The page checklistChris
…Then I want you to save to memory this rule for anytime I create an html page for knowledge sharing
The saved rule: every knowledge-sharing page goes on chrismbs.link with:
a short link
a self-referencing canonical tag
a meta description without a byline
category and date tags
brand colours and fonts
the "Created by Chris MBS Latham 🍔 with support of the AI Robots" credit
links to THE LATHAM
Then it gets deployed, pushed, and verified live.
6Phase six
Short links, and the SEO lesson behind them
Prompt 10 · The redirect questionChris
where in Cloudflare or in this site can I put a redirect? WHat I am thinking is since many of the pages have long URLs I am thinking if havin a short or even SEO optimized URL path can be used to redirect to the longer URL. Just share hopw this would work with the CloudFLare worker or Astro Build
Key concept & purposeAsk for an explanation first, before building anything, and compare the options (Cloudflare vs. Astro) before committing.
Option
How it works
Verdict
1. A _redirects file
One line per redirect, lives in the repo, free, up to 2,000 fixed + 100 pattern redirects
Chosen
2. Dashboard rules
Single Redirects (10 free) or Bulk Redirects (10,000 free)
Skipped The rules live in a dashboard you have to remember to check
Astro
Redirects in astro.config.mjs
No advantage A static build makes slower in-browser redirects, and you'd end up with the same file anyway
The key lesson: a redirect doesn't make a URL rank. Google indexes the page a redirect lands on.
• Short link for sharing → 302 (temporary). You can repoint it any time.
• Better URL for Google → rename the actual page, then 301 (permanent) the old URL to it.
Prompt 11 · Build itChris
Lets go with option 1 and use the /gpt-to-plugin as a shortlink. When that is done I want to remove "By Chris MBS Latham 🍔." in the Meta Description, and include a self referencing canonical to the custom-gpt-to-plugin-migration-guide page.
What happened
Short links became a one-line tag. Each page lists its own short links, and the build writes Cloudflare's redirects file automatically:
<!-- in the page's <head> -->
<meta name="aliases" content="/gpt-to-plugin" />
Safety checks: the build stops instead of deploying if a short link is badly formatted, uses an invalid redirect code, is already taken by another page, or would hide a real page. All four failure cases were tested on purpose.
Tracking tags carry through:/gpt-to-plugin?utm_source=slack keeps the ?utm_source=slack on the final page.
Removed the byline from the meta description and added the canonical tag.
Deployed, verified live, and updated the README.
🧱 Snag #3: the trailing slash
chrismbs.link/gpt-to-plugin worked, but chrismbs.link/gpt-to-plugin/ returned a 404. Cloudflare matches paths exactly, so the build now writes both versions automatically. It was caught in testing, before anyone saw it.
Prompt 12 (part 1) · Save the explanationChris
I want you to save this explanation of redirects in a txt file in the project folder called ~/Coding/Chris Creator/Chris MBS Knowledge Sharing Site…
Saved as redirects-and-short-links-explained.txt.
7Phase seven
Sharing it
A page only matters if people open it.
Prompt 13 · Improve the Slack messageChris
I want to share the new page created in a slack chat to a group of other marketers. This is the message I sent but I find it bland can you improve the message to showcase more of the bvalue of the page. My current message sent "Anyone using CHatGPT wanting to migrate their Custom GPTs to Plugins before the cut off date. Here is a guide I put together."
Key concept & purposeShare the real message you sent, say what's wrong with it ("bland"), and say what you want instead ("showcase the value").
Claude rewrote it to lead with the December 11 deadline and the things that catch people out (Custom Actions and sharing settings don't transfer), list what's inside the guide, and use the short link.
Prompt 14 · Adjust for the audienceChris
give me another set of message examples since the poeple I am sending this to are already aware of the issue. This really is a me adding value and helping folks navigate this change
Key concept & purposeCorrect the angle. The audience already knew the news, so the message should be generous help, not an alert.
Four new versions:
"I did the homework"
"Here's a toolkit"
Short and casual
Start a conversation
Claude recommended #4 for building relationships, if the advice in it matched what Chris was actually doing. All four were saved to slack-messages-gpt-to-plugin-guide.txt.
8Phase eight
What's next
Prompt 16 · Content ideasChris
based on previous conversations we've had what else would fit on this knowledge sharing site?
Claude looked through the workspace and suggested 10 pages built from material that already exists, including:
an AI-writing-signs checklist
"How I host all my one-page guides for free" (this story)
a 301 vs. 302 explainer
AI-for-marketers lessons (flagged: check ownership if it's workplace material)
a camera-confidence checklist
Season 1 card-to-CRM tool comparisons
9Phase nine
Analytics
Prompt 17 · Add trackingChris
On the chrismbs.link site I want to add the following analytics scripts so that it loads on all pages.
Pasted: the Plausible analytics snippet and the Piqo script tag
Why two tools: Chris set up Plausible and Piqo accounts himself, outside the conversation. They're the two he's using to collect data for the long term.
"…just to get data for long term. And if I ever change anything, I'll be able to see that."
Chris
Added automatically: the build inserts both scripts into every page, including the homepage and 404, so new pages never need them pasted in.
No double-counting: if a page already has either script, the build skips adding it.
Verified live: both scripts appear exactly once on every page, and both load from their providers without errors.
A catch, explained: visits through a short link count as visits to the full page, because the redirect happens before analytics loads. Use ?utm_source= tags to see which share link people used.
→The realization
This is the home for everything
The site was originally built for one page, the GPT-to-Plugin guide. Then Chris realized it was the right home for other work he'd been building.
"The AI course marketing page—I've been working on that for a few months—so I realized it's a good place for this to live… I'd originally built this to do the custom GPTs to the plugin page. Then I realized there's a bunch of other stuff I've been working on that needs to be added here as well."
Chris
FREE AI Course for Marketers went live at chrismbs.link/ai-course-for-marketers (short link /ai-marketers) on Oct 15, giving months of work a public home. It was published in a different conversation, so its prompts aren't captured here.
→Today
How publishing works now
Once a page is finished and Chris confirms it, he just tells the AI to publish.
Copy the page into the site's pages/ folder in the GitHub project
Tag it with the standard tags: short link, canonical, category, date
Build and deploy to Cloudflare Workers
Commit and push to GitHub
Check the live page
It's live within a few minutes, with no dashboard, no file uploads, and no manual steps.
"Anytime anything gets completed on a page and I confirm, I just tell the AI to publish it, and it will copy the page to the GitHub folder. Then it will write, commit, and push it to GitHub, which will get it onto the Cloudflare workers and live within a few minutes."
Chris
Technical note: so far, every deploy has been sent to Cloudflare straight from the Terminal. Cloudflare's deployment log shows each one coming from Chris's account, not from a GitHub build. GitHub is the saved copy and history. Connecting Cloudflare's "Workers Builds" would also make a plain GitHub push deploy by itself. That's optional, since the AI deploys either way.
The final setup
chrismbs-link-html-library/ (private GitHub repo)
├── pages/ ← the only folder Chris normally touches
│ ├── custom-gpt-to-plugin-migration-guide.html
│ └── ai-course-for-marketers.html
├── public/ ← favicons, homepage CSS, security headers
├── build.mjs ← homepage, 404, sitemap, short links, favicon + analytics
├── wrangler.jsonc ← Cloudflare config, custom domain, pinned account
└── README.md ← how to add a page
Commit history: the build, as Git recorded it
When
What
Oct 14, 22:29
Initial chrismbs.link HTML page library
Oct 14, 22:32
Pin Cloudflare account that owns chrismbs.link
Oct 14, 22:39
Guide credit: "with support of the AI Robots"
Oct 14, 22:41
Guide credit: Chris MBS Latham 🍔
Oct 15, 02:36
Homepage credit updated
Oct 15, 06:02
Short links via aliases; /gpt-to-plugin; canonical + description fix
Oct 15, 07:17
Plausible and Piqo analytics on every page
Oct 15, 07:54
FREE AI Course for Marketers page (separate session)
Lessons from the build
THE BIG ONE
Past work makes future work fast
The site went from idea to live page in under an hour, and most of that speed came from work done before the first prompt. The AI didn't have to ask what the brand looked like. It looked it up.
"I already had my brand colors and guides. I already had my social links and the newsletter links saved… The work I've done in the past makes all future projects move a whole lot faster and smoother, and keeping everything on brand." (Chris)
01
Describe the outcome, not the tech
The idea prompt never mentioned build scripts or static assets. It described the problem and the result Chris wanted.
02
Ask for a recommendation, but invite pushback
"If that's not the best idea, please share other ways" got a comparison, not just a yes.
03
"Direct to production" changes the bar
Local testing, a private repo, security headers, a 404, a sitemap, and live checks, not just "it works on my machine".
04
Explain before building
The redirects question got an explanation first. The build came after Chris chose.
05
Test the edges
The trailing-slash bug and the deliberately broken short links only showed up because they were tested before deploying.
06
Look it up instead of guessing
With 11 Cloudflare accounts available, a guess could have put a personal site in a client's account.
07
Turn decisions into rules
Memory notes mean the next page follows the same checklist without re-explaining.
08
Be honest about the AI
"Created by Chris MBS Latham 🍔 with support of the AI Robots" is the Proof of Human idea in one line.
Still open
Optional: GitHub-triggered deploys (Cloudflare Workers Builds). Publishing already works through the AI. This would only matter for pushing from somewhere else, like uploading a file on GitHub from your phone.
Origin of the GPT guide itself (v1–v3): how it was first made isn't captured yet.
Homepage title and description still say plain "Chris Latham", on purpose, for search.
Automatic canonical tags for new pages: offered, not built yet.
Follow the build
I'm building real products in public, one season at a time. THE LATHAM is where I share what I built, what broke, and what the human still has to do.