lockstep
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 8 GitHub stars
Code Warn
- process.env — Environment variable access in actions/pr-check/index.mjs
- network request — Outbound network request in actions/pr-check/index.mjs
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Keep your team's AI coding agents coordinated — without sharing source code.
Lockstep
Stop your team's AI coding agents from making conflicting changes — without sharing source code.
Quick start · How it works · Deploy
When two developers point AI coding agents (Claude Code, Codex, Gemini CLI) at the same system, the agents have no idea what each other just did:
- Agent A renames an API endpoint → Agent B keeps calling the old one.
- Agent A picks an auth pattern → Agent B invents a conflicting one.
- Nobody knows who owns what, what changed, or what still needs review.
Lockstep is a neutral system-of-record for your agents. Every decision, contract change, and dependency is captured and routed to the agents that need it — in real time, and without any source code ever leaving the developer's machine (only decisions and metadata sync to the cloud).
npm i -g lockstep-cli
How it compares
| Nothing | Slack / docs | CODEOWNERS | Lockstep | |
|---|---|---|---|---|
| Agents learn what other agents changed | ❌ | Manual | ❌ | ✅ Automatic |
| Contract changes routed to consumers | ❌ | ❌ | ❌ | ✅ Dependency graph |
| Blocks uncoordinated changes at PR time | ❌ | ❌ | Review only | ✅ Reconciliation gate |
| Works across agent vendors | — | — | — | ✅ Claude/Codex/Gemini |
| Source code leaves your machine | — | Sometimes | ❌ | ❌ Never |
How It Works
Developer A (machine) Lockstep Cloud Developer B (machine)
──────────────────── ─────────────── ────────────────────
┌─────────────────┐ ┌─────────────────┐
│ Claude Code │ │ Codex / Gemini │
│ + MCP Server │──── capture ────┐ │ + MCP Server │
└─────────────────┘ │ └─────────────────┘
│ ▼ ▲
│ ┌─────────────┐ │
hook fires on ──→ │ Decisions │ ──→ dependency graph │
every file edit │ Contracts │ looks up who │
(PostToolUse) │ Ownership │ consumes the │
│ │ Deps Graph │ changed surface │
▼ │ Inboxes │ │ │
classifies the └─────────────┘ ▼ │
diff as contract Append-only fan-out to ───────┘
surface or owned No source code each consumer's inbox
The notification lifecycle
1. Capture — A Claude Code hook fires on every file edit (PostToolUse) and on session end. The CLI diffs the working tree against HEAD, classifies each changed file — is it an API route, a .proto, an OpenAPI spec, an exported function? Files that expose a public interface are flagged as contract surfaces. The change is published to the ledger with a risk tier (owned if only you touch it, shared if it's a contract surface).
2. Route — When a change hits the ledger, the dependency graph kicks in. Every repo that has registered a dependency on the changed surface gets a notification fanned out to its inbox. The sender is excluded. If repo B declared POST /auth/session as a dependency, and repo A just changed that surface, repo B's inbox gets the change — automatically, with zero configuration beyond register_dependency.
3. Replay — When an agent starts a new session (SessionStart hook), Lockstep reads the inbox and replays everything that arrived since the last session: unread changes, binding decisions, and open questions. This is injected as additionalContext so the agent is immediately aware of what teammates have done.
4. Decide — Agents can propose decisions scoped to a surface (e.g. "rename POST /auth/login to POST /auth/session"). Owner-scoped decisions are binding immediately. Shared/contract decisions stay open until another team member acknowledges them — then they become binding for the whole project.
5. Gate — At PR time, the Tier-2 reconciliation gate (a GitHub Action) checks every changed contract surface against the ledger. If a surface was changed but has no binding decision, the PR check fails. This catches anything Tier-1 missed.
Who gets notified?
| What happens | Who gets notified | How |
|---|---|---|
| Contract surface changed (API route, proto, exported type) | Every repo that registered a dependency on that surface | Inbox fan-out, delivered on next session replay |
| Decision proposed on a shared scope | All project members see it in their decision list | decisions MCP tool / dashboard |
| Question asked (optionally scoped to a surface) | All project members | Inbox / dashboard |
| Task delegated to a specific teammate | The delegatee | Inbox / dashboard |
| PR touches a contract surface with no binding decision | The PR author | GitHub Action check fails with violation list |
What flows through the cloud (and what doesn't)
| Flows through Lockstep | Never leaves the machine |
|---|---|
| Decision text ("rename endpoint X to Y") | Source code |
Surface identifiers (POST /auth/session) |
File contents |
| Change summaries ("changed 3 files: routes/auth.ts, ...") | Git diffs |
| Dependency edges (repo B consumes surface X) | Credentials or secrets |
| Ownership rules (parsed from CODEOWNERS) | Environment variables |
Features
| Feature | Description |
|---|---|
| Cross-vendor | Works with Claude Code, Codex, Gemini CLI — any agent that supports MCP |
| Decision ledger | Append-only, CAS-versioned decisions with propose/acknowledge workflow |
| Dependency graph | Automatic routing — changes to a surface notify every consumer |
| Ownership graph | CODEOWNERS-powered ownership, auto-ingested on connect |
| Two-tier capture | Tier-1: real-time change capture. Tier-2: PR-level reconciliation gate |
| Questions & tasks | Cross-agent delegation — ask questions, assign tasks, get answers |
| MCP-native | 12-tool MCP server runs per-session on the developer's machine |
| Dashboard | Next.js UI for decisions, contracts, dependencies, activity, and tasks |
| Self-hostable | docker compose up on your own infra, or use the managed cloud |
| Secure by default | RLS isolation, encrypted tokens, append-only audit trail, no secrets in code |
Quick Start
Get a working local setup in under 5 minutes — no GitHub App keys needed.
1. Start the stack
git clone https://github.com/lockstep-team-agent/lockstep.git
cd lockstep
cp .env.example .env # dev-login is enabled by default
docker compose up --build # starts Postgres + API + dashboard
Wait for lockstep-core listening on :8080 in the logs. Verify:
curl http://localhost:8080/readyz
# => { "ok": true, "db": "up", "deployment": "self-host" }
This gives you:
- API at http://localhost:8080
- Dashboard at http://localhost:3000
- Postgres at localhost:5432
2. Install the CLI & log in
npm i -g lockstep-cli
# Point the CLI at your local server (saved permanently — only needed once)
lockstep login --api http://localhost:8080 --dev --dev-id 1 --dev-login alice
Important: The
--apiflag tells the CLI where the backend is. Without it, the CLI defaults tohttp://localhost:8080. For a deployed server, uselockstep login --api https://your-server.example.com.
3. Connect your repo
cd your-project # any git repo with an origin remote
lockstep init # installs MCP server + hooks into the repo
lockstep connect --project "my-team" # creates a project and links this repo
4. Open the dashboard
Open http://localhost:3000 in your browser. To sign in, you need the session token. Get it with:
# macOS (token stored in keychain)
security find-generic-password -s lockstep -a session-token -w
# Linux / fallback (token stored in file)
cat ~/.lockstep/credentials.json
Paste the lsk_... token into the dashboard sign-in field.
5. Add a teammate
Your teammate runs (on their machine):
npm i -g lockstep-cli
lockstep login --api http://localhost:8080 --dev --dev-id 2 --dev-login bob
cd their-project
lockstep init
lockstep connect --project "my-team" # joins the existing project
Both developers are now in the same project. They'll see each other on the Members page in the dashboard.
6. Start coding with your AI agent
Open Claude Code (or any MCP-compatible agent) in the repo. On session start, the agent receives a Lockstep replay of everything that happened since the last session — changes, binding decisions, open questions, and assigned tasks.
As you work, contract changes are captured automatically and routed to teammates' inboxes.
Production setup: For real GitHub-based auth (no
--devflag needed), register a GitHub App and fill in the keys in.env. SetNODE_ENV=productionandLOCKSTEP_DEV_LOGIN=0. See DEPLOY.md for Railway/cloud deployment.
Project Structure
packages/core/ # Fastify API + PostgreSQL (Drizzle ORM), RLS-isolated, append-only
packages/cli/ # lockstep-cli — login, init, connect, capture, MCP server
packages/web/ # Next.js dashboard — decisions, contracts, deps, activity
actions/pr-check # GitHub Action — Tier-2 reconciliation gate for PRs
CLI Commands
| Command | What it does |
|---|---|
lockstep login [--api <url>] |
Authenticate via GitHub device flow (or --dev for local) |
lockstep init |
Wire MCP server + hooks into the current repo |
lockstep connect [--project <name>] |
Link this repo to a shared project |
lockstep invite <github-handle> |
Invite a teammate to your project |
lockstep capture |
Manually trigger change capture (also runs automatically) |
lockstep status / lockstep doctor |
Check auth + config health |
Development
npm run build # Build all workspaces
npm run typecheck # Type-check all workspaces
npm run test # Run all tests
npm run lint # Lint all workspaces
npm run format # Format with Prettier
npm run dev:core # Start core API in watch mode
See CONTRIBUTING.md for branch conventions, PR process, and code style.
Deployment
Lockstep runs in two modes (12-factor config):
- Self-host:
docker compose upon your infra — you register your own GitHub App - Managed cloud: Multi-tenant SaaS with RLS isolation
See DEPLOY.md for step-by-step Railway deployment instructions.
Architecture
- 26-table schema with row-level security (RLS) for tenant isolation
- Append-only ledger — decisions are immutable, versioned with content-addressable storage
- Vendor-neutral adapter pattern — new AI agent integrations are a single adapter file
- Zod validation on every boundary, TypeScript strict mode throughout
- Zero source code stored — only decisions, contracts, and metadata flow through the system
Security
See SECURITY.md for our responsible disclosure policy.
License
MIT © Naman Jain
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found