PocketCI is a local-first pipeline runtime where pipelines are TypeScript programs, not YAML configs. Built to run on your machine and scale to fleets of AI agents.
Runs entirely on your machine with Docker or the native driver. No cloud account, no SaaS dependency, no data leaving your infrastructure.
Designed from the start for AI agents. Pipelines expose an MCP server, webhooks fire into agentic loops, and the runtime API is scripted, not clicked.
Pipelines are TypeScript programs. Loops, conditionals, parallel steps, shared volumes — use the language, not a new DSL. YAML compatibility for Concourse migrations.
A pipeline, unabridged
// A pipeline is an exported async function. // PocketCI executes it, wires up containers, and collects results. const pipeline = async () => { // 1. wire up a Slack notification backend notify.setConfigs({ "slack-builds": { type: "slack", token: "xoxb-...", channels: ["#builds"], }, }); // 2. clone the repo into a shared volume const src = await runtime.createVolume("src"); await runtime.run({ name: "git-clone", image: "alpine/git", command: { path: "git", args: ["clone", "https://github.com/golang/example", "/workspace"], }, volumes: [{ name: src.name, path: "/workspace" }], }); // 3. run tests against the cloned repo const test = await runtime.run({ name: "run-tests", image: "golang:1.25", command: { path: "go", args: ["test", "./..."] }, volumes: [{ name: src.name, path: "/workspace" }], }); // 4. notify the team once results are in notify.updateStatus(test.exitCode === 0 ? "success" : "failure"); notify.send({ name: "slack-builds", message: "Build {{ .JobName }} finished: {{ .Status }}", async: true, }); }; export { pipeline };
## Equivalent Concourse-compatible YAML. ## Notifications use on_success / on_failure hooks. resources: - name: slack-builds type: slack-notification source: token: xoxb-... channels: ["#builds"] jobs: - name: run-tests plan: - task: git-clone config: platform: linux image_resource: type: registry-image source: { repository: alpine/git } outputs: - name: src run: path: git args: ["clone", "https://github.com/golang/example", src] - task: run-tests config: platform: linux image_resource: type: registry-image source: repository: golang tag: "1.25" inputs: - name: src path: /workspace run: path: go args: ["test", "./..."] on_success: put: slack-builds params: text: "Build run-tests finished: success" on_failure: put: slack-builds params: text: "Build run-tests finished: failure"
## After tests pass, an agent reviews the output and opens a PR comment. ## Follows the same input/output wiring as any task step. jobs: - name: review-tests plan: - task: git-clone config: platform: linux image_resource: type: registry-image source: { repository: alpine/git } outputs: - name: my-repo run: path: sh args: - -c - | git clone https://github.com/golang/example my-repo - agent: review-agent prompt: "Review the Go test results and summarise any failures" model: openrouter/google/gemini-3.1-flash-lite-preview config: platform: linux image_resource: type: registry-image source: { repository: golang, tag: "1.25" } inputs: - name: my-repo outputs: - name: review-result
PocketCI is pre-v1.0 and actively developed. The core pipeline runtime is solid and used in production workflows, but APIs may shift and some drivers are still experimental. Expect rough edges and fast iteration.
If you're building with AI agents, automating infrastructure, or just tired of YAML sprawl, this is a good time to kick the tyres. Star the repo to follow along, or open an issue if something breaks.