suture-driver-otio 5.1.0

A patch-based version control system with semantic merge and format-aware drivers
Documentation

Try the Demo · Install · Docs · Pricing

crates.io npm PyPI License


Why Suture?

Git's merge is line-based. When two branches change different keys in a JSON file, Git reports a conflict — even though there's no actual conflict.

Before (Git):

<<<<<<< HEAD
  "version": "5.1.0",
  "features": ["merge", "diff", "platform"]
=======
  "license": "AGPL-3.0"
>>>>>>> feature

After (Suture):

{
  "version": "5.1.0",
  "features": ["merge", "diff", "platform"],
  "license": "AGPL-3.0"
}

Install as Git Merge Driver (5 seconds)

curl -fsSL https://raw.githubusercontent.com/WyattAu/suture/main/scripts/install-merge-driver.sh | bash

That's it. Git will now automatically merge: *.json *.yaml *.yml *.toml *.xml *.csv

Installation

Method Command
Cargo cargo install suture-merge-driver
Homebrew brew install WyattAu/suture-merge-driver/suture-merge-driver
npm npm install -g suture-merge-driver
PyPI pip install suture-merge-driver
Binary GitHub Releases

Supported Formats

Format Extensions Features
JSON .json Deep merge, arrays, conflicts
YAML .yaml .yml Mappings, anchors, arrays
TOML .toml Tables, arrays, inline tables
XML .xml Elements, attributes
CSV .csv Row-based by key column
SQL .sql Statement-level
HTML .html DOM tree merge
Markdown .md Section-based
SVG .svg Element merge
Properties .properties .ini Key-value
DOCX .docx Binary (merge_raw)
XLSX .xlsx Binary (merge_raw)
PPTX .pptx Binary (merge_raw)
PDF .pdf Binary (merge_raw)
Image .png .jpg Binary (merge_raw)
RSS/Atom .rss .atom Feed merge
iCal .ics Calendar merge
OTIO .otio Timeline merge

CLI

# Initialize a repository
suture init my-project
cd my-project

# Create and switch branches
suture branch feature/json-config
suture checkout feature/json-config

# Make changes, then commit
suture add config.json
suture commit "update config"

# Merge automatically resolves conflicts
suture merge main

# Push/pull to a hub
suture remote add origin https://hub.example.com
suture push origin
suture pull origin

API

curl -X POST https://merge.suture.dev/api/merge \
  -H "Content-Type: application/json" \
  -d '{
    "driver": "json",
    "base": "{\"name\": \"base\"}",
    "ours": "{\"name\": \"ours\"}",
    "theirs": "{\"name\": \"theirs\"}"
  }'

Full API Documentation

GitHub Actions

- uses: WyattAu/suture/.github/actions/merge@main
  with:
    files: |
      package.json
      tsconfig.json
    base-ref: ${{ github.event.pull_request.base.sha }}

Self-Hosted Hub

docker compose up -d
# Hub available at http://localhost:8080

See Self-Hosting Guide for Docker, binary, Kubernetes, and systemd deployment.

Platform

merge.suture.dev — Hosted semantic merge API

Plan Price Merges Storage Features
Free $0 100/mo 100 MB 5 core drivers
Pro $9/user/mo 10,000/mo 10 GB All drivers, analytics
Enterprise $29/user/mo Unlimited 100 GB SSO, audit, SLA

Self-hosted is always free (AGPL-3.0).

VS Code Extension

Install from the VS Code Marketplace:

  • Conflict highlighting
  • One-click auto-merge
  • Status bar integration

Architecture

suture/                          # Monorepo root
├── crates/
│   ├── suture-core/            # Merge engine (342 tests)
│   ├── suture-driver-*/        # 18 format drivers
│   ├── suture-cli/             # CLI (115 tests)
│   ├── suture-hub/             # Coordination server (50 tests)
│   ├── suture-platform/        # Hosted SaaS
│   ├── suture-raft/            # Consensus (48 tests)
│   ├── suture-vfs/             # FUSE filesystem
│   ├── suture-wasm-plugin/     # WASM plugin system
│   ├── suture-tui/             # Terminal UI (37 tests)
│   └── suture-lsp/             # Language server (25 tests)
├── desktop-app/                # Tauri desktop app
├── vscode-extension/           # VS Code extension
├── templates/                  # .gitattributes templates
├── scripts/                    # Install scripts
├── deploy/                     # Helm chart, Docker
└── docs/                       # Guides, blog, SEO

License