1# spindle architecture
2
3Spindle is a small CI runner service. Here's a high level overview of how it operates:
4
5* listens for [`sh.tangled.spindle.member`](/lexicons/spindle/member.json) and
6[`sh.tangled.repo`](/lexicons/repo.json) records on the Jetstream.
7* when a new repo record comes through (typically when you add a spindle to a
8repo from the settings), spindle then resolves the underlying knot and
9subscribes to repo events (see:
10[`sh.tangled.pipeline`](/lexicons/pipeline.json)).
11* the spindle engine then handles execution of the pipeline, with results and
12logs beamed on the spindle event stream over wss
13
14### the engine
15
16At present, the only supported backend is Docker (and Podman, if Docker
17compatibility is enabled, so that `/run/docker.sock` is created). Spindle
18executes each step in the pipeline in a fresh container, with state persisted
19across steps within the `/tangled/workspace` directory.
20
21The base image for the container is constructed on the fly using
22[Nixery](https://nixery.dev), which is handy for caching layers for frequently
23used packages.
24
25The pipeline manifest is [specified here](/docs/spindle/pipeline.md).