approval gates · the boring part that saves you
00gates betweensyntaxisand your repo

Six small pauses.
Zero surprises.

Syntaxis is read-only by default. Everything else stops, holds, and asks first — patches, shells, branches, commits, pushes, PRs. The pause is the product. The pause is also why you can leave it running while you walk the dog.

01branch·create / switch02patch·apply diff03validate·run commands04commit·stage & commit locally05push·publish branch06pr·open pull request
01the inbox · live demo

One pile. Six keys. Boring on purpose.

Here's the real inbox. Click a row to see what would happen, then press a to approve or d to deny.(This is a sandbox. Nothing real ships. Nothing real breaks.)

syntaxis · approval inbox · acme/web
polling 60s
01
branch · pendingcreate work/142-birthday-on-profilebase: main · 0 files yet
git13:42:05
02
patch · pendingapply 3 files · +47 / −12profile-form.tsx · user.ts · profile.test.ts
disk13:42:38
03
validate · pendingpnpm lint && pnpm typechecksandbox: pnpm · ~28s
shell13:42:51
04
commit · pending#142: add birthday on profile formstaged: 3 files · author: you
git13:42:54
05
push · pendingorigin → work/142-birthday-on-profileremote: github.com/acme/web · 8.2 kB
leaves machine13:42:56
06
pr · pendingopen draft PR #189base: main ← work/142-birthday-on-profile
leaves machine13:43:02
6 pending0 approved0 denied
a approved denyjk move
branch·preview
#142 · 13:42:05
if approved, syntaxis will
from
main
to
work/142-birthday-on-profile
issue #142 · @amy · just claimed
blast radius · git6 of 6 pending
02the six gates

Read the brief. Press a. Repeat.

Every Syntaxis run walks the same six gates, in the same order. Each one shows you exactly what it's about to do — and what blast radius that has — before you let it through.

gate 01

branch · create / switch

Any new branch or checkout after the trust gate. Syntaxis won't touch your working tree until you say so.

blast radiusgit only
keyboarda or click approve
defaultauto-approve, if the branch name matches your pattern.
overriderules.yaml → gates.branch.auto_approve = true
preview · what you'll seegate 01
from
main
to
work/142-birthday-on-profile
naming: work/{issue}-{slug} · matches your pattern
gate 02

patch · apply diff

Writes the reviewed diff to local files. The first time the agent touches your disk on this run.

blast radiuswrites to disk
keyboarda or click approve
defaultalways asks. you read the diff, you press a.
overriderules.yaml: paths matchers + additions_max for low-risk patches.
preview · what you'll seegate 02
profile-form.tsx+22 / −8
12 const [name, setName] = useState("");
13 // birthday: TODO
13 const [bday, setBday] = useState<Date>();
14 const onBday = (d: Date) => {
15 if (d > new Date()) return;
16 setBday(d);
17 };
gate 03

validate · run commands

Runs your detected lint / typecheck / test scripts in a sandboxed shell. Only the commands you've listed — never an open prompt.

blast radiusruns a shell
keyboarda or click approve
defaultasks once per repo, then remembers your sandbox config.
overriderules.yaml: validate.must_pass = ['lint','typecheck']
preview · what you'll seegate 03
$ pnpm lint --filter profile
→ 0 errors · 0 warnings
$ pnpm typecheck
→ tsc finished in 11.4s
$ pnpm test profile.test.ts
→ 4 passed · 2 new
exit 0 · sandbox closed
gate 04

commit · stage & commit locally

Stages the patch and writes a commit to your local branch. Nothing leaves your machine yet — just the working tree settles.

blast radiuslocal git
keyboarda or click approve
defaultauto-approve, with the message Syntaxis drafted.
overriderules.yaml: commit.template controls the format.
preview · what you'll seegate 04
branchwork/142-birthday-on-profile
files3 staged
authoryou
#142: add birthday on profile form adds a DateField bound to user.birthday. rejects future dates · adds two tests. co-authored-by: syntaxis-bot[bot]
gate 05

push · publish branch

Pushes the local branch up through the GitHub App. The first moment something leaves your laptop.

blast radiusleaves machine
keyboarda or click approve
defaultalways asks. the network is loud, the gate is louder.
overriderules.yaml: push.require_reviewers for a second human.
preview · what you'll seegate 05
local
your laptop
origin
github.com/acme/web
8.2 kB · 1 ref · via syntaxis github app · attribution: you
gate 06

pr · open pull request

Opens the PR through syntaxis-bot[bot], attributed to you, transitions the Project item to review.

blast radiusleaves machine
keyboarda or click approve
defaultasks, with the PR body pre-filled from the issue + diff.
overriderules.yaml: pr.target = 'draft' is the friendly default.
preview · what you'll seegate 06
DRAFT#189 · syntaxis-bot[bot] · co-author: you
feat(profile): add birthday field
## what changed
— DateField on profile form
— rejects future dates · two tests
 
## closes
— #142 (Add support of birthday)
03a tuesday night, told twice

Same hour. One agent has gates. One doesn't.

The agents are identical. The difference is whether the side-effect steps pause and ask. Read both timelines top-to-bottom. We'll wait.

without gates

23:42branch auto-createdyou are asleep
23:44patch written, force-pushed to mainyou are still asleep
23:47broken migration auto-merged
23:51cron starts failing · sentry pages on-callvlad's phone lights up
00:14vlad reverts wrong commitvlad in a bathrobe
02:07half-reverted, half-fixed branch deployedno one knows what state prod is in
09:11standup begins with 'so… last night'the agent is celebrated and then disabled
incident · INC-447verdict: revert + retro

with gates

23:42syntaxis pauses at patch gate1 pending on phone
23:44syntaxis pauses at validate gate2 pending
23:47syntaxis pauses at push gate3 pending · you are still asleep
00:14queue stays calm. nothing escalates.your laptop dims itself
02:07still waiting. patient as a junior.the cat sleeps on the keyboard
08:30you open the inbox over coffee6 pending · 0 angry
09:116 approvals · PR up by 09:18standup begins with 'morning'
run · #142 · cleanverdict: ship by 09:18
04the contract

Nothing happens twice. Nothing happens silently.

The whole product is built on four small rules. If any of them break, that's a bug — file it and we'll fix it before we ship anything else.

One inbox · keyboard-driven

Every pending side-effect — local or remote — lands in the same approval inbox. There is no second pile, no slack thread, no email digest. j, k, a, d, o, esc. That's the whole interface.

visible from desktop · mobile · cli

Stale entries auto-expire

If a queued action sits for more than 24 hours, Syntaxis discards it and re-runs the upstream step. No accidental late approvals. No mystery branches showing up on Monday.

default 24h · configurable in rules.yaml

Per-repo trust toggle

Every repo starts in read-only mode. You explicitly flip the trust toggle on each one. Off means off — the agent can read, plan, and propose, but the inbox refuses to even accept side-effect entries.

default off · flip per repo, per machine

Every approval is reversible

Each approved action is logged with the commit hash, the diff, the command line, the timestamp, and the human who approved it. Three keypresses to revert any single approval.

audit log · tamper-evident · exportable CSV / JSON
05rules.yaml

Bend the gates to your team.

The six gates are the floor, not the ceiling. A small yaml file in your repo decides which gates can auto-approve themselves, which require a second human, and which never run at all.

Drop a .syntaxis/rules.yaml next to your CODEOWNERS. Syntaxis reads it on each run, applies the overrides, and shows you the diff against the defaults so you can audit your own policy.

  • Auto-approve the boring gates — branch, commit — keeps your fingers free for the ones that matter.
  • Path matchers let docs-only patches sail through; anything touching migrations/ still asks.
  • Two humans on push when the target is main. One human is plenty otherwise.
  • Webhooks let your existing tools (PagerDuty, Slack) say yes on Syntaxis's behalf, with their own audit trail.
.syntaxis/rules.yamlper-repo · overrides defaults
1# gates Syntaxis won't even ask about
2gates:
3 branch:
4 auto_approve: true # branches are boring
5 pattern: "work/{issue}-{slug}"
6 patch:
7 auto_approve_if:
8 paths: ["docs/**", "*.md"]
9 additions_max: 30
10 validate:
11 must_pass: ["lint", "typecheck"]
12 commit:
13 auto_approve: true
14 push:
15 require_reviewers: 1 # a second pair of eyes
16 on_branch: "main"
17 pr:
18 target: "draft"
19 template: ".github/syntaxis-pr.md"
20# the rest stays as the defaults — they're sensible.
06keyboard

The whole interface fits on one hand.

The inbox is keyboard-first because reviewing diffs is a left-hand-on-keyboard activity. You learn it in one queue and you never touch the mouse again.

a
Approvelet this gate through
d
Denysend the agent back to think
o
Openexpand diff / shell / pr body
j
Nextmove down the queue
k
Previousmove up the queue
space
Approve & advancethe one you'll use most
A
Approve all of this kindshift+a · with confirmation
/
Filter the queueby gate, repo, or issue
esc
Back to inboxor 'discard edits and back'
07concerns

The things people ask before turning trust on.

Read these five, then read the contract again, then turn trust on for one small repo. That's the right order.

What if I disagree with the diff?
Open it (o), edit any line directly in the inbox, then approve (a). Or deny (d) and type a one-line reason — Syntaxis takes that as feedback, re-plans, and queues a new patch. The original diff is preserved in the audit log either way.
What happens to the queue while I'm asleep?
Nothing. Side-effect work pauses at the next gate and the queue patiently waits. Entries auto-expire after 24h by default — if a patch sits unreviewed for a full day, Syntaxis discards it and replans, because the world probably changed in the meantime. You wake up to a tidy inbox, not a mystery branch.
Can I auto-approve some gates and keep others manual?
Yes — that's exactly what .syntaxis/rules.yaml is for. Common choices: auto-approve branch and commit (they're reversible and boring), keep patch, push, and pr manual. On Team, the rules file lives in the repo so the whole org sees the same policy.
I want to pair with the agent live — not async. Can I?
Yes. Flip the inbox into 'live mode' from the desktop client and gates surface inline — diff appears, you nod, it continues. Same six gates, same keys, just one-at-a-time. Most teams use async during the day and live when shipping something risky.
What's actually in the audit log?
For each approval or denial: who, when, the gate type, the exact payload (diff, command, branch name, PR body), the resulting commit hash, and a SHA of the whole entry. The log is local on Solo, cloud-synced on Team (CSV/JSON export), and tamper-evident with hash chaining on Enterprise.
ready to walk the dog?

Six gates between Syntaxis and your repo.
And one between you and a calm afternoon.

Install the desktop client. Flip the trust toggle on one repo. Let it draft a PR while you go grab a coffee. The inbox will be waiting.

See pricingJoin Solo beta desktop beta · macOS · Windows · Linux