Stitch any CI into Tangled
1# tack - Connect Tangled to your CI
2
3Tack is a custom [Tangled](https://tangled.org) spindle that runs
4CI on alternate providers and reports their results back
5to Tangled using standard ATProto records so they show up natively
6in Tangled's UI.
7
8## What it does
9
10Tack is a drop-in alternative to the stock `spindle` runner. You run
11`tack` and [register it using the standard UI](https://tangled.org/settings/spindles).
12
13Instead of executing workflows in local containers, tack translates each
14Tangled pipeline trigger into a 3rd party CI build, and reports build state
15back to Tangled using the existing `sh.tangled.pipeline.status` wire format.
16
17This makes even 3rd party CIs integrate first class into Tangled so their
18status, counts, etc. can show up inline in things like pull requests.
19
20```
21 sh.tangled.pipeline
22 Jetstream ───────────────────────▶ tack
23 │
24 │ Create Build
25 ▼
26 Buildkite
27 │
28 │ webhooks
29 ▼
30 tack ──── /events (WebSocket) ────▶ Tangled appview
31 sh.tangled.pipeline.status
32```
33
34```sh
35go run . -addr :8080
36```
37
38## Endpoints (planned)
39
40- `GET /events` — WebSocket stream of pipeline status events,
41 consumed by the Tangled appview.
42- `POST /webhooks/buildkite` — Buildkite webhook receiver.
43- `POST /xrpc/sh.tangled.pipeline.cancelPipeline` — cancel a running build.
44
45## Configuration (planned)
46
47| Env var | Description |
48| ---------------------- | ------------------------------------ |
49| `TACK_BUILDKITE_TOKEN` | Buildkite API token |
50| `TACK_BUILDKITE_ORG` | Buildkite organization slug |
51| `TACK_JETSTREAM_URL` | Tangled Jetstream WebSocket URL |
52| `TACK_DB_PATH` | Local SQLite path for the event log |
53| `TACK_OWNER_DID` | DID of the spindle operator |