paulobrien.dev

Set-up guide

Set up your blog. Step by step.

Installing your blog takes a few minutes. You need a free Cloudflare account, and a domain on Cloudflare if you want your own web address (you can add one later).

1Before you start

  1. A Cloudflare accountYour blog runs on your own account. If you don't have one, sign up free at dash.cloudflare.com/sign-up. The Mail App guide walks through it.
  2. Storage switched onYour blog keeps its pictures in Cloudflare's storage (R2). Open R2 in your Cloudflare dashboard and switch it on. Cloudflare asks for a payment card once, even for its free allowance, which is plenty for a blog's pictures.
  3. A domain (optional)To use your own web address, the domain needs to be on your Cloudflare account. If not, you can start on a free workers.dev address and add your domain later.
Cloudflare costs: Blog Builder runs on Cloudflare's free plan. For busier blogs I recommend Cloudflare's Workers Paid plan ($5 a month, paid to Cloudflare).

2Install your blog

There are three ways. All of them install into your own Cloudflare account, and updating later keeps your posts and settings.

The installer (recommended)

You need Node.js 20 or later on your computer, and a Cloudflare API token.

  1. See what token to makeRun the help command below. It lists the permissions your Cloudflare API token needs.
  2. Make the tokenIn Cloudflare, open My Profile › API Tokens, choose Create Token, then Create Custom Token and tick the permissions the help listed. The token is only ever sent to Cloudflare.
  3. Run the installerRun the setup command. It asks which domain and theme you'd like, then makes the database, storage and web address.
  4. Keep the link it gives youWhen it finishes, it gives you a one-time link to make your admin account. Only that link can finish the set-up, so nobody else can claim your blog first.
~/blog-builder
  1. npx @mrpwob/blog-builder help
  2. npx @mrpwob/blog-builder setup
# help lists the Cloudflare token to make. the README has the details.

Deploy to Cloudflare

One click copies Blog Builder to your GitHub account, makes its database and storage in your Cloudflare account and builds it there. The first build takes several minutes. It asks for two things:

  1. THEMEThe theme to start with, such as notebook. You can switch later in the admin.
  2. SETUP_TOKENA long secret code you make up. Replace the example code: it won't work, so set-up stays locked until you choose your own.

When it's deployed, open https://your-blog-address/setup-link?setup=your-code to make your admin account. Only someone with the code can finish the set-up.

Deploy to Cloudflare

From the code

Building Blog Builder builds EmDash too, so it takes a few minutes and needs git, Node.js 22 and about 6 GB of memory. The README has every step.

3Set up your blog and write your first post

  1. Open your set-up linkUse the one-time link from the installer, or your setup-link address if you used the Deploy button. Until you've finished, nobody else can set up your blog.
  2. Name your blog and sign inGive your blog a name and create your admin sign-in with a passkey (your phone, fingerprint or computer password). There's no password to remember.
  3. Write your first postYou're now in your blog's admin, at your blog's address followed by /_emdash/admin, so bookmark that. Choose Posts, then New, write your first post and press Publish.
Changing theme: open Plugins › Blog Builder › Settings in your blog's admin. Your posts, pictures and settings stay as they are.

4Use your own domain

If you started on a free address, you can move to your own domain at any time. The domain needs to be on the same Cloudflare account.

  1. Add the addressIn your Cloudflare dashboard, open Workers & Pages, choose blog-builder, then Settings › Domains & Routes and add your address, for example blog.yourdomain.co.uk.
  2. Wait for itWait until https://blog.yourdomain.co.uk/_emdash/admin opens your blog's sign-in page.
Passkeys: a passkey only works at the address where it was made. If you can, add your own domain before you make your admin account.

5Move from WordPress

  1. Export WordPressIn WordPress, open Tools › Export, choose All content and download the export file (it ends in .xml).
  2. Start the importIn your blog's admin, open Import and choose WordPress.
  3. Upload the fileYour blog shows what it found: posts, pages, categories, tags, authors and pictures.
  4. Import itCheck the plan and press import. Your blog then copies your pictures across and updates the links to them.

Want drafts and comments too? Install the free EmDash Exporter plugin on your WordPress site, then connect it from the same Import page. It also brings across menus, your logo and your site icon.

Moving from Ghost? Blog Builder can import a whole Ghost site, and bring your subscribers from Mailchimp, Substack, Ghost and others.

WordPress is a trademark of the WordPress Foundation. Blog Builder isn't connected with or endorsed by WordPress.

6Count your readers with ReaderCount

ReaderCount is private, cookie-free stats. It comes built into your blog, so there's no code to paste. It's optional.

  1. Add your blogAdd your blog's web address to your ReaderCount account.
  2. Switch it onIn your blog's admin, open Plugins, choose ReaderCount, switch on Count visitors and save.
  3. See your statsCounting starts with the very next visit. Open your stats at app.readercount.com.

7Connect Claude or another AI assistant

Your blog has its own AI connector, so an assistant can draft posts, fix typos, tidy categories or schedule a post for you. It signs in through your blog, and you choose what it may do. Nothing goes through me.

  1. Your connector addressYour blog's address followed by /_emdash/api/mcp, for example https://blog.yourdomain.co.uk/_emdash/api/mcp.
  2. ClaudeOpen Settings › Connectors, choose Add custom connector, paste the address and press Add. Claude opens your blog so you can sign in and choose what it's allowed to do.
  3. ChatGPT and othersAdd the same address as a remote MCP server in their settings.
  4. Try asking“Show me my five latest posts” or “Draft a post about my summer holiday and save it as a draft”.

For developers: your blog also has a REST API at /_emdash/api/ with a full OpenAPI description. Create access tokens for scripts and automations in your blog's admin; each one can only do what you allow.

8Updates

The Blog Builder page in your blog's admin tells you when a new release is out. Your posts, pictures and settings stay as they are when you update.

  1. Installed with the installerRun the update command below.
  2. Installed with the Deploy buttonPull the latest code into your GitHub copy (GitHub's Sync fork) and Cloudflare rebuilds it.
  3. Installed from the codeRun git pull, then npm install, npm run build, npm run package and npm run update.
  1. npx @mrpwob/blog-builder@latest update

What's new in each version is in the release notes.

9Frequently asked questions

Who owns my blog?

You do. It runs on your own Cloudflare account, and your posts, pictures and readers' data stay there. Nothing comes to me.

What happens if you stop working on Blog Builder?

Your blog keeps running. It doesn't depend on me to work, and the code is open source, so anyone can carry on with it.

What will Cloudflare charge?

Your blog runs on Cloudflare's free plan. For busier blogs I recommend Cloudflare's Workers Paid plan ($5 a month, paid to Cloudflare).

What is it built on?

Blog Builder is based on EmDash, open-source blogging software (MIT licence). I add the installer, 16 themes, the built-in plugins and easy updates. It isn't made, endorsed or supported by Cloudflare.

My set-up link doesn't work

Each install or update makes a fresh set-up link, so only the newest one works. Run the installer again to get a new one. If you used the Deploy button, check the code in your link matches the SETUP_TOKEN you chose, and that it isn't the example code.

The installer says storage isn't switched on

Open R2 in your Cloudflare dashboard and switch it on, then run the installer again.

Where can I get help?

Bugs go in GitHub issues and questions in GitHub Discussions, where everyone can see the answers.

10Remove your blog

Your blog is made of four parts on your Cloudflare account. To remove it, delete them in your Cloudflare dashboard:

  1. Workers & PagesThe Worker blog-builder (your blog itself).
  2. D1The database blog-builder (posts, pages and settings).
  3. R2The bucket blog-builder-media (your pictures). Empty it first.
  4. KVThe namespace blog-builder-sessions (sign-in sessions).
Keep a copy first: in your blog's admin you can export the whole site before you delete anything. Deleting is permanent.

Stay in the loop

Subscribe for updates.

Leave your email and I'll tell you when there's a new version of one of my apps, or a new project to try. Nothing else.

That didn't work. Please check your email address and try again.

One email to confirm. Unsubscribe with one click. Your address is only used for these updates.