KiCI
v0.17.0 is out — see what's new →

Public beta KiCI, pronounced /ki-ci/

CI/CD with a full dev loop your coding agent can own — on your own infrastructure.

KiCI is a complete CI/CD system that runs your pipelines on machines you control. Your coding agent can drive the whole dev loop before anything reaches your branch.

Free plan: Full features on the hosted dashboard at no cost. KiCI never receives your source or secrets.

$ git status --short
 M test/ci.test.js

$ kici run remote --workflow site-demo
Running your local working tree (overlay includes .git, so git steps work)
Run started: 52942bf8-90cf-4a89-b4fb-6c0133c4c19d
✔ the committed test passes (1.414791ms)
✔ this test is not committed, and it still ran on the agent (0.308353ms)
┌──────┬────────┬──────────┐
│ Job  │ Status │ Duration │
├──────┼────────┼──────────┤
│ test │ ✓ pass │ 1.4s     │
└──────┴────────┴──────────┘
Result: PASSED (3.0s)
Excerpt of the kici CLI's output for an example project. See the whole loop ↓

KiCI is in public beta. Pin versions for production. Report what breaks →

A full dev loop your agent can drive

An agent writes a pipeline and misspells one option key.

// .kici/workflows/site-demo.ts
import { workflow, job, step, push } from '@kici-dev/sdk';

const test = step('test', async ({ $ }) => {
  await $`pnpm test`;
});

export default workflow('site-demo', {
  on: [push({ branches: 'main' })],
  jobs: [job('test', { runOn: 'kici:os:linux', steps: [test] })],
});

The compiler says so before anything is pushed:

site-demo.ts(10,24): error TS2769: No overload matches this call.
  The last overload gave the following error.
    Object literal may only specify known properties, but 'runOn' does not exist in type 'JobOptions'. Did you mean to write 'runsOn'?
  1. kici compile --check — shows the error.
  2. Fix it.
  3. kici run remote — runs the working tree on your agents with test-scoped secrets, and streams the logs back.
  4. Push.
  5. After the push, your agent reads the run over MCP — get_run for the result, get_step_logs for the failing step — and fixes what failed.

kici run --local runs the same workflow on your laptop. Start here, or work offline.

Your agent reads the SDK as one file (kici docs llm sdk) and drives the rest over MCP. CI for coding agents → Agent guide →

Here is what kici run remote prints for that same workflow, fixed — with one test that exists only in the working tree.

$ git status --short
 M test/ci.test.js

$ kici run remote --workflow site-demo
kici v0.12.0
✓ Compiled workflows → .kici/kici.lock.json (1 workflow)
Types generated ~/site-demo/.kici/types/secrets.d.ts
Running workflow "site-demo" directly (bypassing triggers)
Creating overlay tarball...
Running your local working tree (overlay includes .git, so git steps work)
50 files changed, 0 new, 0 deleted (24.0 KB compressed)
Initializing upload...
Uploading overlay...
Run started: 52942bf8-90cf-4a89-b4fb-6c0133c4c19d
> test
> node --test
✔ the committed test passes (1.414791ms)
✔ this test is not committed, and it still ran on the agent (0.308353ms)
ℹ tests 2
ℹ suites 0
ℹ pass 2
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 84.140395

┌──────┬────────┬──────────┐
│ Job  │ Status │ Duration │
├──────┼────────┼──────────┤
│ test │ ✓ pass │ 1.4s     │
└──────┴────────┴──────────┘

Result: PASSED (3.0s)
The kici CLI's own output for an example project, rendered 2026-09-27.

Or try it on your laptop first, no account needed:

Testing CI pipelines locally →

A complete CI system

It is not a layer on another CI. Triggers, dispatch, autoscaling, secrets, approvals and the dashboard are all part of KiCI. Events come from pushes and pull requests, schedules, and any HTTP webhook. Jobs run in containers, on bare-metal hosts or in Firecracker microVMs, and KiCI scales those agents for you.

Moving off GitHub Actions, GitLab CI, CircleCI, Jenkins, or Buildkite? See how it compares, point by point:

KiCI vs GitHub ActionsKiCI vs GitLab CI/CDKiCI vs BuildkiteKiCI vs CircleCIKiCI vs DaggerKiCI vs RWX MintKiCI vs Woodpecker CIKiCI vs Jenkins
See all comparisons →

One dashboard for every pipeline your org runs

  • Run history and live logs across every orchestrator and repository, in one place. source
  • Organizations, teams and roles. Sign in with your identity provider. source
  • Approvals, deployment contexts and notifications. source
  • A webhook relay, so your orchestrators can sit on a private network behind one outbound connection. source
  • Free with full functionality. Paid tiers raise the limits. source
The KiCI dashboard's run list for an example organization, with each run's status, repository, workflow, branch, commit and duration.
The run list, shown with example data.

Your code never leaves your infrastructure

Git host · push / PR
webhook
▼
KiCI · hosted platform
Dashboard · run history · webhook relay · access

Observability and control for your whole org.

encrypted relay (WebSocket)
▼
YOUR INFRASTRUCTURE · sovereign
Orchestrator

Matches triggers, dispatches jobs, auto-scales agents.

Agents

Clone your repos, run steps, stream logs back.

Your code, secrets, and compute stay here.

What the platform holds, so your team can see it

  • webhook payloads, to route them — The platform relays each inbound webhook to the right orchestrator. It holds no webhook secrets: your orchestrator checks the signature. source
  • run status and timing — Run lifecycle metadata — status, timestamps and durations — is stored by the platform, so your team has run history. source
  • the live log stream you open in the dashboard — Live log lines pass through the platform to your browser while a run streams. The platform does not store them. source

What stays on your infrastructure

  • your source code — Your source code and cloned repositories stay on your infrastructure. source
  • your secrets — Secret values are masked before they leave the agent sandbox. Only key names appear in run metadata. source
  • your logs at rest — Log storage lives on your orchestrator, never on the platform. source
  • your build artifacts — Build artifacts are written to object storage your orchestrator owns and you configure. source

The orchestrator and agent are open source. In hybrid or independent mode your git host talks to your orchestrator directly and the platform stays your dashboard, not your trigger path. Your CI keeps running even if we stop. Open source and self-hosted →

Self-hosted vs SaaS CI/CD →

Typed pipelines your agent writes against

A pipeline is real TypeScript, so your agent writes against types and a compiler that answers it. Loops, conditionals, functions and shared steps are checked before anything runs:

// .kici/workflows/ci.ts — code, not config
import { workflow, job, step, rule, pr, push } from '@kici-dev/sdk';
import { readdir } from 'node:fs/promises';

const install = step('install', async ({ $ }) => {
  await $`pnpm install --frozen-lockfile`;
});

export default workflow('ci', {
  on: [pr(), push({ branches: 'main' })],
  jobs: [
    job('test', {
      runsOn: 'kici:os:linux',
      // discover packages at runtime — a real loop, not a hardcoded list
      matrix: async () => {
        const entries = await readdir('packages', { withFileTypes: true });
        return entries.filter((e) => e.isDirectory()).map((e) => e.name);
      },
      // matrix is typed: a single-dimension matrix exposes `value`
      steps: [install, step('test', async ({ $, matrix }) => {
        await $`pnpm --filter ${matrix?.value ?? '.'} test`;
      })],
    }),
    job('deploy', {
      runsOn: 'kici:os:linux',
      needs: ['test'],
      rules: [rule('only on main', ({ event }) =>
        event.type === 'push' && event.payload?.ref === 'refs/heads/main')],
      // each job runs on a fresh clone, so deploy installs too — reuse the step
      steps: [install, step('deploy', async ({ $ }) => {
        await $`pnpm run deploy`;
      })],
    }),
  ],
});

TypeScript vs YAML for CI/CD →

Pricing

Free forever with full functionality; paid tiers raise the limits.

Free
€0
2 orch · 3 members
30d retention
Pro
€49/mo
5 orch · 10 members
90d retention
Team
€199/mo
15 orch · 30 members
180d retention
Business
€499/mo
50 orch · 150 members
365d retention
See full pricing →

Questions

Can my coding agent run and debug my pipelines?
Yes. KiCI's hosted MCP server lets your coding agent trigger runs, read a structured result, fetch the failing step's logs, cancel, and re-run — under an agent identity you control, with every action audited.
Does KiCI see my source code or secrets?
No. Your code never leaves your infrastructure — the hosted control plane only verifies and routes webhooks, while the orchestrator and agents that touch your code run on your own servers.
Can I test a workflow before pushing?
Yes. kici run --local and kici run remote run any workflow against your current working tree — including unstaged changes — on your own machine or against the real remote pipeline, before you commit or push.
Can I write CI/CD pipelines in TypeScript instead of YAML?
Yes. KiCI workflows are real, typed TypeScript — you get type safety, autocompletion, loops, conditionals, and async/await for your pipelines.
How much does KiCI cost?
The hosted control plane is free with full functionality; paid tiers only raise the limits. You run jobs on your own infrastructure, so you provide that compute.

All questions →

Let your agent own the loop. Keep the machines.