Project estate
Projects
The current PHP Boy Scout project estate: tools, libraries, infrastructure modules and the sites they support.
Toolkits and Frameworks
The foundations I build other things on.
go-tool-base
Framework
The underpinnings for any Go command-line tool, and (as a few of my projects now prove) for comprehensive web services too. It standardises the boilerplate and wiring you end up writing in every Go project, and puts config, logging, self-update, a DI container and the rest straight at your fingertips. Highly opinionated, and it makes some calls people will disagree with, but it works, and it works really well. The CLI it ships with is a big part of that: keeping a Go app built, updated and maintained becomes almost trivial.
rust-tool-base
Framework
The Rust counterpart to go-tool-base, and deliberately not a straight port. Rather than copy the Go version wholesale, it reimagines the same idea through Rust idioms and off-the-shelf crates, while keeping a common signature and feature set so the two feel familiar if you switch between them. The same streamlined developer experience, done the Rust way.
Layered Configuration
The config module and the family of small adapters around it. Read and write configuration in any format, from any filesystem, and from dynamic backends like Consul, all as one layered store that can tell you where every value came from.
config backends
Dynamic backend adapters
Remote systems as first-class layers, with the same precedence and provenance a file gets, and write-back wherever the system allows it safely.
config-aws-ssm
GoBackend
Read AWS SSM Parameter Store as a layer. Read-only: Parameter Store has no compare-and-swap write.
config-azure-appconfig
GoBackend
Read and write Azure App Configuration, each write guarded by the setting's ETag.
config-consul
GoBackend
Read and write HashiCorp Consul, with structure-preserving compare-and-swap writes.
config-gcp-secret
GoSecret backend
Read secrets from Google Cloud Secret Manager as a config layer.
config-keychain
GoSecret backend
Read and write sensitive values in the OS keychain as a config layer, so a CLI's tokens never sit in a plain file on disk.
config-vault
GoSecret backend
Read secrets from HashiCorp Vault as a config layer, with the client injected so you own how it authenticates.
config filesystems
Filesystem adapters
Read and write config files from filesystems other than the local disk: compiled into the binary, on a remote host over SSH, or in a cloud object store. config.OS() and config.Dir ship in the core.
config-afero
GoFilesystem
Bridge an afero filesystem a consumer already holds to config's own FS interface.
config-aws-s3
GoFilesystem
Read and write a config file that lives in an AWS S3 bucket, staged and renamed over for an atomic commit.
config-azure-blob
GoFilesystem
Read and write a config file in an Azure Blob container, through the same stage-and-rename machinery a local file uses.
config-billy
GoFilesystem
Read and write config through a go-billy filesystem a tool already uses.
config-gcp-gcs
GoFilesystem
Read and write a config file in a Google Cloud Storage bucket, atomic per object.
config-iofs
GoFilesystem
Read config from any io/fs.FS, including an embed.FS compiled into the binary. Read-only, as io/fs is.
config-sftp
GoFilesystem
Read and write config on a remote host over SFTP, staged and renamed over so a reader never sees a half-written file.
config formats
File format adapters
One small module per file format, so you only compile the parsers you use. YAML is built into the core.
config-hcl
GoCodec
Read and write HCL, treating it as a configuration format in its own right, not Terraform.
config-json
GoCodec
Read and write JSON and JSON Lines, preserving the document's structure on write.
config-properties
GoCodec
Read Java .properties configuration, read-only with no added dependency.
Framework-Independent Go Modules
Go packages that stand on their own, without needing the full go-tool-base framework around them. Many were extracted from the framework once they proved reusable.
errors
Error package
The error package the estate owns: stack traces, user-facing hints, structured attributes for logging, and an aggregate that behaves like the standard library's, so nothing goes missing below a Join. It imports nothing outside the standard library, and a test enforces that.
Networking and Transport
The framework-free networking layer: servers, clients, the middleware they share, and the TLS and auth that hold them together.
transport-metrics
Metrics
Cardinality-safe Prometheus instrumentation: a scrapeable /metrics endpoint (Go runtime, process and build-info collectors), optional pprof, mounted on your server or standalone. The pull/scrape counterpart to the OTel observability module; go/transport, gRPC and OTel isolated in opt-in subpackages.
AI Building Blocks
Provider-neutral AI modules and the adapters that make them useful without tying the rest of the toolchain to one vendor.
chat
AI client
A light, framework-free multi-provider AI chat client with provider support kept opt-in.
chat-platform
Chat platform contract
Receive, reply and moderate across chat platforms with no vendor SDK in the core. The other side of the chat modules: those talk to models, this one talks to the people.
chat-platform-discord
GoProvider
The Discord provider: read channels, reply in threads, moderate and run slash commands.
Rust Toolkit
The Rust sibling of the go-tool-base module set: small, independently-versioned crates extracted from rust-tool-base, each usable on its own.
cli
CLI runtime
The CLI runtime family: a four-crate workspace on one version line. rtb-cli builds the application; the others each register a built-in command into the same link-time registry.
Media and Creative Tools
Tools for publishing, reels, photography and media processing.
afmpeg
Media library
FFmpeg in pure Go with no install, no CGO and no disk: a WASM build of FFmpeg running over a virtualised, in-memory filesystem, so media processing ships as a single binary and stays sandboxed. That virtual FS layer is a big part of the appeal, and the whole thing sits behind one clean Go interface, no dropping to a shell, no wrangling CGO bindings. A native FFmpeg backend is on the way too, for the performance edge cases where you can trade the security posture for speed, and it speaks the very same interface.
keryx
Publishing studio
Keryx is ancient Greek for 'the herald', which is precisely the job. A little utility I built for myself because I'm dreadfully bad at social media: point it at the page bundle for one of these blog posts and it turns that into a sharp piece of short-form media, ready to post to the platforms I want to be on.
krites
Photography tool
Krites is ancient Greek for 'the judge', and judging photographs is the whole job. I built it for an audience of one, my wife: a simple, UI-driven tool (not a command line in sight) that helps her rip through culling 4,000-plus wedding images to her own standards. It leans on local ML rather than a cloud-AI subscription, so it works wherever she is, signal or not. It's since grown an optional AI critic as well, expert feedback on composition, colour and technique, there to help her learn rather than to do the judging for her.
krites-models
Python / ONNXModel provisioning
The signed, checksum-pinned, provenance-tracked ONNX models krites downloads: fetched from upstream, converted, parity-verified, then signed as one release with a record of each model's source, version and licence.
Release Trust and Delivery
The plumbing that signs, verifies, builds and ships the rest.
CI images
Build images
Public container images that keep the toolchain repeatable across software and infrastructure projects.
claude-code-plugins
Plugin marketplace
A Claude Code plugin marketplace for the reusable skills, guardrails and workflow habits I use across my projects.
forge
Release ops
Forge release operations: a provider contract, registry and credential chain, with no vendor SDK in the core. Each forge is a swappable provider module.
homebrew
Package tap
The Homebrew tap for phpboyscout tools, used to distribute the binaries that come out of the release pipeline.
signing
Library
A small, standalone module for creating and verifying signatures on files. I pulled it out of go-tool-base so it stays lightweight and anything can use it, not just go-tool-base projects: it's what signs the CLI binaries and the ffmpeg-wasm bundle I distribute. It works through pluggable backends, so the key can live somewhere like AWS KMS rather than on disk, with Google Cloud, Azure and HashiCorp Vault to follow.
signing-aws-kms
GoBackend
The AWS KMS backend for the signing module, keeping private release-signing keys inside KMS while the public API stays framework-free.
Community and Support
Tools that sit between the projects and the people using them.
Infrastructure Modules
Public OpenTofu modules. The private repos that consume them stay private and are deliberately not listed here.
terraform-aws-gitlab-runner-fleet
CI runner fleet
A GitLab Runner fleeting fleet on AWS: one always-on manager plus scale-to-zero spot workers on the docker-autoscaler executor. Built to replace cattle-ops/gitlab-runner and expose the levers it hid, including worker disk size and a shared cache layer.
Sites
Static sites with their own audiences and visual identities. Public site links only; private source repositories are intentionally not linked.
PHP Boy Scout blog
Blog
This site: the home for the project write-ups, leadership pieces, tutorials and the occasional personal essay.
Shutter & Stove
Photography / recipes
Hailey's vanlife photography and galley-kitchen cooking site, built ahead of the 2027 trip so the shape exists before the content does.






