blogflow.io

Compact Go blog engine โ€” git-driven content, distroless container.

Just add markdown.

$ docker pull ghcr.io/khaines/blogflow:latest click to copy
~18 MB
binary size
< 25 MB
container image
< 100 ms
startup time
๐Ÿ“

Git-Driven Content

Push markdown to a git repo. BlogFlow syncs and serves. No build step.

๐Ÿง…

Overlay Filesystem

Theme โ†’ content โ†’ config โ†’ embedded defaults. First match wins. Override anything.

๐Ÿ”’

Distroless Container

Nonroot (UID 65532), read-only root FS, no shell, no package manager.

๐Ÿ“ก

Four Sync Strategies

Watch (dev), webhook (instant), sidecar (K8s), poll (HA). Pick what fits.

๐Ÿ“Š

Prometheus Metrics

RED metrics, overlay FS counters, Grafana dashboard included.

โš™๏ธ

Runtime Config Reload

Update site.yaml, BlogFlow picks it up. Zero-downtime reconfiguration.

Get started in seconds

  Run with Docker
# A working blog with embedded sample content
docker run -p 8080:8080 ghcr.io/khaines/blogflow:latest
  Add Your Content
# docker-compose.yaml
services:
  blogflow:
    image: ghcr.io/khaines/blogflow:latest
    ports:
      - "8080:8080"
    volumes:
      - ./content:/data/content:ro
  Deploy to Kubernetes
# Install with Helm โ€” sidecar, webhook, or watch strategy
helm install blogflow deploy/helm/blogflow/

# Or apply plain manifests
kubectl apply -f examples/k8s/sidecar/
  Configure
# site.yaml โ€” only override what you need
site:
  title: "My Blog"
  base_url: "https://blog.example.com"
  description: "Thoughts on code and craft"

sync:
  strategy: webhook

cache:
  enabled: true