by MaxonT
Advisory file claims and a shared journal for your AI coding agents.
Pick Aisync if two or more coding agents work in the same repositories and keep colliding. It is free, local and dependency-free. Skip it if you need claims that block edits, or you use Windows: claims here are advisory and the command does not start on that system.
One local hub gives three different agent tools shared rules, claims and mid-session news without any server or dependency.
There is no moat beyond being early: the design is plain files, git and hooks that others can copy.
Main trade-off
Claims are advisory, so nothing stops an agent that ignores them.
MIT licence. Free to install and run, with no paid tier or hosted service listed.
curl -fsSL https://maxont.github.io/aisync/install.sh | bash
The permissions this connector asks for, as its own documentation states them.
20 actions an agent can call. Open one for its parameters and an example.
Example call
aisync init --projects-dir ~/projects
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --seed-from | string | Optional | A file whose owner-preferences block becomes the shared rules; the default is a starter block. |
| --projects-dir | string | Optional | Watch every git repository directly inside this folder. |
| --target | string | Optional | A tool rule file to carry the shared block; repeatable. |
| --force | booleandefault false | Optional | Recreate an existing hub. |
Returns
| Field | Type | Description |
|---|---|---|
| hub | directory | The new hub with rules, journal and config. |
Example call
aisync claim -a codex -p api -f app/payments/ -m "SDK upgrade"
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --summary | string | Required | What you are about to do (-m). |
| --agent | string | Optional | The tool making the claim, such as codex (-a, or the AISYNC_AGENT variable). |
| --project | string | Optional | The repository name (-p). |
| --files | string | Optional | Comma-separated paths (-f); omit it to claim the whole repository. |
| --ttl | numberdefault 120 | Optional | Minutes until the claim expires. |
Returns
| Field | Type | Description |
|---|---|---|
| exit_code | number | Zero when free, 3 when another agent holds an overlapping claim. |
Example call
aisync release -a codex -p api
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --agent | string | Optional | Whose claims to drop (-a). |
| --project | string | Optional | Limit the release to one project (-p). |
Returns
| Field | Type | Description |
|---|---|---|
| released | number | How many claims were dropped. |
Example call
aisync claims
Returns
| Field | Type | Description |
|---|---|---|
| claims | text | Each live claim with its agent, files and expiry time. |
Example call
aisync log -a claude-code -k decision -m "Keep retries at 3"
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --summary | string | Required | The event text (-m). |
| --kind | stringdefault dev_log | Optional | dev_log, decision, blocked, unblocked, rule_change or note (-k). |
| --project | string | Optional | Defaults to the name of the current git repository (-p). |
| --files | string | Optional | Comma-separated paths the event touches (-f). |
| --ref | string | Optional | A key=value reference such as pr=45; repeatable. |
Returns
| Field | Type | Description |
|---|---|---|
| event | text | The id of the appended event. |
Example call
aisync rule add -a codex --when "changing an API" --do "add a contract test"
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --when | string | Optional | For add: the trigger. |
| --do | string | Optional | For add: the action the rule asks for. |
| --not | string | Optional | For add: what the rule forbids. |
| --topic | string | Optional | Heading the rule goes under; required once rules are grouped (-t). |
| --reason | string | Optional | Why the rule exists; the reason goes to the journal (-r). |
| --replaces | string | Optional | An ID such as R-087, or part of the text of the rule this one replaces. |
| --enforced-by | string | Optional | Comma-separated paths of the test, hook or checker that enforces it. |
| --judgment-only | string | Optional | Why no code can check the rule. |
| --file | string | Optional | For rewrite: a JSON file mapping rule IDs to new text. |
| --archived | booleandefault false | Optional | For list: show retired rules. |
Returns
| Field | Type | Description |
|---|---|---|
| rule | text | The new rule with its stable ID, such as R-088. |
Example call
aisync tidy --write
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --write | booleandefault false | Optional | Write a dated file into the hub instead of printing. |
| --json | booleandefault false | Optional | Print the proposals as JSON. |
Returns
| Field | Type | Description |
|---|---|---|
| proposals | text | Proposals you tick off yourself. |
Example call
aisync rulecheck before.md after.md
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| before | string | Required | The rules file before the cleanup. |
| after | string | Optional | The file after the cleanup; the default is the hub rules. |
| --archive | string | Optional | The retired-rules file; the default sits next to the after file. |
| --accept-drop | string | Optional | A reason that accepts a dropped fact. |
Returns
| Field | Type | Description |
|---|---|---|
| verdict | text | Which hard facts are still current or superseded, and which were lost. |
Example call
aisync instinct add "Run the migration dry run first" --from EB-014
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --from | string | Optional | For add: the EB id in the error log the habit comes from (required for add). |
| --agent | string | Optional | Who adds the habit. |
Returns
| Field | Type | Description |
|---|---|---|
| habits | text | The habit list. |
Example call
aisync news -a cursor -s chat-42
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --agent | string | Optional | Which tool is asking. |
| --session | string | Optional | Any stable id for this chat or session (-s). |
Returns
| Field | Type | Description |
|---|---|---|
| news | text | Events from other agents and rule changes, or nothing. |
Example call
aisync install-hooks --only claude-code --dry-run
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --only | string | Optional | A comma list of the install steps to run. |
| --dry-run | booleandefault false | Optional | Show the diff and write nothing. |
| --yes | booleandefault false | Optional | Apply without asking (-y). |
Returns
| Field | Type | Description |
|---|---|---|
| diff | text | The changes to tool configs, rule files and git hooks. |
Example call
aisync status --json
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --json | booleandefault false | Optional | Print the status as JSON. |
| --accept-drop | string | Optional | A reason that accepts a flagged rules drop. |
Returns
| Field | Type | Description |
|---|---|---|
| status | text | The live picture of the hub. |
Example call
aisync board -o team-board.html
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --out | stringdefault board.html | Optional | The output file (-o). |
Returns
| Field | Type | Description |
|---|---|---|
| file | html | A single self-contained status page. |
Example call
aisync report --days 14
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --days | numberdefault 7 | Optional | How many days to look back. |
| --json | booleandefault false | Optional | Print the report as JSON. |
Returns
| Field | Type | Description |
|---|---|---|
| hints | text | Plain hints; it never acts on them. |
Example call
aisync tail -n 5
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| -n | numberdefault 20 | Optional | How many events to show. |
Returns
| Field | Type | Description |
|---|---|---|
| events | text | The newest journal lines. |
Example call
aisync verify
Returns
| Field | Type | Description |
|---|---|---|
| result | text | Whether the chain is intact. |
Example call
aisync watch --max-seconds 600
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --max-cycles | number | Optional | For watch: stop after this many cycles. |
| --max-seconds | number | Optional | For watch: stop after this long. |
Returns
| Field | Type | Description |
|---|---|---|
| cycle | text | Per-step results; one failing step never blocks the others. |
Example call
aisync resolve R-087 --take truth
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| label | string | Required | For resolve: the conflict label. |
| --take | string | Required | For resolve: truth or target. |
Returns
| Field | Type | Description |
|---|---|---|
| result | text | The conflict closed with your choice. |
Example call
aisync demo --dir demo-hub
Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| --dir | string | Optional | Where to build it; the default is a new temp directory. |
Returns
| Field | Type | Description |
|---|---|---|
| hub | directory | A demo hub with synthetic data. |
Example call
aisync mcp
Returns
| Field | Type | Description |
|---|---|---|
| server | MCP server | An MCP server over stdio; it needs the optional mcp extra. |
Aisync is an open-source command line tool, hook set and MCP server that coordinates AI coding agents on one machine through a shared rules block, a hash-chained journal and advisory file claims. It supports Claude Code, Codex and Cursor, needs Python 3.11 and git on macOS or Linux, and its latest release is 0.2.0.
File claims with a lifetime
A claim lasts 120 minutes by default, and an overlap exits with code 3 and names the other holder.
Hash-chained journal
Each event stores the id of the one before it, so verify spots an edited, lost or reordered line.
Mid-session news hooks
Hooks tell a running session what the other tools did and say nothing when nothing changed.
Rules as interfaces
Each rule is one line with a trigger, an action and a prohibition under a stable ID, and layered loading folds topics until a prompt needs them.
Three doors in
Agents can use the AGENTS.md rules block, the command line or an MCP server with eight tools.
Dependency-free core
The core runs on the Python standard library; only the MCP server needs an extra package.
Stop two agents editing one directory
Before editing app/payments/, each agent runs claim; the second one gets exit code 3 and the holder name, and can pick other work.
Keep one set of rules across three tools
One rules block is copied into each tool rule file and synced 3-way, and a conflicting edit is never overwritten.
Tell a running session what another tool just did
Hooks add news from the other tools to a live Claude Code, Codex or Cursor session and stay silent when nothing changed.
Audit who did what
The hash-chained journal records commits, decisions and blockers per agent, and report flags tools that never log.
The nearest AI agent skills on Hokai for the same job.
| Skill | Works with | Connects by | Checked |
|---|---|---|---|
| Claude · Codex · Cursor | Skill file | 11 Nov | |
| Claude · Codex · Cursor · Gemini | Skill file | 11 Nov | |
| Claude · ChatGPT · Codex | MCP | 21 Oct | |
| Claude · Cursor · Windsurf | MCP | 21 Oct |
Nothing. It is MIT-licensed and the README lists no paid tier or hosted service. Your cost is the extra tokens your agents spend reading the shared rules and news that the hooks inject, which the 0.2.0 layered loading is meant to reduce.
No account is needed, and nothing beyond the Python standard library is required. After your first successful command the CLI asks once whether to star the project on GitHub, with no as the default; set NO_STAR_PROMPT to 1 to skip the question, and it stays silent in CI, pipes and scripts.
No. A claim is advisory: when an overlapping claim exists, the CLI exits with code 3 and the MCP tool says to coordinate or pick other work, but the new claim is still recorded and no hook blocks the edit. Claims expire after 120 minutes unless you set a different lifetime.
According to the install page it edits the Claude Code, Codex and Cursor hook configs, seeds the rules block into rule files and sets the global git hooks path. It shows every change as a diff and asks first, and the dry-run flag changes nothing. Review the diff before you accept it.
Run the aisync mcp command, which serves eight tools over stdio. It needs the optional mcp package, and since aisync is not on PyPI the working route found in testing is installing the release wheel with the extra: pip install "aisync[mcp] @ https://github.com/MaxonT/aisync/releases/download/v0.2.0/aisync-0.2.0-py3-none-any.whl".
Aisync is a small open-source coordination layer for AI coding agents, published on GitHub by an individual developer, MaxonT. It is a skill rather than an app: agents such as Claude Code, Codex and Cursor call its command line, hooks or MCP server to claim files before editing, log decisions to a shared journal and hear what the other tools did. The repository was created on 21 October 2026 and version 0.2.0 shipped on 9 November 2026.
Everything lives in one local hub, ~/.ai-sync, which is a git repository. A claim records which files an agent is working on for 120 minutes by default. If another agent holds an overlapping claim, the command exits with code 3 and names the holder, but the claim is still recorded and nothing stops an edit, so claims work only as far as agents obey them. Hooks inject news into a running session, and the journal chains each event to the one before so that a verify command can spot a changed line. The core uses only the Python standard library.
Version 0.2.0 added rules written as When, Do and Not lines with stable IDs, loaded in layers, plus the MCP server. The author reports that on the author's own hub this cut always-loaded rules from 20,673 to 7,876 tokens; these figures are not independently checked. On 11 November 2026 Hokai installed the 0.2.0 release wheel with the mcp extra into a clean Python 3.13 environment on Windows: it pulled in mcp 2.3.0, but the command stopped at import with No module named fcntl, which fits the macOS and Linux requirement. The name aisync is not on PyPI, since pip found no versions, so install from the release wheel.
Look elsewhere if claims must be enforced or you work on Windows. An npm package called agent-ops, which Hokai does not list yet, says its pre-commit hook blocks commits that touch another agent's claims; its repository shows no stars and no push since July 2026. For a different hook-based agent add-on see Cloakroom, and for more connectors the developer skills and MCP skills lists.
Protocol, authentication, permissions and the call contracts on this page are read from MaxonT's own documentation. The verdict is Hokai's reading of them, not the maintainer's claim.