KiCI
v0.8.0 — kici run --local no longer times out on the first run after a cold plane start →

CI/CD in typed TypeScript, with a dev loop on your real infrastructure.

Write pipelines in real TypeScript, not YAML. Run your working tree, uncommitted changes included, on your own agents with kici run remote and watch the logs stream back. Start on your laptop with kici run --local. KiCI's hosted platform gives your whole team the dashboard, history and access control. It never receives your source or secrets.

Run a pipeline locally Read the docs

Type errors before you push. Real runs before anyone reviews.

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 — 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.

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

Your coding agent can read the SDK as one file (kici docs llm sdk) and drive KiCI over MCP. Agent guide →

Here is that same workflow, fixed, running on real agents — 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.8.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)
55 files changed, 0 new, 0 deleted (46.2 KB compressed)
Initializing upload...
Uploading overlay...
Run started: 00000000-0000-0000-0000-000000000000
> test
> node --test
✔ the committed test passes (1.195345ms)
✔ this test is not committed, and it still ran on the agent (0.333915ms)
ℹ tests 2
ℹ suites 0
ℹ pass 2
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 106.56215
npm notice
npm notice New major version of npm available! 11.19.1 -> 12.0.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2
npm notice To update run: npm install -g npm@12.0.2
npm notice

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

Result: PASSED (7.9s)
A real run, captured 2026-09-12. Hostnames, ids, tokens and local paths are scrubbed; nothing else is edited.

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

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 checks each inbound webhook signature and relays the payload to the right orchestrator. 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 →

Your pipelines are programs. Write them like one.

Real TypeScript gives you types, loops, conditionals, functions, and reuse — discover work at runtime, share steps across jobs, and gate deploys with real code:

// .kici/workflows/ci.ts — code, not 
v/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`;
      })],
    }),
  ],
});

An open alternative to the CI you already run

Moving off GitHub Actions, GitLab CI, CircleCI, Jenkins, or Buildkite? KiCI gives you push-to-run pipelines in real, typed TypeScript — running on your own infrastructure, with a hosted dashboard for visibility. See how it compares, point by point:

GitHub ActionsGitLab CI/CDBuildkiteCircleCIDaggerRWX MintWoodpecker CIJenkins
See all comparisons →

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

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 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.
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.
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.
Does KiCI automatically scale build agents?
Yes. A built-in auto-scaler provisions ephemeral agents on demand across Docker/Podman containers, bare-metal processes, and Firecracker microVMs — on your own infrastructure, with no extra controller.

All questions →

Write your CI once. Run it anywhere you control.

Run a pipeline locally