{"id":50361497,"url":"https://github.com/cplieger/vibekit","last_synced_at":"2026-06-28T03:00:42.841Z","repository":{"id":360184631,"uuid":"1246315859","full_name":"cplieger/vibekit","owner":"cplieger","description":"Browser-based web UI for the Kiro CLI (chat, editor, git, terminal)","archived":false,"fork":false,"pushed_at":"2026-06-28T01:08:52.000Z","size":23366,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T03:00:41.743Z","etag":null,"topics":["acp","go","golang","homelab","kiro-cli","terminal","typescript","web-ui"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cplieger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-22T04:39:47.000Z","updated_at":"2026-06-28T01:06:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"89d8b167-5f7f-4248-9954-90710c2a6d31","html_url":"https://github.com/cplieger/vibekit","commit_stats":null,"previous_names":["cplieger/vibekit"],"tags_count":123,"template":false,"template_full_name":null,"purl":"pkg:github/cplieger/vibekit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cplieger%2Fvibekit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cplieger%2Fvibekit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cplieger%2Fvibekit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cplieger%2Fvibekit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cplieger","download_url":"https://codeload.github.com/cplieger/vibekit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cplieger%2Fvibekit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34875360,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acp","go","golang","homelab","kiro-cli","terminal","typescript","web-ui"],"created_at":"2026-05-30T02:02:13.505Z","updated_at":"2026-06-28T03:00:42.829Z","avatar_url":"https://github.com/cplieger.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# vibekit\n\n[![Image Size](https://ghcr-badge.egpl.dev/cplieger/vibekit/size)](https://github.com/cplieger/vibekit/pkgs/container/vibekit)\n![Platforms](https://img.shields.io/badge/platforms-amd64%20%7C%20arm64-blue)\n![base: Debian](https://img.shields.io/badge/base-Debian-A81D33?logo=debian)\n[![Go Report Card](https://goreportcard.com/badge/github.com/cplieger/vibekit)](https://goreportcard.com/report/github.com/cplieger/vibekit)\n[![Test coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/cplieger/vibekit/badges/coverage.json)](https://github.com/cplieger/vibekit/actions/workflows/coverage.yml)\n[![Mutation](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/cplieger/vibekit/badges/mutation.json)](https://github.com/cplieger/vibekit/issues?q=label%3Agremlins-tracker)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13224/badge)](https://www.bestpractices.dev/projects/13224)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/cplieger/vibekit/badge)](https://scorecard.dev/viewer/?uri=github.com/cplieger/vibekit)\n[![SBOM](https://img.shields.io/badge/SBOM-SPDX-1D4ED8)](https://github.com/cplieger/vibekit/releases)\n\nA browser-based front-end for the Kiro CLI — chat with an AI coding agent from any device, with shared sessions, a live terminal, an editor, and git/forge workflows.\n\n## What it is\n\nVibekit is a Go web server that drives `kiro-cli` over the Agent Client Protocol (ACP). Each active chat runs one `kiro-cli acp` subprocess (the \"bridge\"); multiple devices and tabs on the same chat share it. The server is the single source of truth and the client is a pure projection of server state — every mutation goes through `POST /api/command` and is echoed back over SSE, so there is no optimistic local rendering and no multi-device drift.\n\n## Features\n\n- **Multi-device chat** — open the same conversation on phone and desktop; both stay in sync via SSE fan-out. One JSON file per chat, atomic writes, full history.\n- **Streaming with reasoning** — token-by-token markdown rendering with a collapsible \"thinking\" block, batched for smoothness.\n- **Live terminal** — a real PTY shell in the browser (powered by [`@cplieger/vterm`](https://github.com/cplieger/vterm)) plus per-agent command terminals.\n- **Editor + diff + conflict views** — read/edit workspace files, view tool-call diffs, resolve merge conflicts inline.\n- **Checkpoints** — a content-addressed per-file snapshot system with two-phase atomic restore and cross-chat conflict detection (independent of git).\n- **Supervised mode** — a per-chat write-gate that stages every agent file write for per-hunk accept/reject/merge before it touches disk.\n- **Subagent crew monitor**, **rewind** (branch a chat from a past turn), **MCP integration** (add/configure MCP servers from the UI), and **git + forge workflows** (GitHub/GitLab/Gitea via the first-party `gh`/`glab`/`tea` CLIs — PRs, issues, releases).\n- **PWA** with web-push notifications for turn-complete and permission prompts.\n\n## Run it\n\n```yaml\n# compose.yaml\nservices:\n  vibekit:\n    image: ghcr.io/cplieger/vibekit:latest\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - ./config:/config        # chats, kiro-cli auth/state, tools\n      - ./workspace:/workspace  # your repos\n    restart: unless-stopped\n```\n\n`kiro-cli` is downloaded and pinned on first boot (it is not redistributed in the image, per the AWS Customer Agreement). On first launch, authenticate `kiro-cli` and start chatting.\n\n## Security\n\nNetwork-exposed: put it behind an authenticating reverse proxy — vibekit has its own password/OIDC auth, but it controls an agent with shell and filesystem access to `/workspace`. Web-push uses an SSRF-hardened transport. Debian base (a shell + the `kiro-cli` subprocess are required, so this is not distroless). Images are published with cosign signatures and SBOM attestations.\n\n## License\n\nGPL-3.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcplieger%2Fvibekit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcplieger%2Fvibekit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcplieger%2Fvibekit/lists"}