Advanced Installation
The QuickStart gets one project running. This page is the reference behind it: what vaibify needs from your computer, how to install it for research or for development, how to set up Docker, and every field of the project configuration file. The command line has its own page, the CLI Reference.
Prerequisites
Requirement |
Version |
Needed for |
|---|---|---|
macOS or Linux |
any current release |
everything |
Python |
3.9 – 3.14, built with |
everything |
Git |
any current release |
cloning repositories, the PROOF Ladder |
Docker Engine or Colima on macOS, with Buildx recommended |
current release |
container projects only |
A host project runs on your own machine with no container, so Docker is not needed to start; the QuickStart begins that way. Install Docker when you want the isolation that Level 3 of the PROOF Ladder requires.
A host project reads your files through directory-relative file
access, so it needs a Python whose os.supports_dir_fd is not empty:
python -c "import os; print(bool(os.supports_dir_fd))" should print
True. Some builds, such as the python.org macOS 3.9 installer, are made
without it. On one of those, a host project’s file reads and downloads
stop with a message saying so; run vaibify with a conda, Homebrew or
Linux Python instead.
Installing with pip
For researchers
pip install vaibify
vaibify --version
This installs two equivalent commands, vaibify and the shorthand
vaib, together with the Docker SDK, keyring integration, and the
common data-format readers (h5py, openpyxl, Pillow, pyarrow, astropy,
scipy). Running vaibify opens the hub in your browser. Checking this
machine before any project exists is done from the command line; see
CLI Reference.
Install into a Python built for your computer’s processor. On an Apple Silicon Mac, an Intel-only Python (an older Anaconda, for example) runs through Rosetta, and everything installed into it stops working when an operating-system upgrade removes that translation layer. The two commands below must name the same architecture:
file "$(command -v python3)"
uname -m
The command-line diagnosis in the CLI Reference warns when the Python running it is being translated.
Several projects can live on one machine. Each container project gets its own image, container, and workspace volume. The Create New wizard (the + on the environments page) registers a project, and the hub then lists it whichever directory you start it from.
For developers
git clone https://github.com/RoryBarnes/Vaibify.git
cd Vaibify
pip install -e ".[dev]"
The test suite lives in the repository, not in the pip package. How to run it, including the browser tests, is in Developers.
Optional extras
Extra |
Adds |
|---|---|
|
Specialist data readers: pyvista, pysam, pyreadstat, pyreadr, safetensors, tfrecord, scapy. Several need system libraries that pip cannot provide |
|
detect-secrets, used to redact credentials from the Prompt Record |
|
Everything needed to run vaibify’s own test suite |
|
Playwright, for the browser test lane |
pip install 'vaibify[formats]'
The data formats vaibify’s tests can read are listed in Testing Model.
Docker
Vaibify can set Docker up for you: run vaibify setup-docker, or
press Set up Docker on the dashboard’s Docker banner, which appears
when Docker does not answer and also when its Colima machine is too
small to build in. Both read your machine, show each step before it
runs, and stop at anything only you can do. A step that needs an administrator
uses your computer’s own password prompt; vaibify never sees the
password. The CLI Reference lists what
each platform gets. The sections below are the same steps by hand.
Whichever way you install it, confirm the result before building anything:
docker info # must succeed WITHOUT sudo
docker buildx version # recommended; see below
docker info catches most problems, and it must work as your own
user: vaibify talks to the daemon as the user who runs it, never
through sudo. Vaibify follows your active Docker context; a
DOCKER_HOST you export yourself always takes precedence.
Docker on Linux
Install Docker Engine from Docker’s own repository, following the
current instructions for your distribution
(Ubuntu,
Debian,
Fedora,
RHEL). Distribution
packages are often too old. Install the docker-buildx-plugin package
with the engine.
Vaibify builds with buildx (BuildKit) whenever it is installed. Without it, a build falls back to Docker’s legacy builder, which Docker has deprecated and prints a warning about. The legacy builder handles every ordinary vaibify image. It cannot build a Dockerfile that needs BuildKit: today, the Claude Code overlay that vaibify adds to an author’s Intel image on an ARM Mac. Vaibify refuses that build before it starts, and before the author’s image is downloaded, with the command that installs buildx on your machine.
Then let your user reach the daemon and start it with the machine:
sudo usermod -aG docker "$USER"
newgrp docker # or log out and back in
sudo systemctl enable --now docker
Membership in the docker group is equivalent to root on the host,
because a container can mount the host filesystem. On a shared or
sensitive machine, prefer
rootless mode.
On Linux a container reaches the vaibify hub through the Docker bridge
gateway (172.17.0.1 unless the daemon is configured otherwise), not
through loopback, so the hub also listens on that address. It asks the
daemon for the address when it starts and prints what it bound. If the
daemon was not running at that moment, the hub listens on loopback
only: the dashboard works, but vaibify-do inside the container cannot
reach the hub. Start the daemon, then restart vaibify.
Docker on macOS
Colima is the recommended Docker runtime on macOS. Install it with Homebrew or MacPorts, then start it with enough CPU and memory for your work:
# Homebrew
brew install colima docker docker-buildx
# MacPorts
sudo port install colima docker docker-buildx-plugin
colima start --cpu 4 --memory 8
Installing Colima takes a minute or two. The first colima start
then downloads and boots the small Linux virtual machine that runs
Docker; later starts reuse it. Give that machine the CPU and memory
you mean to use: a bare colima start creates one with 2 CPUs and
2 GB of memory, below the 4 GB a vaibify build needs. On Apple
Silicon keep Colima’s default aarch64 architecture, on which vaibify
builds natively; a machine created with --arch x86_64 emulates every
build step and runs several times slower.
The command-line diagnosis in the CLI Reference compares
what a project will request against what the Colima virtual machine
has. If macOS sleeps during a long build, the Colima virtual machine
can corrupt it; prefix long commands with caffeinate -s:
caffeinate -s vaibify
The neverSleep field in vaibify.yml does the same for as long as a
container runs, and the hold is re-asserted when a running container is
claimed again after vaibify restarts.
The first container build
Docker does not yet hold an image for a new container project, so the
first time you open one, vaibify builds it. Starting from Ubuntu, the
build downloads and installs a compiler toolchain, Python, TeX Live
(the latex feature, on by default), the project’s packages and each
agent you enabled. This takes from several minutes to over an hour,
depending mostly on your network and on whether LaTeX is enabled;
the build window shows the live output. The container’s first start
then clones the project’s repositories; later opens reuse the image.
On macOS the image is built and run inside Colima’s virtual machine,
not as a second machine: the machine is created once, by the first
colima start, and every project’s image lives inside it.
Python is vaibify’s default analysis language, so every image also
carries numpy, scipy, matplotlib and pytest: the tests vaibify
generates use them. List any other Python packages under
pythonPackages.
Shell helpers
The first vaibify command after an install or upgrade also sets up
shell completion and a few helper aliases. They are described in the
CLI Reference.
vaibify: command not found after an upgrade
The vaibify command is a short launcher whose first line names the
Python that installed it. When that Python stops working, the launcher
fails with it, and your shell usually reports only
command not found. The two common causes are a Python built for a
different processor whose translation layer an operating-system upgrade
removed (on Apple Silicon the tell is Bad CPU type in executable),
and a Python that a package manager replaced or removed.
find "$HOME" /opt /usr/local -maxdepth 4 -name vaibify -type f 2>/dev/null
head -1 <that path>
Run the interpreter named on that line. If it fails, install a Python that runs natively on this machine (see For researchers) and reinstall vaibify into it.
Browser compatibility
The dashboard runs locally and opens in your default browser. Vaibify supports current desktop releases of Firefox, Chrome, Edge, and Safari; mobile browsers are not supported. The bundled terminal (xterm.js 5.5) and PDF viewer (pdf.js 3.11) set the minimum versions:
Browser |
Dashboard and terminal |
PDF figures |
|---|---|---|
Firefox |
74 |
94 |
Chrome / Edge |
87 |
98 |
Safari |
14.1 |
15.4 |
Below the first floor the terminal does not load; between the two, the dashboard works but PDF figures do not render. Continuous integration runs the browser tests in Chromium, Firefox, and WebKit.
Installing for remote access
Remote access drives a hub on another machine over SSH (see Connecting to External Resources); it is started from the command line (CLI Reference). For it to work, vaibify must be on the non-interactive PATH of the user you connect as, and this must print a version:
ssh other-machine vaibify --version
A non-interactive SSH command does not read the shell files you
normally edit, so a pip install --user, a virtual environment, or a
conda environment activated by your profile is not found, and the
connection reports that the remote produced no startup record.
Install somewhere already on the default PATH, link the entry point
into /usr/local/bin, or extend PATH before the non-interactive early
exit in that user’s shell configuration. Install the same vaibify
version on both machines; a protocol mismatch is refused.
Uninstalling vaibify
Removing the Python package leaves your environments, their Docker images, and vaibify’s settings in place, so do these in order:
Delete the environments you no longer want. In the hub, open each tile’s ⋮ menu and choose Delete environment…. This removes the container, its workspace volume, and its images; your project directory and anything already pushed or published are untouched. See Environments and Projects.
Revoke stored credentials you no longer need, on each service’s own account page; see Connecting to External Resources.
Stop the hub. Press Ctrl-C in the terminal where you started
vaibify. Closing the browser tab does not stop it.Remove the package:
python3 -m pip uninstall vaibify.Remove vaibify’s settings and logs: delete
~/.vaibify.Remove the shell helpers. Delete each block that begins with the comment
# Added by Vaibifyfrom your shell’s configuration file (~/.zshrc,~/.bash_profileor~/.bashrc, or~/.config/fish/config.fish).
Docker and Colima are not part of vaibify and stay installed.
Configuration reference
Where vaibify keeps its files
File |
Holds |
|---|---|
|
The project’s container configuration, documented below |
|
The workflow: steps, commands, tests. See Environments and Projects |
|
The registered projects the hub lists |
|
Host-wide dashboard settings, such as the timeouts below |
|
The port the last hub used |
|
A rotating log (10 MB per file, five backups); each line is tagged |
vaibify.yml fields
Keys are camelCase. Every field except projectName has a default.
Key |
Type |
Default |
Meaning |
|---|---|---|---|
|
string |
required |
Project, container, image, and volume name. A container project’s name must be lowercase letters, digits, |
|
string |
|
Unprivileged user inside the container. |
|
string |
|
Major.minor only ( |
|
string |
|
Left out or set to |
|
string |
|
Absolute path where the workspace volume mounts |
|
string |
|
|
|
string |
|
Extra |
|
string |
|
|
|
list |
|
In allowlist mode, extra |
|
boolean |
|
The old spelling of |
|
boolean |
|
Let graphical programs in the container open windows on your display. The container gets its own untrusted X authorization, revoked when it stops; on a server without the SECURITY extension (XQuartz, MacPorts X11) it holds a copy of the server’s cookie instead, which is full display access (see Security Model). Refused with |
|
boolean |
|
Keep the Mac awake ( |
|
integer |
|
Port for the single-project viewer started from the command line (CLI Reference). |
|
integer |
|
CPU cores for the container. |
|
number |
|
Memory cap in GB (1 GB = 2^30 bytes). |
|
integer |
|
Most processes the container may hold at once ( |
List fields:
Key |
Each entry |
Meaning |
|---|---|---|
|
|
Repositories cloned into the workspace, in order. See container.conf for install methods |
|
string |
APT packages. A list you supply replaces the defaults ( |
|
string |
pip packages, installed beside the analysis stack every image carries ( |
|
string |
Refused. A non-empty list fails validation because the build has no conda install step; use |
|
|
Executables already in the container; each |
|
|
Ports forwarded from the container, bound to |
|
|
Host directories mounted into the container, read-only unless the entry sets |
|
|
Credentials resolved on the host at start and mounted read-only at |
A bindMounts host path must be absolute (Docker does not expand ~),
must exist, and must lie under your home directory or the project
repository. Every mount is read-only inside the container unless its
entry sets readWrite: true; an entry carrying the retired readOnly
key, or any key other than host, container and readWrite, is
refused. Vaibify refuses any mount that overlaps a credential or
configuration directory (~/.ssh, ~/.aws, ~/.gnupg, ~/.docker,
~/.kube, all of ~/.config, the agent homes ~/.claude, ~/.codex
and ~/.gemini), ~/.gitconfig, ~/.netrc, ~/.pypirc, ~/.npmrc,
a shell start-up file, ~/Library/LaunchAgents, ~/Library/Keychains,
/etc, /root, a Docker daemon socket, or anything under ~/.vaibify,
however the path is spelled. A readWrite mount may not be, or
contain, the directory holding the project’s vaibify.yml. A mount’s
mode is fixed when the container is created: after changing
readWrite, the dashboard and vaibify doctor report the running
container’s mode until it is created again.
Features
Nested under features. All values are booleans.
Key |
Default |
Installs |
|---|---|---|
|
|
TeX Live |
|
|
JupyterLab |
|
|
R and IRkernel |
|
|
Julia |
|
|
PostgreSQL and SQLite clients, psycopg2, SQLAlchemy |
|
|
DVC, for versioning data |
|
|
MultiNest, pymultinest, ultranest (adds a Fortran toolchain and a source build) |
|
|
One terminal coding agent each: Claude Code, Codex, Gemini CLI, Antigravity, OpenCode, Cline, OpenHands, Pi |
|
|
Keep that agent current. Needs network access; with |
|
|
NVIDIA GPU support. Builds with |
Every enabled agent receives the same vaibify context, skills,
persistent configuration directory, and vaibify-do bridge to the
dashboard.
Reproducibility
Nested under reproducibility; how these are used is described in
Reproducibility.
Key |
Default |
Meaning |
|---|---|---|
|
|
|
|
|
LaTeX source directory |
|
|
Generated figure directory |
|
|
Overleaf project identifier |
|
|
Figure directory in Overleaf |
|
|
Paths to pull from Overleaf |
Example
projectName: my-analysis
pythonVersion: "3.12"
pythonPackages:
- numpy
- matplotlib
repositories:
- name: analysis-code
url: https://github.com/example/analysis-code.git
branch: main
installMethod: pip_editable
features:
jupyter: true
claude: true
cpuLimit: 4
container.conf
The build turns repositories into a pipe-delimited container.conf
in the image’s build context and bakes it into the image at
/etc/vaibify/container.conf. Project templates carry one too, which
the wizards read to fill in repositories. Each non-comment line is:
name|url|branch|install_method[|destination]
Install method |
Action |
|---|---|
|
|
|
|
|
|
|
Add to |
|
Clone only; do not install |
destination moves the clone to that workspace-relative path. A URL
must use https://, http://, git://, ssh://, or the
user@host:path form.
Checks before a build
The dashboard’s Build asks these questions before spending an hour on a build:
Field |
Checked against |
Refused when |
|---|---|---|
|
their required format |
the image recipe cannot use the value |
|
the pinned Ubuntu 24.04 toolchain |
the name says another Ubuntu release, or the GPU feature is on |
|
Launchpad, for the release |
Ubuntu publishes no such package |
|
pypi.org’s simple index |
the index has no such project |
|
|
the remote has no such branch |
An index or remote that cannot be reached, a pipInstallFlags that
names another index, and a baseImage vaibify cannot identify are
reported as “not checked”, and the build proceeds.
Environment variables
These change host-wide behavior. Timeout values are seconds, or
never (also off, none, disabled); a malformed value is ignored.
Variable |
Default |
Effect |
|---|---|---|
|
never (browser launch); 1800 ( |
How long a hub with no connected dashboard and no running pipeline waits before shutting itself down. |
|
604800 (7 days) |
How long one browser tab’s session lasts from when it opened, used or not. When it ends, the container and any running step keep going; a fresh tab is opened from the command line (CLI Reference). Overrides the Session lifetime setting |
|
3600 |
Ends a browser session after this long with no activity. A connected tab counts as activity |
|
15 |
How long a local session is held for a reconnecting tab |
|
900 |
The same, for a session on another machine opened over SSH |
|
unset |
Any value has the same effect as the |
Each variable outranks the stored setting, which outranks the default. The two settings apply without restarting the hub. You are warned at three quarters, nine tenths, and nineteen twentieths of the session lifetime, and each warning offers to renew the session.