Releases: raspbeguy/pigo
v0.1.0
First tagged release of pigo — a Go reimplementation of the Pico flat-file CMS. Drop an existing Pico content/, themes/, and config/ into pigo, point a single static binary at it, and you're serving. Pico itself reached end of life; pigo exists so you can keep running Pico sites on maintained software.
This is an early release. Breaking changes are possible between pre-1.0 versions — pin the tag, skim the notes on each bump. Core rendering is solid: both template engines work, the test suite is green under -race, and CI enforces a mechanically-measured parity diff against Pico v2.1.4.
What works
- Twig templates via stick (Twig 1.x). Sixteen upstream PRs landed to bring stick's coverage up to what real Pico themes need — ordered hashes,
spaceless,max/min,range/cycle/random/attribute,inon strings, parser fixes foris definedand chainedor, and more. Seedocs/upstream-stick-prs.mdfor the full list. - Go
html/templateas an alternative engine (template_engine: go). - Markdown via goldmark with GFM extensions enabled to match Parsedown Extra's output.
- Plugin system with events one-for-one mirroring Pico's PHP hooks. Two reference plugins ship:
PicoFilePrefixesandPicoRobots. - Structured logging via
log/slog—--log-level,--log-format text|json, onerequestline per HTTP response, 500s logged with cause. - Root-level static files (favicon.ico, robots.txt, google-verify tokens) served out of
--root/with a Pico-style deny list (config/,content/,lib/,plugins/, dotfiles). Toggleable viaserve_root_static. - Cross-platform binaries for Linux (amd64/arm64/armv7), macOS (amd64/arm64), and Windows (amd64). Each archive includes a
.sha256.
Name-surface parity with Pico v2.1.4
Mechanically checked in CI, full breakdown in docs/parity/SUMMARY.md:
- Plugin events: 28 shared, 2 pigo-only (
onThemeLoaded,onCurrentPageDiscovered). - Config keys: 20 shared, 5 pigo-only (
template_engine,log_level,log_format,serve_root_static,plugins). - Template variables: all 14 Pico vars shared, plus
pages_by_idandpage_tree. - Meta headers, Twig filters, Twig functions: full parity.
Known limitations
- Pico's PHP plugins do not load — port to Go against the same event names.
docs/porting-pico-plugins.mdwalks through a full port. - Markdown output isn't byte-identical to Parsedown Extra; whitespace and a few extended constructs can differ.
- The root-static deny list compares paths as-is; case-insensitive filesystems (macOS HFS+, Windows NTFS) need a webserver in front.
Install
Prebuilt binary from this release, or from source with Go 1.26+:
go install github.com/raspbeguy/pigo/cmd/pigo@v0.1.0
pigo --root /path/to/your/pico/site --addr :8080Acknowledgements
Thanks to @tyler-sommer for reviewing and merging sixteen PRs against stick — pigo's Twig story rests entirely on that work. And to @PhrozenByte and the PicoCMS contributors for a CMS worth preserving.