Agent skill

Automerge Sync

by nteract in nteract/nteract

Automerge sync protocol internals, document model (OpSet, ChangeGraph, fork/merge, save/load lifecycle), and higher-level protocol design patterns.

BSD-3-ClauseAuto-check passedDevelopment

Install Automerge Sync

skills CLI
$ npx skills add nteract/nteract --skill automerge-sync -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install nteract/nteract automerge-sync --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/nteract/nteract.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/automerge-sync .claude/skills/automerge-sync && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
automerge-sync
GitHub stars
179
Token cost
~4.5k tokens
SKILL.md length
1,956 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
BSD-3-Clause

At a glance

Automerge sync protocol internals, document model (OpSet, ChangeGraph, fork/merge, save/load lifecycle), and higher-level protocol design patterns.

  • Works in 4 steps: Compute needed deps from their… → Build bloom filter from our changes… → Filter through their bloom (send what… → …
  • Debugging sync failures
  • SKILL.md covers Dependency baseline (2026-09-04), Document Model Essentials, Sync Protocol Internals and nteract Sync Architecture, plus 5 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Automerge Sync is an agent skill from nteract/nteract. Automerge sync protocol internals, document model (OpSet, ChangeGraph, fork/merge, save/load lifecycle), and higher-level protocol design patterns. Use when debugging sync failures, reasoning about convergence, changing reconnection logic, working with document structure, diagnosing panics in op application, adding new sync streams, or evaluating architectural patterns from automerge-repo and samod.

Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Design patterns. It works with Rust and WebAssembly. The repository describes itself as: We're back! Now firing notebooks out of a t-shirt gun. The licence is BSD-3-Clause.

When your agent uses it

  • Debugging sync failures
  • Reasoning about convergence
  • Changing reconnection logic
  • Working with document structure

Example prompts

  • “/automerge-sync”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Compute needed deps from their advertised heads
  2. Build bloom filter from our changes since shared_heads
  3. Filter through their bloom (send what they probably lack), deduplicate against sent_hashes
  4. If sending >1/3 of doc, send whole doc as V2 (more efficient)

What it can do on your machine

Read from SKILL.md and the folder at commit 32e010b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are rust).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Automerge Sync loads about 4.5k tokens when it runs. Until then it costs about 104 tokens; SKILL.md has 1,956 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~104
When it runs · the whole SKILL.md, loaded when a task matches
~4.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from nteract/nteract at commit 32e010b, republished under its BSD-3-Clause licence (© nteract). 1,956 words, ~4,550 tokens.

Download SKILL.mdSave it as .claude/skills/automerge-sync/SKILL.md (or your agent's skills folder).
name
automerge-sync
description
Automerge sync protocol internals, document model (OpSet, ChangeGraph, fork/merge, save/load lifecycle), and higher-level protocol design patterns. Use when debugging sync failures, reasoning about convergence, changing reconnection logic, working with document structure, diagnosing panics in op application, adding new sync streams, or evaluating architectural patterns from automerge-repo and samod.

Automerge Sync & Document Model

Dependency baseline (2026-09-04)

Production Rust and runtimed-wasm use crates.io Automerge exactly 0.11.0 (Cargo.toml:57, Cargo.lock:627). Commit ae6aef0f adopted it on 2026-08-26. The frontend uses these Rust WASM bindings, not @automerge/automerge.

The only remaining Automerge git dependency is automerge-legacy, a dev-dependency of automerge-store pinned to nteract/automerge revision 3fb6af5cc3af23b79f27cebfa339c8c98987e7b7 (Rust 0.10.0). It is a test peer for snapshot and encoded-sync compatibility, not a production patch override. See crates/automerge-store/Cargo.toml:17 and crates/automerge-store/tests/version_compat.rs:282.

Document Model Essentials

Core Types
TypeRoleKey detail
OpId(counter, actor_index)Universal op identifierROOT = (0,0). Counter is per-actor monotonic. Actor index is position in actor table.
ActorIdPeer identity (TinyVec<[u8;16]>)Lexicographic byte ordering is load-bearing. nteract uses "runtimed", "human:<uuid>".
ChangeBatch of ops with causal depsHas actor_id, seq (per-actor monotonic), deps (parent hashes), hash (SHA-256).
ChangeGraphDAG of historyheads = changes with no children. has_change(&hash) is O(1). Backs required_heads.
OpSetMaterialized document (columnar)Ops sorted by (object, key, lamport_ts). Rebuilt from columns on load().

Actor table ordering: OpSet.actors is a sorted Vec<ActorId>. Ops store only the index. If two documents disagree on index→actor mapping, ops are misinterpreted. This is the root of the historical #1187 panic class.

The Automerge / AutoCommit Structs
rust
// Automerge: raw document
Automerge { queue: ChangeQueue, change_graph: ChangeGraph, deps: HashSet<ChangeHash>, ops: OpSet, actor: Actor }

// AutoCommit: wrapper nteract uses
AutoCommit { doc: Automerge, transaction: Option<(PatchLog, TransactionInner)>,
             patch_log: PatchLog, diff_cursor, save_cursor, isolation: Option<Vec<ChangeHash>> }

Auto-transaction: Mutations open a transaction implicitly. Reads, save(), fork(), merge(), and sync() commit pending ops first.

Isolation mode: isolate(heads) limits visible state. Mutations while isolated depend on isolation heads, not tips. integrate() returns to latest.

PatchLog: Tracks diffs for incremental materialization. nteract's WASM computes CellChangeset by diffing after sync frames.

save() and load()
  • save() serializes OpSet columns + ChangeGraph metadata + optional DEFLATE. Columnar format is canonical.
  • load() rebuilds OpSet from columns, reconstructs ChangeGraph, verifies heads.
  • save/load round-trip rebuilds indices from serialized state. nteract's rebuild_from_save() can fail or reject cell loss; it is containment, not a guarantee that arbitrary corruption is repaired.
  • load_incremental() adds changes to existing doc. This is what receive_sync_message calls internally.
  • save_after(heads) emits only changes after given heads (incremental saves).
Fork and Merge
MethodSemanticsCost
fork()Deep clone + new random actorO(doc size)
fork_at(heads)Replay changes up to heads into fresh docMore expensive than fork; use for views/diagnostics
merge(other)Apply other's new changes to selfO(changes added)

DuplicateSeqNumber trap: Two concurrent forks sharing the same ActorId produce changes with identical (actor, seq). The second merge fails. Use unique actors for concurrent forks.

Document Size
FactorGrowthNotes
OperationsO(total mutations)Largest factor
TombstonesAccumulate foreverNo built-in GC
Actor tableO(unique peers)Small per entry
ChangeGraphO(total changes)Metadata per change

save() compacts via columnar + DEFLATE. No history compaction exists.

Sync Protocol Internals

Sync Message Structure
Message { heads, need, have: Vec<Have>, changes: ChunkList, flags, version }
  • heads: "here's what I have"
  • need: "I'm missing these specific changes"
  • have: bloom filter (1% FP rate, 10 bits/entry, 7 probes) of changes since last_sync
  • changes: actual change data
  • Sender sends a change only if all peer bloom filters say they lack it
sync::State: Per-Peer Session
FieldPersists across encode/decode?Purpose
shared_headsYesHashes both peers agree they share
last_sent_headsNoOur heads at last send
their_heads / their_need / their_haveNoPeer's last advertisement
sent_hashesNoDedup already-sent changes
in_flightNoSuppresses duplicate sends while awaiting ack
have_respondedNoTrue after first message sent

Critical: encode() only serializes shared_heads. All else is session-ephemeral. sync::State::new() is always safe for reconnection: you lose optimization (may resend) but keep correctness.

In-Flight Suppression

generate_sync_message() returns None when in_flight && last_sent_heads == our_heads && have_responded. Any incoming message sets in_flight = false (counts as ack). If you need a fresh exchange, reset sync state rather than working around None.

Change Selection
  1. Compute needed deps from their advertised heads
  2. Build bloom filter from our changes since shared_heads
  3. Filter through their bloom (send what they probably lack), deduplicate against sent_hashes
  4. If sending >1/3 of doc, send whole doc as V2 (more efficient)
Version Negotiation

V1 is original; V2 allows compressed document encoding. Backward-compatible via MessageFlags appended to V1 messages. V2 discovered via flags, then used for subsequent messages.

nteract Sync Architecture

Document Streams Over One Socket
StreamFrameDocumentOwnership
Notebook0x00 AutomergeSyncSharedDocState.docBidirectional
RuntimeState0x05 RuntimeStateSyncSharedDocState.state_docDaemon-authoritative
CommsDoc0x09 CommsDocSyncSharedDocState.comms_docWidget state, gated by RuntimeStateDoc topology
CommentsDoc0x0a CommentsDocSyncSharedDocState.comments_doc (typed clients + frontend WASM); daemon replica persisted by comments_store.rsNotebook-room comments sidecar; ingress validates change actor labels against the connection principal
PoolState0x06 PoolStateSyncPoolDocFrontend owns sync state; daemon carries pool_peer_state separately

For CommentsDoc, see crates/comments-doc, daemon persistence at crates/runtimed/src/notebook_sync_server/comments_store.rs, ingress at peer_comments_sync.rs. Typed clients (notebook-sync crate) and frontend WASM (runtimed-wasm) both hold CommentsDoc replicas. Optimistic client mutations apply via Automerge; the daemon validates change actor labels against the connection principal (clone-preview) and strips writes from scopes without comment authority. There is no daemon finalization step. Attribution (resolved_by_actor_label, resolved_at) is projected from admitted change actors.

Sync Task Loop (biased select!)

Priority: Frame (drain socket) → Changed (outbound sync) → Command (RPC) → Maintenance (50ms tick).

Mutex is std::sync::Mutex, never held across .await. Poison recovery: unwrap_or_else(|e| e.into_inner()).

Document-Level Recovery

Automerge is treated as a fallible boundary. Policy belongs to the document owner; sync and mutation helpers do not handle panics the same way.

Sync policy (2026-09-04):

  • recoverable_automerge_operation rebuilds and retries once only for a caller-marked operation error. It returns a caught panic immediately, without rebuild or retry (crates/automerge-recovery/src/lib.rs:163–201).
  • NotebookDoc::receive_sync_message_recovering marks only AutomergeError::PatchLogMismatch(_) recoverable. It resets the peer's sync::State, rebuilds the document, then retries the original frame once (crates/notebook-doc/src/lib.rs:2479–2508, crates/automerge-recovery/src/lib.rs:159–160).
  • NotebookDoc::generate_sync_message_recovering marks no operation error recoverable; caught panics are returned to the caller (crates/notebook-doc/src/lib.rs:2446–2464).

Mutation policy: NotebookDoc::merge_recovering attempts to rebuild both sides after a panic, then returns the failure. transact_at_heads_recovering restores actor/isolation state and attempts rebuild on panic without rerunning the mutation closure (crates/notebook-doc/src/lib.rs:400–491). RuntimeStateDoc has its own transaction recovery and rollback handling (crates/runtime-doc/src/doc.rs:761–819). These are nteract wrappers around upstream APIs, not fork-only methods.

Notebook rebuild: rebuild_from_save saves and loads the document, rejects a result with fewer cells, and preserves the actor before replacing the live document (crates/notebook-doc/src/lib.rs:1477–1502). Rebuild can fail. Peer state reset belongs to the calling sync helper, not to rebuild_from_save. Do not treat save/load as proof that arbitrary corruption has been repaired.

Causal Ordering: required_heads (preferred)
  1. Client captures current heads via DocHandle::current_heads_hex()
  2. Sends request with required_heads in envelope
  3. Daemon's wait_for_required_heads() checks containment via get_change_by_hash
  4. Defers processing until all heads arrive (10s timeout) or proceeds immediately
  5. Sync loop stays unblocked; only that specific request waits

confirm_sync (legacy alternative): Client-side waiter on shared_heads. Blocks client, daemon free. Still used for SaveNotebook.

ScenarioUse
Execute / run-allrequired_heads via send_request_after_heads
Client-initiated saveconfirm_sync before SaveNotebook request
Daemon-internal autosaveNeither; daemon reads its own doc directly
RuntimeStateDoc Output Pressure

RuntimeStateDoc is the durable state boundary, not the hot transport for every transient kernel event. Control-plane signals must stay independent of output work:

  • KernelIdle, ExecutionDone, CellError, and KernelDied use reliable lifecycle/control paths, not bounded output queues.
  • stdout/stderr stream chunks may be periodically flushed through bounded, droppable work, but ordering boundaries use the stream committer priority path so terminal state follows the final durable stream manifest.
  • Output widget replay back to the kernel is best-effort; widget state in RuntimeStateDoc is the durable truth.
  • update_display_data with a display_id is transient display churn. Coalesce to the latest pending value per display_id off the IOPub path, then flush before ExecutionDone.
Show full SKILL.md (773 more words)Show less

Protocol Design Patterns

Architecture Comparison
automerge-reposamodnteract
TopologyMesh, transport-agnosticSans-IO state machineDirect socket to single daemon
Heads trackingRemoteHeadsSubscriptions (pub/sub)Per-peer monotonic counters on every messagerequired_heads (request-scoped causal gate)
On disconnectKeep sync state, encode/decode to clear in-flightClean slate (peer_disconnected)Clean slate (sync::State::new())
Batch→IncrementalBloom filter exchange → live sync framesFingerprint reconciliation → subscription pushSame as raw automerge
TestabilityAsync, needs mocksPure sans-IO functionsAsync select! loop

nteract implements required_heads in its daemon: it defers one request until its causal preconditions are met while sync continues unblocked.

Settings Sync

Settings have two distinct client shapes:

  • Long-lived watchers use SyncClient::connect, then keep receiving recv_changes. ACK-only frames are processed without emitting document changes. Watch writes send immediately and require continued receiving. Failed or cancelled writes close the connection in both modes; reconnect before retrying.
  • One-shot command paths use SyncClient::connect_snapshot / connect_snapshot_with_timeout. Their writes drive heads/need exchanges until the daemon confirms all local changes, with a two-second deadline. Sending one frame alone is insufficient because Bloom false positives can require another round. A failed or cancelled write closes the connection.

Both paths wait until the daemon's advertised heads are present, bounded by one deadline covering connection, handshake, and initial sync. Neither probes for quiescence with a timed partial-frame read. Initialization timeout or cancellation drops the connection; callers reconnect with fresh peer state. If a recv_changes future is cancelled, discard that client and reconnect.

Do not route connected-window settings UX through the JSON watcher. The daemon persists settings.json for durability and imports external edits through a debounced file watcher; ordinary window-to-window propagation should use the settings sync stream plus Tauri settings:changed events.

Connection Lifecycle
SystemOn DisconnectOn ReconnectPreserved
automerge-repoKeep sync stateencode/decode clears in-flight, keeps shared_headsSync state
samodRemove + peer_disconnectedFresh handshake + batch syncNothing
nteractClear session, stash targetsync::State::new() + full handshakeSession identity only

If reconnect latency becomes a problem, preserving shared_heads (automerge-repo approach) could reduce initial sync burst.

nteract Mutation Patterns

ScenarioMethod
Synchronous batch mutationfork_and_merge(|fork| { ... })
Async write from captured headstransact_at_heads_recovering(&baseline_heads, actor, label, |doc| { ... })
Concurrent async forkfork_with_actor("runtimed:iopub:kernel-abc") (unique actor per fork)
Per-cell O(1) reads (WASM)Direct map lookups via ObjIndex
Recovery from corrupted indicessave() → load() round-trip
Historical desktop patches

The fork addressed historical MissingOps and patch-log failures. Production has since moved to crates.io 0.11.0. The local upstream source contains the fork_at dependency-walk deduplication, no-op actor cleanup, stale-orphan sync correction, and historical-view patch finalization. This is not an exhaustive accounting of the 21 patches recorded in the earlier b3502d42 rebase.

Keep the regressions in crates/automerge-recovery/src/lib.rs:416–483 and the document-owned policies above. A fixed historical bug does not justify removing recovery or treating every Automerge failure as rebuildable.

Adding a New Sync Stream

  1. Allocate frame type in notebook-wire
  2. Choose ownership pattern:
    • SharedDocState pattern (notebook, runtime-state): doc + peer_state in SharedDocState, managed by sync_task.rs
    • Separate ownership (pool-state): frontend owns sync state; daemon carries peer state in peer loop
  3. Add document-owned recovery helpers with explicit error classification; return sync panics rather than automatically rebuilding or retrying them.
  4. Add rebuild validation and peer-state reset for recoverable sync errors, following the document-owned policy above.
  5. Update biased select loop or relevant frame handler
  6. Consider subscription scope: Every peer or specific consumers?
  7. Test with concurrent mutation: Actor/heads bugs only manifest under concurrent sync

Invariants

  • Each remote peer gets its own sync::State. Sharing causes duplicate/missing sends.
  • generate_sync_message() returning None after local mutations is correct (in-flight suppression)
  • Keep the frame reader draining: use waiters, not blocking waits
  • Lock scope drops before .await: compute inside lock, send outside
  • Reset sync state on reconnect and classified recoverable sync errors, not on local mutations; caught sync panics return a failure.
  • The notebook rebuild guard rejects fewer cells; it does not prove that all content is unchanged.
  • Actor table is sorted lexicographically. Disagreement corrupts OpIds.

Decision Framework

SituationAction
Transport disconnectReset sync::State (new or encode/decode)
Recoverable sync error (PatchLogMismatch)Reset peer state, rebuild, retry once; return failure if recovery fails
Sync panic caughtReturn failure without rebuild or retry
Mutation panic caughtFollow the document helper's cleanup/rebuild policy; do not rerun the closure
Local mutationLet next generate_sync_message handle it
Check if peer has changeschange_graph.has_change(&hash) (O(1))
Document at earlier pointfork_at(heads) (expensive, views only)
Async notebook write at captured headstransact_at_heads_recovering()
Concurrent async forkfork_with_actor() with unique actor
Shrink document bytessave() compacts; no history GC available
Daemon must see edits before executingrequired_heads (not confirm_sync)
Adding a new sync streamNew frame type + sync::State + recovery helper
Should this block client or daemon?Prefer daemon-side waits (required_heads)
Should protocol logic be async?Consider sans-IO for testability (samod pattern)

© nteract, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/automerge-sync of nteract/nteract.

Open the folder on GitHubat commit 32e010b

Compare with similar skills

Automerge Sync next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Automerge Sync compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Automerge Sync this skillnteract/nteract179—~4.5kAutomated safety check: PassBSD-3-Clause
RTK Rust Design Patternsrtk-ai/rtk83k—~1.9kAutomated safety check: PassApache-2.0
Style Checkernoumena-labs/Sipp121—~1.4kAutomated safety check: PassApache-2.0
Working With Nixxmtp/libxmtp121—~1.4kAutomated safety check: PassMIT
Upgrade Dear Imgui StackLatias94/dear-imgui-rs107—~977Automated safety check: PassApache-2.0
shiguredo_mp4 Rust MP4 Library Referenceshiguredo/mp4-rs159—~4.4kAutomated safety check: PassApache-2.0

Similar skills

  • Describes seven Rust design patterns for the RTK CLI filter modules, with when to use each, RTK examples, and notes on when a pattern is overkill.

    83k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Style Checker

    noumena-labs/Sipp

    Enforces this monorepo's coding style rules by inspecting git diffs, reading .agents/skills/style-checker/references/styleguidance.md, fixing style violations, and reporting the result.

    121 GitHub stars~1.4k tokensUpdated 19 days ago
    DevelopmentAuto-check passed
  • Working With Nix

    xmtp/libxmtp

    A skill your agent uses when working with Nix flakes, selecting devShells, debugging environment issues, or understanding Nix infrastructure - covers shell selection, environment detection, common…

    121 GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Upgrade Dear Imgui Stack

    Latias94/dear-imgui-rs

    A skill your agent uses when a user asks to upgrade Dear ImGui, cimgui, ImPlot, ImPlot3D, ImNodes, ImGuizmo, Dear ImGui Test Engine, or related bindings in this repository.

    107 GitHub stars~977 tokensUpdated today
    DevelopmentAuto-check passed
  • API reference for the shiguredo_mp4 Rust library: muxing and demuxing MP4 and fragmented MP4, encoding and decoding boxes, and its Sans I/O design.

    159 GitHub stars~4.4k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Profile the native Rust wado binary (compile/serve/run) for host-side bottlenecks — CPU with a sampling profiler, memory with the span trace's RSS and valgrind DHAT.

    117 GitHub stars~2.9k tokensUpdated today
    DevelopmentAuto-check: notes

More from nteract/nteract

All 10 skills in this repo
  • Daemon Dev

    nteract/nteract

    Develop, debug, and manage the runtimed daemon, Python bindings, and build system.

    179 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Execution Pipeline

    nteract/nteract

    The end-to-end cell execution pipeline from MCP tool call through daemon to kernel and back.

    179 GitHub stars~2.7k tokensUpdated today
    Auto-check passed
  • Nteract Diagnostics

    nteract/nteract

    Pull and triage submitted nteract diagnostics archives from Cloudflare using a diagnostics id/token.

    179 GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Repl

    nteract/nteract

    Use nteract notebooks as a persistent Python REPL. An agent skill from nteract/nteract.

    179 GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • Testing

    nteract/nteract

    Run tests, verify changes, and collect diagnostics. An agent skill from nteract/nteract.

    179 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Architecture

    nteract/nteract

    Architecture and documentation framing for cross-cutting repo decisions, docs taxonomy placement, ADRs, memos, PRDs, implementation plans, audits, measurements, runbooks, and source-grounded…

    179 GitHub stars~497 tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Automerge Sync

What does Automerge Sync do?

Automerge sync protocol internals, document model (OpSet, ChangeGraph, fork/merge, save/load lifecycle), and higher-level protocol design patterns. Automerge Sync is an agent skill from nteract/nteract. Automerge sync protocol internals, document model (OpSet, ChangeGraph, fork/merge, save/load lifecycle), and higher-level protocol design patterns.

When should I use Automerge Sync?

Automerge Sync fits situations like: debugging sync failures; reasoning about convergence; changing reconnection logic; working with document structure.

How do I install Automerge Sync in Claude Code?

Run `npx skills add nteract/nteract --skill automerge-sync -a claude-code`. Or copy the skill folder (.agents/skills/automerge-sync in nteract/nteract) into .claude/skills/automerge-sync in your project. Claude Code loads it when a task matches its description.

How do I install Automerge Sync in Codex?

Run `npx skills add nteract/nteract --skill automerge-sync -a codex`. Or copy the skill folder (.agents/skills/automerge-sync in nteract/nteract) into .agents/skills/automerge-sync in your project. Codex loads it when a task matches its description.

Can I use Automerge Sync in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nteract/nteract --skill automerge-sync -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/automerge-sync, .gemini/skills/automerge-sync, .github/skills/automerge-sync and .opencode/skills/automerge-sync in your project.

What does Automerge Sync need to run?

SKILL.md names no scripts, command-line tools or credentials: Automerge Sync is instructions for the agent only.

Does Automerge Sync access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Automerge Sync safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Automerge Sync use?

Automerge Sync is published under the BSD-3-Clause licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Automerge Sync use?

About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Automerge Sync?

Skills that share tags, products or a category with Automerge Sync: RTK Rust Design Patterns (rtk-ai/rtk, 83k stars), Style Checker (noumena-labs/Sipp, 121 stars), Working With Nix (xmtp/libxmtp, 121 stars) and Upgrade Dear Imgui Stack (Latias94/dear-imgui-rs, 107 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Automerge Sync?

nteract (a GitHub organization) maintains it in nteract/nteract, which has 179 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 9, 2026.

Source: nteract/nteract on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.