Home/Products/Syntaxis
EtenosAvailable todayAI Software Engineer

Syntaxis ships PRs. You hold the keys.

A desktop AI Software Engineer that connects to your real repository and GitHub workflow — plans work, prepares diffs, validates changes, commits, pushes, and opens pull requests, pausing before every side effect.

Desktop · macOS · Windows · Linux
Tauri · React/TS + Rust runtime
Codex · your existing session
Approval inbox3 pending

Every side effect waits here · local writes, git ops, GitHub mutations.

patch#7 · 3 files · +47 / −12
+ <Field label="Birthday">
+ <DateInput value={birthday} onChange={setBirthday} />
+ </Field>
- // legacy <BirthdayPicker />
validatepnpm lint + typecheck
$ pnpm lint && pnpm typecheck
pushorigin/work/7-add-birthday
git push -u origin work/7-add-birthday
connect

It joins your repo, not a sandbox.

Syntaxis works against your real GitHub installation — organization mode or personal authorization — and reads work straight from GitHub Projects v2 with status-field mapping and assignee filtering, so it only picks up the work you intend.

Organization
Personal

GitHub App · organization mode

Install the Etenos GitHub App into your organization. Syntaxis sees only the repositories in the installation scope, acts as syntaxis-bot[bot], and attributes every PR back to the approving developer.

Installation-scoped repository access
Bot identity with human attribution
Org-wide policy & visibility
Ready / Todo2
Add birthday field to profile form
#7syntaxis-bot
Fix timezone in invoice export
#9· unassigned
In Progress1
Add birthday field to profile form
#7syntaxis-bot· claimed
Review1
Refactor auth middleware
#6syntaxis-bot
Done1
Sanitize control-plane events
#4· unassigned

Repository scope

Select repositories from your GitHub installation scope. Nothing outside it is visible to Syntaxis.

/01

Projects v2 mapping

Map your Project's Status field to stages: Ready / Todo, In Progress, Review, Done.

/02

Assignee filtering

Syntaxis only claims items assigned to its bot user — so it never picks up work that isn't meant for it.

/03

Branch naming rules

Compose branch names from tokens: issue number, slug, key, and date. Your convention, kept exactly.

/04

Commit & PR behavior

Configure commit prefixes, PR draft-vs-ready behavior, and title/body templates.

/05

Task inbox

Polls GitHub Projects on an interval for eligible assigned issues and queues them in a task inbox.

/06
the loop · 01 → 10

Ten small steps. Six side-effect gates.

Every Syntaxis run walks the same ordered path. Click any stage. The four read-only stages run while you're away; the six gated stages stop and wait for approval.

Stage 4 / 10 · gated
Branch
side-effect gate

First side effect. Preflight checks trusted workspace, origin remote, clean tree, base & target branch, and sync status — then waits for approval to create the branch.

branch · work/7-add-birthday base · origin/main · clean · synced gate · awaiting approval
workspace

It reads the repo before it touches it.

On link, Syntaxis scans the local workspace behind a repo trust gate. The scanner builds a picture of the project so its plans fit your codebase — then runs branch preflight before the first side effect.

languagesframeworkspackage managersscriptscommandsconfig filesimportant filesgit statusrisksmonorepo shaperecommended specialization
Branch preflight
Trusted workspacepass
Origin remote presentpass
Clean working treepass
Base branch resolvedpass
Target branch freepass
Sync status currentbehind · sync
the contract

Six gates between Syntaxis and your repo.

Branch, patch write, validation shell, commit, push, pull request. Nothing writes files, runs shell commands, commits, pushes, or opens PRs without approval. Policy profiles decide which gates can run automatically.

Approval inbox3 pending

Every side effect waits here · local writes, git ops, GitHub mutations.

patch#7 · 3 files · +47 / −12
+ <Field label="Birthday">
+ <DateInput value={birthday} onChange={setBirthday} />
+ </Field>
- // legacy <BirthdayPicker />
validatepnpm lint + typecheck
$ pnpm lint && pnpm typecheck
pushorigin/work/7-add-birthday
git push -u origin work/7-add-birthday
Policy profiles · who needs approval
Side effectStrictStandardTrusted
Branch createapproveapproveapprove
Patch writeapproveapproveapprove
Validation shellapproveapproveauto
Commitapproveautoauto
Pushapproveapproveapprove
Pull requestapproveapproveapprove

The approval inbox holds Pending, Approved-ready-to-run, and Executed history — plus stale and denied states.

review surface

Read the intent, then the exact diff.

P

Implementation Proposal

Before any diff, Syntaxis writes the change in plain language. You approve the intent first.

Patch Preview gate

The exact unified diff with additions/deletions, no-op detection, and side-by-side review. Nothing applies until you approve.

Validation queue gate

Detected test / typecheck / build / lint / format commands queue here. Each shell run is approved.

Commit gate

An editable commit message, staged and committed locally only after approval.

Push & PR gate

Push and pull request queue separately, with editable PR title/body and draft/ready behavior.

patch preview · #7+47 / −12
src/components/profile-form.tsx
+ <Field label="Birthday">
+ <DateInput value={birthday} onChange={setBirthday} />
+ </Field>
- // legacy <BirthdayPicker />
no-op detection · none
PR feedback loop

After a PR opens, Syntaxis reads check failures, reviews, and review comments — then drafts a feedback fix plan, a proposal, and a patch preview. Same gates, again.

check failedreview · changesfix plan draftedpatch · gate
scope control

You set how far it reaches.

Planning lenses bound how much Syntaxis takes on. A File Context Pack reads bounded local summaries of the likely target files and their nearest dependencies — never the whole repo, never off the machine.

File Context Pack
pack · bounded local summaries
profile-form.tsx · 1 summary
date-input.tsx · dep
use-profile.ts · dep
Planning lens

Balanced plan. Touches the obvious files and their nearest dependencies, with a short ordered step list you review before any code.

3–5 files · 3–6 steps
audit

A local log you can grep.

Every approval, denial, execution, policy change, and trust change is recorded locally with execution history. PRs are attributed to the approving developer.

13:42:05youApproved · branch create work/7-add-birthdayok
13:42:38syntaxisProposed · patch 3 files +47/−12logged
13:43:02youApproved · validation shell pnpm lintok
13:43:05syntaxisExecuted · pnpm lint + typecheck → passok
13:44:20youDenied · push to origin/maindenied
13:45:10adminPolicy change · require approval on commitlogged
13:46:00youWorkspace trust granted · etenos/mdx-portalok
built for desktop

One window. Three panes. Total control.

A focused setup down the left, the work in the middle, the approval inbox always on the right. No tabs to lose, no modals to dismiss.

Syntaxis — 0.1.0 · workspace / approval inbox #7 gated
Setup
01 AI Provider
02 GitHub Integration
03 Repository
04 Project Status
Workspace
Task inbox1
Active task#7
Approval inbox3
Trusted · mdx-portal
Active task #7
Add support of birthday on the profile form
ClaimWorkspaceBriefBranchPlanContextProposalPatchValidatePR
patch3 files · +47 / −12
+ <Field label="Birthday" />
- legacy <BirthdayPicker />
Approval inbox · 3
patch
#7 · 3 files
validate
pnpm lint
push
origin/work/7
read-only first · side effects only after approval

Local-first Tauri app

React/TypeScript frontend with a Rust automation runtime. Built for macOS, Windows, and Linux.

/01

Your Codex session

Uses the Codex/OpenAI account already signed in on the machine — no provider API keys collected. Claude Code support is on the way.

/02

Billing & entitlement

An account entitlement gate, the Stripe billing portal, and a desktop sign-in handoff through the web portal.

/03

Developer controls

Switch between local, staging, and production API environments, with a safe UI mock mode for development.

/04

Make the coffee. Come back to a PR.

Syntaxis claims a ticket, drafts the patch, runs your validators, and queues a draft PR. You come back to the inbox, not the keyboard.