Why this site is one Go binary and a folder of AsciiDoc

#meta#golang#asciidoc#cloudflare

This site has no JavaScript framework, no bundler, no node_modules, and no database. It is a single Go binary that reads a folder of AsciiDoc files and writes a static site, which is then served from Cloudflare's edge for free.

The whole pipeline

Stage Tool

Authoring

Any editor, plain .adoc files

Rendering

~600 lines of Go, asciidoctor-go

Templates

Go html/template, embedded in the binary

Hosting

Cloudflare Pages, free tier

Publishing a post means dropping one file in content/posts/ and running one command. The binary handles the rest: clean URLs, RSS, sitemap, Open Graph tags, and JSON-LD structured data.

What AsciiDoc gives me that Markdown does not

  • Real document headers: title, revision, author, custom attributes

  • Tables, admonitions, callouts, and section cross-references

  • Built for technical writing, which is what lives here

A sample block, rendered by the same converter that renders this page:

// the entire publish loop
func Deploy(root string) error {
    if err := Build(root, false); err != nil {
        return err
    }
    return wrangler(root, "public") // direct upload to Pages
}
Tip
Posts marked with the draft attribute are excluded from production builds but visible while drafting locally. No draft branch juggling.

Why Cloudflare Pages

Direct Upload means the deploy is just an authenticated API push of the public/ folder. The git repository stays private and is only a source of truth for content, not a deploy trigger.

More on the Cloudflare Pages docs if you care. Meanwhile, there is an about page and a projects page.