CI/CD that runs on your infrastructure — we never see your source or secrets.
Author pipelines in real, typed TypeScript — the kind your AI coding agents can write, type-check, and run before it ships. Your own agents run every job, confined to your infrastructure; KiCI hosts the dashboard so your team keeps full visibility.
Author in typed TypeScript
Real code with types and autocomplete — not YAML. Loops, conditionals, and reuse with the full language.
Test locally and remotely
Run on your real agents with kici run remote before you push — or run on your own machine with kici run --local and dry-run with kici preview.
Sovereign execution, hosted observability
Jobs run on your own infrastructure — we never see your source, secrets, or build output. The hosted dashboard gives your team full visibility and management of every run.
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:
See all comparisons →Built for agent-authored pipelines.
Pipelines are real, typed TypeScript, so your AI coding agents can author them — and because it's typed code, not opaque YAML, an agent's mistakes surface as type errors, and you can run the pipeline on your real agents with kici run remote before it ships. Every job executes confined on your own infrastructure, so an agent-written change stays typed and isolated by construction.
How it works
Observability and control for your whole org.
Matches triggers, dispatches jobs, auto-scales agents.
Clone your repos, run steps, stream logs back.
Your code, secrets, and compute stay here.
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 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);
},
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`;
})],
}),
],
}); Pricing
Free forever — full functionality. Execution runs on your infrastructure; the hosted dashboard and webhook relay are part of every tier. Paid tiers just raise the limits — more orchestrators, members, retention, relayed-webhook volume, and live-log streaming.
30d retention
90d retention
180d retention
365d retention