Halcyon / CI observability
Your pipeline, explained.
Halcyon watches your existing CI and tells you, in one sentence, why the build broke. No agent to install, no YAML to rewrite, no new place to look.
npx halcyon watch --repo .
$ halcyon explain --last
SVG storytelling
Watch it think
Four stages, two branches, one summary. This is the diagram Halcyon builds from your existing config — it is not a picture of a pipeline, it is your pipeline.
01
Source
Commit lands. Halcyon reads the diff, not just the SHA, so it knows which jobs can be skipped.
02
Build
Two targets in parallel. Cache hits are reported as hits, not as suspiciously fast builds.
03
Test
The branch that fails most. Flaky tests are marked as flaky from history rather than re-run three times in hope.
04
Deploy
Gated on the two above. If it is blocked, the reason is one sentence at the top of the page.
Nineteen minutes, and where they go
Four stages, and one of them is not work — it is a queue. No dashboard on the market shows a team the shape of their own wait, because the shape is embarrassing and the vendor is selling the runner.
- Queuednot workWaiting for a runner6m 42s
- CheckoutClone, submodules, cache restore1m 36s
- Build · linuxCompile and link3m 34s
- Build · darwinCompile, link, sign4m 28s
- Test1,284 tests across 6 shards2m 11s
- DeployGated, then thirty seconds33s
Median pipeline · 19m 04s · measured over 30 days
Features
Three things, done properly
Root cause, not log tail
Halcyon reads the failure the way you would: it finds the first error, not the last line, and shows you the four lines around it with the rest collapsed.
Flake detection that is honest
A test that passed on retry is marked as flaky and counted. No green tick for a build that needed three attempts, because that tick is a lie you will pay for later.
Minutes, attributed
Which jobs burn your runner minutes, ranked, with the cache-miss rate beside them. Usually two jobs are eighty per cent of the bill.
Comparison
Before and after
Your CI log
✗ 1 of 1,284 tests failed at Object.<anonymous> (src/lib/parse.ts:118:11) at Module._compile (node:internal/modules/cjs/loader) at Object.Module._extensions..js (node:internal/modules) ... 412 more lines ##[error]Process completed with exit code 1.
Halcyon
- parse.ts:118 threw on an empty header row.
- Introduced by a6f21c3 — "skip blank rows" — 14 minutes ago.
- Not flaky: failed 3 of 3 runs on this branch, 0 of 200 on main.
- Suggested: guard `rows[0]` before the destructure on line 118.
Integrations
It watches what you already have
Read-only, via the API you already pay for. Nothing runs inside your pipeline.
- Orbit CIWebhooks + REST
- ForgeChecks API
- Kiln BuildPolling
- RelayWebhooks
- StacklineREST
- AnvilWebhooks
Details
The boring details
- Access
- Read-only token. We never write to your repository.
- Retention
- Ninety days of runs, then aggregate only.
- Data residency
- EU or US, chosen at signup, not changeable after.
- Runtime
- Nothing installed in your pipeline. No agent, no action, no step.
- Export
- Everything, as JSON, from the dashboard, at any time.
Pricing
Pricing
Per repository, not per seat. Invite whoever needs to look.
Solo
Free
one repository
- Root-cause summaries
- Thirty-day retention
- One integration
Team
$18
per repository, per month
- Everything in Solo
- Flake detection and history
- Runner-minute attribution
- Ninety-day retention
- Unlimited members
Org
$14
per repository, per month, from 20
- Everything in Team
- SSO and audit log
- Data residency choice
- Priority support
A calm layer over your CI
Point it at a repository and it will have something useful to say within one build.
Watch a repositoryConcept work — fictional brand, built to demonstrate technique. Nothing is for sale.