The programmable review layer for coding agents.

Zag is the hackable source control platform for merging thousands of daily agent-driven code changes.

Active363[internal][api] split emails into DB-only and AgentMail endpoints
✓ LGTM+1○ Presubmits
14export async function fetchMetrics(
15 const inboxes = await findInboxes
16 const metrics = await findAll
15 const [inboxes, metrics] = await
16 Promise.all([findInboxes,
17 findAllInboxMetrics(orgId)])
18 return { inboxes, metrics }
19}
Active★ 363[internal][api] split emails into DB-only and AgentMail endpoints
✓ LGTM+1✓ VERIFIED+1
FilesCommentsPresubmitsPostsubmits
biomeLint.tsRunning
> npx biome check .
apps/internal/.../route.ts:12:7
× Use const instead of let
apps/internal/.../route.ts:28:1
× Unused import: findInboxHealth
biomeLint.ts
All checks passed2.1s
codexReview.tsRunning
> Reading diff for change 363...
 
Reviewing route.ts
Promise.all refactor looks correct.
fetchMetrics missing return type.
codexReview.ts
No issues found6.7s
claudeSecurity.tsRunning
● Read(apps/internal/.../route.ts)
Scanning for injection vectors...
 
● Read(apps/internal/.../emails.ts)
Checking for secrets and unvalidated input...
 
● No vulnerabilities detected.
- No SQL injection vectors
- Input validated via Zod schema
- No secrets in source
claudeSecurity.ts
0 vulnerabilities detected18.4s

GitHub was designed to share open-source projects. Engineering teams adopted it because it was there and it worked well enough. But coding agents work fast, produce many small changes, and operate in parallel.

Zag is built by former Google engineers and inspired by Google’s system for managing its massive internal monorepo.

In Zag, the unit of work is a change, collapsing branches, commits, and pull requests into one primitive. A change is a single, reviewable object with a stable identity. Changes stack on top of other changes. They rebase automatically when a parent changes, can be amended without losing their history, and reviewed individually or as a stack. An agent that decomposes a task into five changes creates five reviewable units of work, each with a clear description of what it does and why.

With changes and sessions as the foundation, Zag exposes everything as TypeScript primitives so deploying a Codex code review agent or ramping a PostHog feature flag is a simple defineTask. Tasks can be triggered as change presubmits or change postsubmits, and they can be simple TypeScript functions or an intelligent agent that decides which user cohorts to show a feature to for best driving conversion.

Zag doesn’t ship a CLI or an MCP. Claude Code and Codex are already great at writing code, and the Zag SDK is all they need, even for one-off commands. When everything is TypeScript, building internal coding agents for your team becomes second nature and incredibly powerful.

Every session in Zag produces a durable, replayable stream. Agents subscribe to streams for anything from fixing lint errors before CI finishes to coordinating work across multiple sessions.

~/your-org — zag/
❯ ls zag/
biomeLint.ts paymentsTests.ts
securityReview.ts vercelDeploy.ts
❯ cat zag/biomeLint.ts
// zag/biomeLint.ts
import { defineTask, presubmit } from "@zag-dev/sdk"
import { env } from "./env"
export default defineTask({
on: presubmit,
given: env,
then: async (session) ⇒ {
await session.$`npx biome check .`
},
},
})
presubmit · biomeLint · change 363
> npx biome check .
apps/internal/app/api/emails/metrics/route.ts:12:7
× Use const instead of let
ⓘ This variable is never reassigned
apps/internal/app/api/emails/metrics/route.ts:28:1
× Unused import: findInboxHealth
ⓘ This import is not used anywhere
apps/internal/lib/core/emails.ts:7:24
× Missing return type on function
ⓘ Add an explicit return type annotation
Found 3 errors.
❯ npx biome check .
✓ All checks passed.
claude code · subscribed to biomeLint
● Read stream: route.ts:12 — Use const
● Update(route.ts)
- let metrics = await findAllInboxMetrics(orgId)
+ const metrics = await findAllInboxMetrics(orgId)
● Read stream: route.ts:28 — Unused import
● Update(route.ts)
- import { findInboxes, findInboxHealth }
+ import { findInboxes }
● Read stream: emails.ts:7 — Missing return type
● Update(emails.ts)
- export async function fetchMetrics(orgId: string) {
+ export async function fetchMetrics(orgId: string):
Promise<MetricsResult> {
● Amended CL #363 (patchset 3)
● Retriggering presubmits...

All presubmits passed

https://
.zag.dev
Get started

Zag is generally available and self-serve, but our team is always ecstatic to help you get set up. Find a time here.