Manyana
A Coherent Vision for the Future of Version Control
I’m releasing Manyana, a project which I believe presents a coherent vision for the future of version control — and a compelling case for building it.
It’s based on the fundamentally sound approach of using CRDTs for version control, which is long overdue but hasn’t happened yet because of subtle UX issues. A CRDT merge always succeeds by definition, so there are no conflicts in the traditional sense — the key insight is that changes should be flagged as conflicting when they touch each other, giving you informative conflict presentation on top of a system which never actually fails. This project works that out.
Better conflict presentation
One immediate benefit is much more informative conflict markers. Two people branch from a file containing a function. One deletes the function. The other adds a line in the middle of it. A traditional VCS gives you this:
<<<<<<< left
=======
def calculate(x):
a = x * 2
logger.debug(f"a={a}")
b = a + 1
return b
>>>>>>> rightTwo opaque blobs. You have to mentally reconstruct what actually happened.
Manyana gives you this:
<<<<<<< begin deleted left
def calculate(x):
a = x * 2
======= begin added right
logger.debug(f"a={a}")
======= begin deleted left
b = a + 1
return b
>>>>>>> end conflictEach section tells you what happened and who did it. Left deleted the function. Right added a line in the middle. You can see the structure of the conflict instead of staring at two blobs trying to figure it out.
What CRDTs give you
CRDTs (Conflict-Free Replicated Data Types) give you eventual consistency: merges never fail, and the result is always the same no matter what order branches are merged in — including many branches mashed together by multiple people working independently. That one property turns out to have profound implications for every aspect of version control design.
Line ordering becomes permanent. When two branches insert code at the same point, the CRDT picks an ordering and it sticks. This prevents problems when conflicting sections are both kept but resolved in different orders on different branches.
Conflicts are informative, not blocking. The merge always produces a result. Conflicts are surfaced for review when concurrent edits happen “too near” each other, but they never block the merge itself. And because the algorithm tracks what each side did rather than just showing the two outcomes, the conflict presentation is genuinely useful.
History lives in the structure. The state is a weave — a single structure containing every line which has ever existed in the file, with metadata about when it was added and removed. This means merges don’t need to find a common ancestor or traverse the DAG. Two states go in, one state comes out, and it’s always correct.
Rebase without the nightmare
One idea I’m particularly excited about: rebase doesn’t have to destroy history. Conventional rebase creates a fictional history where your commits happened on top of the latest main. In a CRDT system, you can get the same effect — replaying commits one at a time onto a new base — while keeping the full history. The only addition needed is a “primary ancestor” annotation in the DAG.
This matters because aggressive rebasing quickly produces merge topologies with no single common ancestor, which is exactly where traditional 3-way merge falls apart. CRDTs don’t care — the history is in the weave, not reconstructed from the DAG.
What this is and isn’t
Manyana is a demo, not a full-blown version control system. It’s about 470 lines of Python which operate on individual files. Cherry-picking and local undo aren’t implemented yet, though the README lays out a vision for how those can be done well.
What it is is a proof that CRDT-based version control can handle the hard UX problems and come out with better answers than the tools we’re all using today — and a coherent design for building the real thing.
The code is public domain. The full design document is in the README.


First Bram, I love that you are working on this. Git has been in the wild for over a decade, and version control could use some fresh thinking. Especially, some challenging ideas.
I plan to try to digest this for a bit, it's not 100% clear how this will work all of the time. I'd like to seem more examples, to fully understand it. Merges never failing do not yet make sense to me. I can only see your solution as a merge being a super position of commits.
I love the idea of improving rebasing, and you seem to be on a good path. On my current personal project I've started to use feature branches, and then merge to an intermediate branch that mirrors main, so that merge conflict resolution occurs on the intermediate branch, and then i merge ff-only back to main. this preserves history, doesn't use a squash, and keeps main with clean stable only commits.
My 3 largest version control pain points are:
* angenic coding - wip commits tend to have more changed lines of code, by a few orders of magnitude. the commit message, and the commit size are not well summarized or understood. code agents can refactor like a beast given the right prompt for hours at a time. I once switched from react to svelte in a few prompts.
* left vs. right code ancestries always seem to confuse me. rather than ordinal, I'd prefer logical assignment. which branch is left, which branch is right? who(blame)'s branch is left, who's branch is right? what commit message is left & right?
* binaries - git works with lines of code only, and also only well with 'pretty' code. if your code has syntactic sugar, is compressed, or is a binary, then git breaks down quickly.
compiled javascript that is all on one line of code is almost pointless to store in git. one statement per line works best, but if you define multiple vars, or a longer anonymous object or anything with any degree of complexity, then git treats the whole line as a change. then you have to compare A & B between the two lines and physically notice what changed. Some IDEs will show you sub token changes between the two lines, most wont.
in the era of angenic coding, imagine a pull request where two complex lines look identical, but to the human it looks like only one variable name was added or removed -- but to the machine or hacker one of the characters in one of the other variables where changed to an international character to go undetected. in this case you could sneak in a change on one of the other variables and switch code behavior unexpectedly.
on the binary front it would be cool, if version control software could become 'token' aware in much the same way of how LLMs are now first tokenizing input and output. tokens could be full variable names, or part of variable name (camel case, snake case, etc..).
maybe the version control software supports tokenizer plugins, or maybe it supports file type plugins for binaries?
maybe the version control has plugins for different languages, pdfs, bitmaps, jpgs, videos?
I've also been thinking of what I love about Resilio Sync, and what feels missing from it. Version Control seems like something that I both miss, and conflicts with Resilio Sync, Dropbox, and other file sync solutions.
Nothing really works well at both file sync across teams and version control for most files. File Sync solutions seem to conflict with git, and git doesn't work well with binaries.
https://www.youtube.com/watch?v=YXyaGe4N9oA
https://github.com/hyoo-ru/benzen -- it's already done here