# Multiverse - A decentralized version control system

**URL:** <https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992>\
**Category:** News\
**Tags:** go-ipfs, libp2p\
**Created:** [January 25, 2021, 10:47pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992 "2021-01-25T22:47:39Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![nasdf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/nasdf/32/4507_2.png) [@nasdf](https://discuss.ipfs.tech/u/nasdf)\
**Post date:** [January 25, 2021, 10:47pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/1 "2021-01-25T22:47:39Z")

</div>

Multiverse is a version control system built using libp2p and IPFS. The goal of the project is to create a Github like platform that is decentralized and uses peer-to-peer networking. The project consists of a command line interface for version control tasks and an integrated web server for offline code viewing. I am looking for feedback on what features you think could be added to improve the project.

[multiverse-vcs/go-multiverse: Decentralized Version Control System (github.com)](https://github.com/multiverse-vcs/go-multiverse)

---

<div class="post-metadata">

**Author:** ![wolneykien](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/wolneykien/32/5509_2.png) [@wolneykien](https://discuss.ipfs.tech/u/wolneykien)\
**Post date:** [January 27, 2021, 12:16pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/2 "2021-01-27T12:16:09Z")

</div>

Sounds interesting. Can you explain, please, how other peers know that a new commit was made?

---

<div class="post-metadata">

**Author:** ![teknomunk](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/teknomunk/32/4220_2.png) [@teknomunk](https://discuss.ipfs.tech/u/teknomunk)\
**Post date:** [January 27, 2021, 2:56pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/3 "2021-01-27T14:56:16Z")

</div>

Doesn’t build for me. Here is the output:

```auto
$ make all
go build -o ./bin/multi ./cmd/multi
go: downloading ...snip...
...
web/web.go:5:2: package embed is not in GOROOT (/use/lib/go/src/embed)
make: *** [Makefile:9 multi] Error 1
$ go version
go version how.15.7 linux/amd64

```

Using archlinux.

---

<div class="post-metadata">

**Author:** ![nasdf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/nasdf/32/4507_2.png) [@nasdf](https://discuss.ipfs.tech/u/nasdf)\
**Post date:** [January 27, 2021, 4:32pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/4 "2021-01-27T16:32:28Z")

</div>

You’ll need the go1.16beta1 release for the embed package. I updated the project readme with instructions on how to get it. I also updated the Makefile so make sure to pull those changes before building. Let me know if you run into any other issues.

---

<div class="post-metadata">

**Author:** ![nasdf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/nasdf/32/4507_2.png) [@nasdf](https://discuss.ipfs.tech/u/nasdf)\
**Post date:** [January 27, 2021, 4:36pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/5 "2021-01-27T16:36:46Z")

</div>

> Sounds interesting. Can you explain, please, how other peers know that a new commit was made?

Currently you will have to use an outside channel such as email or a messaging app. I am working on a pubsub implementation that will allow you to share your peer ID with others and automatically sync pull requests and issues.

---

<div class="post-metadata">

**Author:** ![teknomunk](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/teknomunk/32/4220_2.png) [@teknomunk](https://discuss.ipfs.tech/u/teknomunk)\
**Post date:** [January 27, 2021, 6:55pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/6 "2021-01-27T18:55:39Z")

</div>

Built and installed without error this time, but I get a new error:

```auto
$ multi init
panic: open templates/index.html: no such file or directory

goroutine 1 [running]:
html/template.Must(...)
   /home/teknomunk/sdk/go1.16beta1/sec/html/template/template.go:438
github.com/multiverse-vcs/go-multiverse/web.init()
   /home/teknomunk/go-multiverse/web/blob.go:14 +0xac6

```

As to features, do you have an import function to pull in commit history from an existing git repo?

---

<div class="post-metadata">

**Author:** ![nasdf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/nasdf/32/4507_2.png) [@nasdf](https://discuss.ipfs.tech/u/nasdf)\
**Post date:** [January 27, 2021, 7:19pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/7 "2021-01-27T19:19:15Z")

</div>

> Built and installed without error this time, but I get a new error:

I forgot the embed the web template. I pushed a change to fix it. Thank you for your patience.

I also forgot to mention this above but I have a getting started guide here [https://www.multiverse-vcs.com/docs/](https://www.multiverse-vcs.com/docs/)

> As to features, do you have an import function to pull in commit history from an existing git repo?

I have an old importer that I was prototyping a while ago. I’ve been playing around with the idea of creating a service that imports your Git repo into IPFS using the Multiverse format. It would essentially allow for read only back ups and code browsing via IPFS / Filecoin. If people are interested in that idea I can publish the code.

---

<div class="post-metadata">

**Author:** ![teknomunk](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/teknomunk/32/4220_2.png) [@teknomunk](https://discuss.ipfs.tech/u/teknomunk)\
**Post date:** [January 27, 2021, 7:33pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/8 "2021-01-27T19:33:55Z")

</div>

I think something like `multi import git [url]` that does a git clone, then an import to the multiverse format would be better in the long run than an external service or script to perform the conversion.

---

<div class="post-metadata">

**Author:** ![teknomunk](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/teknomunk/32/4220_2.png) [@teknomunk](https://discuss.ipfs.tech/u/teknomunk)\
**Post date:** [January 27, 2021, 8:31pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/9 "2021-01-27T20:31:59Z")

</div>

Found two more issues:

If you try to run commands without the daemon running, you get this error message:

```auto
dial unix /home/telnomunk/.multiverse/rpc.sock: connect: connection refused

```

Having this instead be message that the daemon is not running and needs to be to function would be better.

If you try to run `multi status` in a directory containing symbolic link cycles, it fails. This will be the case for every crystal project that has at least one shared (non-stdlib dependency).

---

<div class="post-metadata">

**Author:** ![nasdf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/nasdf/32/4507_2.png) [@nasdf](https://discuss.ipfs.tech/u/nasdf)\
**Post date:** [January 27, 2021, 8:44pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/10 "2021-01-27T20:44:22Z")

</div>

I’ll add some tests to cover the symlink issue and update that error message later today.

I appreciate the feedback!

---

<div class="post-metadata">

**Author:** ![teknomunk](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/teknomunk/32/4220_2.png) [@teknomunk](https://discuss.ipfs.tech/u/teknomunk)\
**Post date:** [January 27, 2021, 8:53pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/11 "2021-01-27T20:53:29Z")

</div>

No problem.

Should I expect to be able to load the repo from an IPFS gateway using /ipns/$PEER\_ID?

---

<div class="post-metadata">

**Author:** ![nasdf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/nasdf/32/4507_2.png) [@nasdf](https://discuss.ipfs.tech/u/nasdf)\
**Post date:** [January 27, 2021, 9:11pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/12 "2021-01-27T21:11:56Z")

</div>

You can load it through a gateway but it will need to be the /ipfs/$CID path.

Here is an example link to a repo I’m currently hosting. Since the public gateways only support viewing files you need to link directory to a branch and file tree.

> **[Files on IPFS](https://ipfs.io/ipfs/bafyreic6rdwrmx7egsp57wpcpf4wetgaq2rl7fj4ajtqxyv46ezcbeyg7e/branches/default/tree)**
>
> /ipfs/bafyreic6rdwrmx7egsp57wpcpf4wetgaq2rl7fj4ajtqxyv46ezcbeyg7e/branches/default/tree

---

<div class="post-metadata">

**Author:** ![teknomunk](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/teknomunk/32/4220_2.png) [@teknomunk](https://discuss.ipfs.tech/u/teknomunk)\
**Post date:** [January 28, 2021, 1:16am UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/13 "2021-01-28T01:16:58Z")

</div>

I don’t see a way to remove a repo in the event that it was not initialized correctly and needs to be reinitialized.

Instead of further bug reports here, I’m going to start filing them at GitHub.

---

<div class="post-metadata">

**Author:** ![wolneykien](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/wolneykien/32/5509_2.png) [@wolneykien](https://discuss.ipfs.tech/u/wolneykien)\
**Post date:** [September 30, 2021, 2:04pm UTC](https://discuss.ipfs.tech/t/multiverse-a-decentralized-version-control-system/9992/14 "2021-09-30T14:04:50Z")

</div>

Hi! You may be interested in [A preliminary discussion of the “Workswap” protocol](https://discuss.ipfs.tech/t/a-preliminary-discussion-of-the-workswap-protocol/12320) . In the presented paper I’ve used an example of a decentralized version control system (the example 2) and I discuss what IPFS-friendly ecosystem can be used instead of an “outside channel” to message about changes. Thanks in advance for any comments and suggestions!
