Free · Rust · Tauri · v0.1 Alpha

Stop branching.
Start weaving.
Deja las ramas.
Empieza a tejer.

A version control system for the age of AI agents. Patches, not snapshots. Deterministic merges. N agents in parallel — no conflicts, no stash, no branch hell. Un sistema de control de versiones para la era de los agentes IA. Patches, no snapshots. Merges determinísticos. N agentes en paralelo — sin conflictos, sin stash, sin infierno de ramas.

Install the gw CLI — free Instala el CLI gw — gratis
brew install rvielma/tap/gitweave
Free to useGratis ~4 MB macOS · Linux · Windows All releasesTodas las versiones Desktop app: coming soonApp de escritorio: próximamente
gitweave — ~/projects/api-hercules
❯ gw init
✓ Initialized patch store in .gw/
 
❯ gw slot create feature-auth -o claude-1
✓ WorkSlot id=a3f7c2 agent=claude-1
❯ gw slot create bugfix-routes -o claude-2
✓ WorkSlot id=b8e1d4 agent=claude-2
 
❯ gw merge a3f7c2 b8e1d4
✓ Hunk intersection: ∅ — merged instantly 14ms
 
❯ gw release v1.2.0 -m "auth + routes"
froze v1.2.0 — 12 patches
digest 3f2a91b7c4d8
❯ gw push origin
pushed 12 new commit(s) · release tags: v1.2.0
❯

The model, not the toolingEl modelo, no la herramienta

Git tracks states.
It should track changes.
Git guarda estados.
Debería guardar cambios.

This isn't an argument about GitFlow. Trunk-based development with two-hour branches removes the ceremony, not the model underneath it: a merge still reconstructs what changed by comparing three snapshots. Everything below follows from that reconstruction — and no branching convention on top of Git can remove it. Esto no es un argumento contra GitFlow. Trunk-based con ramas de dos horas elimina la ceremonia, no el modelo que hay debajo: un merge sigue reconstruyendo qué cambió comparando tres snapshots. Todo lo de abajo se deriva de esa reconstrucción — y ninguna convención de ramas sobre Git puede quitarla.

The snapshot modelEl modelo de snapshots

What every workflow on top of Git inheritsLo que hereda cualquier flujo sobre Git

  • ✗The merge depends on integration order, not just on contentEl merge depende del orden de integración, no solo del contenido
  • ✗The common ancestor is a snapshot: it doesn't know what changed, it infers itEl ancestro común es un snapshot: no sabe qué cambió, lo reconstruye
  • ✗A cherry-pick creates a new commit — the same change with two identitiesUn cherry-pick crea un commit nuevo — el mismo cambio con dos identidades
  • ✗Reverting an old change means rewriting history or stacking an inverseRevertir un cambio antiguo exige reescribir historia o apilar un inverso
  • ✗No notion of dependency between changes — only temporal orderNo hay noción de dependencia entre cambios, solo de orden temporal
GitWeave

The patch modelEl modelo de patches

  • ✓Independent patches commute: same set, same result, any orderLos patches independientes conmutan: mismo conjunto, mismo resultado, en cualquier orden
  • ✓The change is the stored unit — nothing is inferred from a base stateEl cambio es la unidad almacenada — nada se infiere de un estado base
  • ✓A patch keeps its blake3 identity as it propagates between slotsUn patch conserva su identidad blake3 al propagarse entre slots
  • ✓State is the applied set, not a chain — there is no history to rewriteEl estado es el conjunto aplicado, no una cadena — no hay historia que reescribir
  • ✓deps: Vec<PatchId> — dependency is declared, not implied by timedeps: Vec<PatchId> — la dependencia es declarada, no implícita en el tiempo
Same scenarioMismo escenario Two agents edit src/auth.rs at the same time. One touches lines 12–18, the other lines 80–95. Dos agentes editan src/auth.rs a la vez. Uno toca las líneas 12–18, el otro las 80–95.
Git asksGit pregunta

“Given the base snapshot, my tree and their tree, what text should the file contain?” It has to rebuild both edits from state differences, then guess whether they can coexist. The answer moves if the merge base moves — a rebase, an octopus merge, or a criss-cross history changes the outcome without any line of code changing. «Dado el snapshot base, mi árbol y el suyo, ¿qué texto debe tener el archivo?» Tiene que reconstruir ambas ediciones a partir de diferencias de estado y luego adivinar si pueden coexistir. La respuesta se mueve si se mueve la base — un rebase, un merge de varias ramas o un historial cruzado cambian el resultado sin que cambie una línea de código.

auto-merge succeeded — because the hunks landed far apart, not because anything proved they were independent auto-merge exitoso — porque los hunks quedaron lejos, no porque algo haya probado que son independientes
GitWeave asksGitWeave pregunta

“Do these two hunks intersect?” Same file, overlapping line ranges — a structural test over the patches themselves, never over the resulting file. No base snapshot is consulted, so there is nothing for history shape to perturb. «¿Se intersectan estos dos hunks?» Mismo archivo, rangos de líneas solapados — una prueba estructural sobre los patches, nunca sobre el archivo resultante. No se consulta ningún snapshot base, así que no hay nada que la forma del historial pueda alterar.

// gw-core/src/conflict.rs pub fn intersects(&self, other: &Hunk) -> bool { self.file_path == other.file_path && self.start_line <= other.end_line && other.start_line <= self.end_line }
12–18 ∩ 80–95 = ∅ → the patches commute. The merge is unique by construction, in any order. 12–18 ∩ 80–95 = ∅ → los patches conmutan. El merge es único por construcción, en cualquier orden.
What this buys a human reviewer: the question stops being “whose version of this file wins?” and becomes “is this patch correct?” Reviewing independent changes is a judgement about code. Arbitrating a textual conflict is a judgement about a merge artifact that neither author wrote. Lo que gana un revisor humano: la pregunta deja de ser «¿qué versión del archivo gana?» y pasa a ser «¿este patch es correcto?». Revisar cambios independientes es un juicio sobre código. Arbitrar un conflicto textual es un juicio sobre un artefacto de merge que ninguno de los dos autores escribió.

The lineage. “Changes, not states” is Darcs (2003), then Pijul. Darcs had the right model and died on merges that blew up exponentially; Pijul rebuilt it on sound patch theory. GitWeave takes the same premise and answers the complexity problem structurally: conflict detection is a line-range intersection over hunks — quadratic in hunks per pair, with no search and no backtracking. And it exports to plain Git commits, so GitHub, your PRs and your CI never learn that anything changed. Read the theory → El linaje. «Cambios, no estados» es la tesis de Darcs (2003) y después Pijul. Darcs tenía el modelo correcto y murió por merges que explotaban exponencialmente; Pijul lo reconstruyó sobre teoría de patches sana. GitWeave parte de la misma premisa y responde al problema de complejidad de forma estructural: detectar un conflicto es intersectar rangos de líneas entre hunks — cuadrático en hunks por par, sin búsqueda ni backtracking. Y exporta a commits Git normales, así que GitHub, tus PRs y tu CI nunca se enteran de que cambió algo. Lee la teoría →


Core primitivesPrimitivas core

Three ideas that change everything Tres ideas que cambian todo

◆

Immutable patchesPatches inmutables

Every change is content-addressed via blake3. Permanent, verifiable, composable. No history rewriting, ever.Cada cambio está identificado por blake3. Permanente, verificable, composable. Sin reescritura de historial.

⊕

Algebraic mergesMerges algebraicos

Two patches conflict only when their hunks intersect — mathematically. No 3-way merge heuristics. No "ours vs theirs".Dos patches conflictúan solo cuando sus hunks se intersectan — matemáticamente. Sin heurísticas de merge.

⚡

Agent-native APIAPI nativa para agentes

gRPC endpoints built for Claude, Cursor, or any autonomous process. Open a WorkSlot, write patches, merge — without humans.Endpoints gRPC para Claude, Cursor o cualquier proceso autónomo. WorkSlot, patches, merge — sin humanos.

⧓

WorkSlots

N developers or agents work in isolated slots simultaneously. No locking, no blocking. Ephemeral workspaces — create, fill, merge, done.N desarrolladores o agentes en slots aislados en paralelo. Sin locks ni bloqueos. Espacios de trabajo efímeros.

⇄

Git bridgePuente Git

Push to GitHub as normal commits. GitWeave is the source of truth; Git is the export format. Zero lock-in.Push a GitHub como commits normales. GitWeave es la fuente de verdad; Git es el formato de exportación.

▣

Native desktop appApp de escritorio nativa

Built with Tauri — ~14MB for Mac, Windows & Linux. Rust backend, modern web UI. No Electron, no Chrome bundled inside.Construido con Tauri — ~14MB para Mac, Windows y Linux. Backend Rust, UI web moderna. Sin Electron.


Under the hoodBajo el capó

The types are the architectureLos tipos son la arquitectura

A Patch knows its hash, its deps, and its hunks. The ConflictEngine asks one question: do hunks intersect? No heuristics.Un Patch conoce su hash, sus deps y sus hunks. El ConflictEngine hace una pregunta: ¿se intersectan los hunks? Sin heurísticas.

Written in Rust. No unsafe, no unwrap in production code. Built for correctness.Escrito en Rust. Sin unsafe ni unwrap en producción. Construido para ser correcto.

patch modelRust
// Every change is this struct pub struct Patch { pub id: PatchId, // blake3 pub deps: Vec<PatchId>, // explicit pub hunks: Vec<Hunk>, // line diffs pub author: AgentId, pub meta: PatchMeta, } impl ConflictEngine { pub fn can_merge( a: &Patch, b: &Patch ) -> bool { // One question. No heuristics. a.hunks .intersection(&b.hunks) .is_empty() } }

How it worksCómo funciona

Zero to merge
in five commands
De cero a merge
en cinco comandos

01

Initialize the storeInicializar el store

Creates .gw/ with the local PatchStore. Works on existing Git repos too.Crea .gw/ con el PatchStore local. Compatible con repos Git existentes.

gw init
02

Open a WorkSlotAbrir un WorkSlot

Each developer or agent gets an isolated slot. No branch creation, no checkout, no switching.Cada desarrollador o agente obtiene un slot aislado. Sin crear ramas, sin checkout, sin switching.

gw slot create my-feature -o raphael
03

Write patchesEscribir patches

Edit files normally. GitWeave tracks changes as immutable patches with explicit dependencies.Edita archivos normalmente. GitWeave registra cambios como patches inmutables con dependencias explícitas.

gw record -m "fix auth middleware"
04

Merge deterministicallyMerge determinístico

No conflicts unless hunks truly intersect. If they don't — instantaneous. If they do — GitWeave tells you exactly which lines collide.Sin conflictos a menos que los hunks se toquen. Si no — instantáneo. Si sí — GitWeave te dice exactamente qué líneas.

gw merge slot-a slot-b
05

Release and pushRelease y push

Freeze a curated patch set as a release — name a patch and its dependencies come along, because a change can't ship without what it was built on. It leaves your repo as an annotated Git tag, so your CI/CD pipeline sees nothing different.Congela un patch set curado como release — nombra un patch y sus dependencias vienen con él, porque un cambio no puede salir sin aquello sobre lo que se construyó. Sale de tu repo como un tag Git anotado, así que tu CI/CD no nota diferencia.

gw release v1.0.0 --patch 4f2a91 && gw push origin

New in 0.1Nuevo en 0.1

Code review,
built into the patch model
Code review
integrado en el modelo de patches

Approve, request changes, or comment on any patch — from the desktop app, the CLI, or the gRPC API. Reviews are structural: they live on the patch, not on a PR. Aprueba, solicita cambios o comenta en cualquier patch — desde la app de escritorio, el CLI o la API gRPC. Los reviews son estructurales: viven en el patch, no en un PR.

✓

Patch reviewsReviews de patches

Approve, request changes, or comment on individual patches. Verdict is computed automatically: approved, changes_requested, or pending. Aprueba, solicita cambios o comenta en patches individuales. El veredicto se calcula automáticamente: approved, changes_requested o pending.

◇

Activity feedFeed de actividad

A unified timeline of patches and review status across all slots. See what happened, who reviewed what, and what still needs attention — at a glance. Timeline unificado de patches y estado de review en todos los slots. Ve qué pasó, quién revisó qué y qué necesita atención — de un vistazo.

⧗

Dependency stacksStacks de dependencia

Like Graphite's stacked PRs, but native to the patch model. gw stack shows the full dependency chain from root to tip, with review status on each. Como los stacked PRs de Graphite, pero nativos al modelo de patches. gw stack muestra la cadena completa de dependencias de raíz a tip, con estado de review en cada uno.

⌘

Hunk-level recordingRegistro por hunks

Two concerns in one file shouldn't become one patch. gw diff --hunks lists them, gw record --hunk f:1 takes one, -p asks one by one. What you leave behind stays pending. Dos asuntos en un fichero no deberían ser un solo patch. gw diff --hunks los lista, gw record --hunk f:1 se lleva uno, -p pregunta uno a uno. Lo que dejas sigue pendiente.

🔒

Frozen releasesReleases congelados

gw release v1.2.0 freezes a patch set: an ordered list of ids plus a blake3 digest. Name a patch and its dependencies come along. Ships as an annotated Git tag. gw release v1.2.0 congela un patch set: lista ordenada de ids más un digest blake3. Nombra un patch y sus dependencias vienen con él. Sale como tag Git anotado.

⚙

.gwignore

Exclude files from tracking with glob patterns. Like .gitignore, but for the GitWeave model. Built-in defaults for target/, node_modules/, dist/. Excluye archivos del tracking con patrones glob. Como .gitignore, pero para el modelo GitWeave. Defaults integrados para target/, node_modules/, dist/.

▸

Rich CLICLI completo

gw stack · gw review approve · gw review show — manage reviews and visualize stacks from the terminal. Full gRPC client SDK for building custom agents. gw stack · gw review approve · gw review show — gestiona reviews y visualiza stacks desde la terminal. SDK gRPC completo para construir agentes custom.

⇅

gw syncgw sync

Verify that a slot has no conflicts with the rest of the repository. Like Aviator's av sync, but without rebasing — patches are immutable, so sync just checks compatibility. Verifica que un slot no tiene conflictos con el resto del repositorio. Como av sync de Aviator, pero sin rebase — los patches son inmutables, sync solo verifica compatibilidad.

↗

gw submitgw submit

Mark a slot as ready for review. Runs sync first — if there are conflicts, submit is blocked. Transitions the slot from active to submitted. Marca un slot como listo para review. Ejecuta sync primero — si hay conflictos, el submit se bloquea. Transiciona el slot de active a submitted.

⊟

Stacked slotsSlots apilados

Create a slot on top of another with gw slot create --on parent. Child slots inherit the parent's context. Sync checks conflicts against the parent too. Like stacked PRs, but for patches. Crea un slot encima de otro con gw slot create --on parent. Los slots hijos heredan el contexto del padre. Sync verifica conflictos contra el padre también. Como stacked PRs, pero para patches.

↩

Undo mergeUndo merge

Made a bad merge? gw undo-merge restores both slots to their pre-merge state. One command, full rollback — no history rewriting needed because patches are immutable. Hiciste un merge malo? gw undo-merge restaura ambos slots a su estado pre-merge. Un comando, rollback completo — sin reescritura de historial porque los patches son inmutables.

⚠

Conflict resolutionResolución de conflictos

When patches collide, the desktop app shows exactly which hunks intersect — side by side, file by file. No guessing, no "ours vs theirs" — you see the precise lines that conflict. Cuando los patches colisionan, la app de escritorio muestra exactamente qué hunks se intersectan — lado a lado, archivo por archivo. Sin adivinar, sin "ours vs theirs" — ves las líneas exactas en conflicto.

⚡

File watchingFile watching

Native OS file watcher (fsnotify) detects changes instantly — no polling. The UI updates the moment you save a file. 500ms debounce, zero CPU waste. File watcher nativo del OS (fsnotify) detecta cambios al instante — sin polling. La UI se actualiza en el momento que guardas un archivo. Debounce de 500ms, cero desperdicio de CPU.

⇄

gw push & pullgw push y pull

Push patches directly to GitHub, GitLab, or Bitbucket — no intermediate step. gw remote add origin <url>, then gw push. Pull works the same way. Your CI/CD sees normal Git commits. Push patches directo a GitHub, GitLab o Bitbucket — sin paso intermedio. gw remote add origin <url>, luego gw push. Pull funciona igual. Tu CI/CD ve commits Git normales.

⚙

Named remotesRemotes nombrados

Manage remotes like Git: gw remote add / remove / list. Stored per-repo in .gw/remotes.json. Push and pull resolve by name — just gw push uses "origin" by default. Gestiona remotes como Git: gw remote add / remove / list. Almacenados por repo en .gw/remotes.json. Push y pull resuelven por nombre — gw push usa "origin" por defecto.

64

TestedTesteado

151 tests across every crate: 76 for the core engine, 22 for the Git bridge, 11 for the desktop command layer, 9 for the interactive hunk picker, 7 for the gRPC agent API, and 26 end-to-end CLI tests running the full workflow (init → record → slot → merge → undo → review → release → export). 151 tests en todos los crates: 76 del motor core, 22 del puente Git, 11 de la capa de comandos del escritorio, 9 del selector interactivo de hunks, 7 de la API gRPC para agentes, y 26 tests E2E del CLI ejecutando el flujo completo (init → record → slot → merge → undo → review → release → export).


Go deeperProfundizar

Read the theory behind
the patch model
Lee la teoría detrás
del modelo de patches

The full documentation explains why Git's snapshot model breaks down under concurrent, multi-agent editing, how the hunk-intersection algorithm works, and how WorkSlots replace every piece of GitFlow with something simpler and more correct. La documentación completa explica por qué el modelo de snapshots de Git se rompe bajo edición concurrente multi-agente, cómo funciona el algoritmo de intersección de hunks, y cómo los WorkSlots reemplazan cada pieza de GitFlow con algo más simple y más correcto.

1

The problem with GitEl problema de Git

Why snapshot-based VCS breaks down in the age of AI agents and parallel development.Por qué el VCS basado en snapshots se rompe en la era de agentes IA y desarrollo paralelo.

2

What it replacesQué reemplaza

Side-by-side mapping from every GitFlow concept to its GitWeave equivalent — feature branches, stash, cherry-pick, all of it.Mapeo 1 a 1 de cada concepto de GitFlow a su equivalente en GitWeave — feature branches, stash, cherry-pick, todo.

3

Core conceptsConceptos core

Patches, Hunks, DAG, WorkSlots, ConflictEngine — the five primitives that make everything work.Patches, Hunks, DAG, WorkSlots, ConflictEngine — las cinco primitivas que hacen que todo funcione.

⚡

Parallel AI agentsAgentes IA paralelos

How N autonomous agents work on the same codebase without conflict, lock, or human supervision via the gRPC daemon.Cómo N agentes autónomos trabajan en el mismo codebase sin conflicto, lock, ni supervisión humana vía el daemon gRPC.

⇄

The Git bridgeEl puente Git

How GitWeave exports to regular Git commits so your GitHub, GitLab, and CI/CD pipelines keep working.Cómo GitWeave exporta a commits Git regulares para que tu GitHub, GitLab y CI/CD sigan funcionando.

⌘

CLI referenceReferencia CLI

Every gw command, what it does, and how it maps to the desktop app.Cada comando gw, qué hace, y cómo se mapea a la app de escritorio.

Read the full documentation →Leer la documentación completa →

Start weaving todayEmpieza a tejer hoy

GitWeave is free and built for teams that move fast. One command installs the gw CLI on macOS and Linux, and Windows has a ready-to-run gw.exe; the native desktop app is coming soon. GitWeave es gratis y construido para equipos que se mueven rápido. Un comando instala el CLI gw en macOS y Linux, y Windows tiene un gw.exe listo para usar; la app de escritorio nativa llega pronto.

brew install rvielma/tap/gitweave

Free to use · Rust + Tauri · Built by rvielma for the community Gratis · Rust + Tauri · Desarrollado por rvielma para la comunidad