multiversectl GitHub

Quick start

Describe a workspace, create a universe and open it — from nothing to two running copies of a project.

Before you start

You need a container runtime with docker compose, git, and a multiverse.yaml (a path or a git URL).

Your first universe

# record the workspace, clone its repos, run doctor
$ multiversectl bootstrap ./multiverse.yaml --root ~/acme
# universe 1: a worktree of every repo
$ multiversectl new 1
# start its containers
$ multiversectl up 1
# list universes and their state
$ multiversectl ls
# print the hostnames universe 1 answers on
$ multiversectl urls 1
# check the host, the workspace and universe 1
$ multiversectl doctor 1
# stop and delete universe 1 (asks first)
$ multiversectl rm 1

Seeing what you have

ls is one block per universe — branch, service, hostname and URL for every address it answers on:

$ multiversectl ls
universe 3  ·  acme-u3  ·  6 running  ·  192-168-1-20.traefik.me
─────────────────────────────────────────────────────────────────
APP    BRANCH  RUNNING  SERVICE  HOST    URL
admin  u3      1        app-dev  adm     http://adm-u3.192-168-1-20.traefik.me
api    u3      4        web      api     http://api-u3.192-168-1-20.traefik.me
                        web      devapi  http://devapi-u3.192-168-1-20.traefik.me:8001
                        mailpit  mail    http://mail-u3.192-168-1-20.traefik.me
web    u3      1        app-dev  app     http://app-u3.192-168-1-20.traefik.me
also checked out: mobile=u3

Run multiversectl --help for every command and flag. ls -o wide adds every service, whether it is up and the volumes it owns; -o list is one line per universe, for piping. They combine: -o list,wide.

A second universe

The point of the tool is the next command, not the first one. Create another universe and the first keeps running:

$ multiversectl new fix/login
$ multiversectl up fix/login
$ multiversectl ls

Both serve at once, on different hostnames, with their own containers, their own databases and their own checkouts. Nothing was stopped and no port was reassigned — Networking explains why they do not collide.