THE LATHAM Subscribe → thelatham.net
Proof of Human · Build log

How chrismbs.link was built

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.

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 ideaOne domain to host lots of single-page HTML files, with a homepage that works as a visual directory
The resultchrismbs.link: a searchable, branded library with a self-building homepage, short links, analytics, and a favicon
Built withClaude Code (Claude running in the Mac Terminal)
Why so fastThe groundwork already existed: brand colours, brand guides, social and newsletter links, all saved and ready to reuse
StackHTML 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.

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

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

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
Image attached: Chris's cartoon avatar (cl-favicon.webp)
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

  1. 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.
  2. Created the project: ~/Documents/GitHub/chrismbs-link-html-library
  3. 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.
  4. 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
  5. Designed the homepage and 404 in the brand colours, with a THE LATHAM sign-up block.
  6. 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.
  7. Wrote the Cloudflare config: serve the published folder as a static site, use the 404 page for missing URLs, and attach the custom domain.
  8. Added basic security headers.
  9. 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.
  10. Wrote a README explaining how to add a page.
  11. Saved and published the code to a private GitHub repo.
  12. Deployed, and hit the first real snag.
  13. 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.

Prompt 4 · "What's the URL?"Chris
what would be the url of the page we uploaded

The answer was chrismbs.link/custom-gpt-to-plugin-migration-guide. The file name minus .html becomes the URL.

4Phase four

Polish: credits and naming

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.
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:

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.
OptionHow it worksVerdict
1. A _redirects fileOne line per redirect, lives in the repo, free, up to 2,000 fixed + 100 pattern redirectsChosen
2. Dashboard rulesSingle Redirects (10 free) or Bulk Redirects (10,000 free)Skipped
The rules live in a dashboard you have to remember to check
AstroRedirects in astro.config.mjsNo 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

<!-- in the page's <head> -->
<meta name="aliases" content="/gpt-to-plugin" />

🧱 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:

  1. "I did the homework"
  2. "Here's a toolkit"
  3. Short and casual
  4. 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:

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
→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.

  1. Copy the page into the site's pages/ folder in the GitHub project
  2. Tag it with the standard tags: short link, canonical, category, date
  3. Build and deploy to Cloudflare Workers
  4. Commit and push to GitHub
  5. 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

WhenWhat
Oct 14, 22:29Initial chrismbs.link HTML page library
Oct 14, 22:32Pin Cloudflare account that owns chrismbs.link
Oct 14, 22:39Guide credit: "with support of the AI Robots"
Oct 14, 22:41Guide credit: Chris MBS Latham 🍔
Oct 15, 02:36Homepage credit updated
Oct 15, 06:02Short links via aliases; /gpt-to-plugin; canonical + description fix
Oct 15, 07:17Plausible and Piqo analytics on every page
Oct 15, 07:54FREE 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

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.

Read THE LATHAM →