← Portfolio Working prototype

RiverRoot

A small self-hosted CI server in Go that runs each pipeline step on the host or in a container, and shows the builds in a dashboard.

Context
Personal learning project. It started as Mini CI and was renamed and rebuilt as RiverRoot.
Stack
Go 1.26, Docker Go SDK, SQLite, YAML pipeline definitions, an embedded HTML dashboard.
Role
Sole author

At a glance

Prototype
Status: working prototype
34/36
Go tests passing on macOS; the other two trip on a temp-path symlink
6
Packages: API, Git, pipeline, runner, store, and the command
24 Sep 2026
Tests run and vetted
01

What it is

RiverRoot is a continuous integration server small enough to read in one sitting. I wrote it to understand what happens between a push and a green check.

You describe the steps in pipeline.yaml. Triggering a build, from the dashboard or with POST /builds, runs each step as a host process or inside a Docker container and saves the result with its output in SQLite.

02

What is implemented

  • Steps run in order; consecutive steps marked parallel run together as one batch.
  • A step with an image runs in a Docker container through the Go SDK, with the repository mounted at /workspace. Other steps run through bash on the host. Every step gets a five-minute timeout.
  • The build stops at the first failure, and a step that could not start is recorded separately from one that ran and failed.
  • Builds and their steps are saved in SQLite, one transaction per build.
  • A REST API (GET /builds, GET /builds/{id}, POST /builds) and a dashboard embedded in the same binary. Demo mode seeds example builds and turns off POST /builds.
  • Built and tested, but not yet started by the server: a Git poller that detects new commits and changed files, and a per-build log store that can follow output as it is written.
03

Screens

The RiverRoot dashboard: five builds, three passed and two failed, with the selected build’s lint, test and build steps and their output.
From the repository README. The public demo on GitHub Pages shows five seeded builds, not live runs.
04

Verification

Checked on 24 Sep 2026 with Go 1.27 on macOS: go vet reports no problems, and 34 of 36 tests pass across the API, Git, pipeline, runner and store packages.

The two failing runner tests compare working directories. The command prints the temporary directory as /var/… and the test expects the resolved /private/var/…, which is the same folder through a macOS symlink. The tests need fixing, not the runner.

05

Limitations

  • Builds start by hand, and POST /builds runs the whole pipeline before it responds. Output appears once the build finishes, not line by line.
  • The API and dashboard have no authentication, so it is for local use only.
  • The public demo is a static page with seeded data; the server itself is not hosted.
GitHubRiverRoot: source and READMEOpen ↗GitHub PagesRiverRoot: static demo with seeded buildsOpen ↗