Broadside

I wanted three things that should have been one thing.

A blog I actually own. An app on my phone so I can post from wherever I happen to be standing. And a way to write something once and have it turn up on the places people read, without me copying and pasting it four times.

None of that is exotic. All of it exists. The problem is that it exists as three separate subscriptions from three separate companies, and every one of them wants a monthly payment for the privilege of holding my own writing. Paying rent on the thing I wrote seemed like a strange arrangement to accept, so I stopped accepting it.

Broadside is what came out of that.

What it actually is

A blog that stores your posts as plain text files in a folder.

That is the whole idea, and everything else follows from it. There is no database. There is no build step. There is no plugin system, no theme marketplace, no admin panel with forty tabs. You write a post and it appears, because the site reads the folder.

The files sit in dated directories:

site/
├── posts/      2026/08/09/01-broadside.md
├── uploads/    2026/08/09/01-diagram.png
└── core/       config.json, credentials, revisions

Sort those paths alphabetically and they come out in chronological order, which is a small thing that makes a lot of other things easy.

The server is one Go binary. No runtime to install, no interpreter, no package manager. The container image is built FROM scratch, which means it contains the binary and nothing else at all — no shell, no libc, nothing to patch and nothing for anybody who breaks in to run. It comes to about fifteen megabytes and sits at roughly eight megabytes of memory while serving pages. That is measured, not guessed. It runs happily on a Raspberry Pi.

Your content folder is the only thing on the host. Back that one folder up and you have backed up the site: settings, credentials, posts, images, revision history. There is no export feature because there is nothing to export from. If you want to leave, you copy a directory. That is the entire exit plan, and I think a project should be honest about having one.

The part I actually cared about

Every post, every image, every setting is reachable over an HTTP API with a bearer token.

That sounds like a developer feature and it is really not. It is the reason the project exists. It means n8n or Node-RED can publish to my blog, and once a workflow can publish to my blog, it can pick that post up and push it wherever else I want it to go. Write once, let the automation do the tedious part.

That is the piece nobody sells you as part of a blog. Hosted platforms will happily give you a nice editor and then charge extra for the integrations, or offer none at all and expect you to keep doing it by hand. Here it is just the API the app itself uses. There is no privileged private interface — the app talks to the same endpoints your automation does, and anything the app can do you can do with curl.

The cross-posting workflows are the next thing I am building. The hooks they need are already in.

The app

There is now an iOS app, Broadside Blog, and it is native rather than a website in a jacket.

It has a block editor built for a thumb: paragraphs, headings, quotes, lists, code, pictures. Drag a block when the order comes out wrong. Add a second photograph to a picture block and it quietly becomes a gallery your readers can swipe through, because when you add the first one you rarely know yet whether there will be a second.

Uploads keep going after you leave the app. That sounds like a footnote until you have tried to send a stacked astrophotography frame over a home connection. Those run to several hundred megabytes and take minutes, and an upload that dies the moment you switch apps is not an upload at all. The transfer gets handed to the system, so you can put the phone in your pocket and it finishes on its own.

Drafts, scheduling, tags, and your site’s colours are all in there too. Free, no adverts, no analytics, no tracking, no account to create. The app talks to your server and to nothing else, because there is nowhere else for it to talk to — I run no servers that could collect anything even if I wanted to.

Installing it

One command:

docker run -d --name broadside \
  -p 5555:5555 \
  -v /path/to/your/site:/site \
  --user 1000:1000 \
  --restart unless-stopped \
  noxegenus/broadside:latest

Open it, and the first page asks you to create your account. Nothing is reachable until you do.

There is no reverse proxy inside the container, on purpose. If you want TLS and a domain you almost certainly already run Caddy or nginx or Traefik, and a second proxy inside the container would just be two proxies in a row. Point the one you have at port 5555 and add --behind-proxy so the login rate limit counts against the right addresses.

On Unraid, set PUID=99 and PGID=100 or the container will not be able to write to your share. That one catches everybody.

I will not pretend this is a thirty second sign-up. Standing up a server is an evening of work the first time. If you want to be typing in the next minute, a hosted platform is genuinely the better answer and I would rather say so than waste your evening. What you get for that evening is a blog that is still yours in ten years, that does not hand your readers to somebody else’s tracking, and that you can pick up and move whenever you feel like it.

Where everything lives

All of it is MIT licensed. The server is free, the app is free, and there is no paid tier waiting in the wings.

What it deliberately does not do

Broadside is not a CMS and is not trying to grow into one. No page builder, no plugin marketplace, no theme templating language, no comment system, no newsletter, no membership billing. Each of those is a real product on its own, and bolting them on is exactly how simple software stops being simple.

Theming is six colours and a couple of typefaces in a config file. If you need more than that you probably want a different tool, and that is a perfectly fine outcome.

I built this because the thing I wanted did not exist as one piece, and renting it in three pieces was absurd. It exists now. If it is useful to you as well, take it.

Orion Nebula

This was my first shot of the Orion Nebula with my new camera. Overexposed, and blown out, but it still looked pretty cool!