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.
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'? - kici compile — shows the error.
- Fix it.
- kici run remote — runs the working tree on your agents with test-scoped secrets, and streams the logs back.
- 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) 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
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.
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:
See all comparisons →Pricing
Free forever with full functionality; paid tiers raise the limits.
30d retention
90d retention
180d retention
365d retention
Questions
Does KiCI see my source code or secrets?
Can I write CI/CD pipelines in TypeScript instead of YAML?
Can I test a workflow before pushing?
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.