Skip to main content

Base Image

The base image is the foundation for all aibox container flavors. It provides a complete, opinionated development environment built on Debian Trixie Slim.

Installed Tools

ToolVersion / SourcePurpose
Zellij0.43.1 (prebuilt binary from GitHub releases)Terminal multiplexer
Yazi25.4.8 (prebuilt binary from GitHub releases)Terminal file manager
VimDebian package (vim + vim-runtime)Editor
GitDebian packageVersion control
lazygitDebian packageGit TUI
GitHub CLI (gh)Debian packageGitHub integration
Claude CLIOfficial install scriptAI assistant
ripgrep (rg)Debian packageFast recursive search (grep replacement)
fdDebian packageFast file finder (find replacement)
batDebian packageSyntax-highlighting cat replacement
ezaDebian packageModern ls replacement with git integration
zoxideDebian packageSmarter cd that learns your habits
fzfDebian packageFuzzy finder for files, history, and more
deltaDebian packageSyntax-highlighting diff viewer (used by git)
starshipPrebuilt binaryMinimal, fast shell prompt with context
curlDebian packageHTTP client
jqDebian packageJSON processor
lessDebian packagePager
unzipDebian packageArchive extraction
bash-completionDebian packageShell completions
soxDebian packageAudio processing
pulseaudio-utilsDebian packageAudio bridging
ca-certificatesDebian packageTLS root certificates
localesDebian packageLocale support (en_US.UTF-8)
tzdataDebian packageTimezone data

Build Architecture

The Dockerfile uses a multi-stage build:

  • Stage 1 (builder): Downloads the official Zellij prebuilt binary from GitHub releases. Architecture detection uses uname -m, which returns aarch64 or x86_64 directly -- matching the Zellij release filename convention. This works reliably across Docker, Podman, and Buildah.

  • Stage 2 (runtime): Pure Debian Trixie Slim with apt packages. Only the Zellij binary is copied from the builder stage.

Why prebuilt instead of compiled

Compiling Zellij from source requires 8+ GB RAM during the final linker step. On Apple Silicon under Podman/Docker Desktop, the default VM memory cap causes OOM kills. The official musl-static binary is equally portable and downloads in seconds.

Zellij Configuration

Key Bindings

All bindings use Ctrl+b as a leader key — press Ctrl+b, release, then press the action key. This avoids conflicts with macOS Option key (which produces special characters like @, , |) and with Vim/bash Ctrl bindings.

KeyAction
Ctrl+b then h/j/k/lNavigate panes (vim-style)
Ctrl+b then nNew pane
Ctrl+b then dSplit down
Ctrl+b then rSplit right
Ctrl+b then xClose focused pane
Ctrl+b then fToggle fullscreen
Ctrl+b then zToggle pane frames
Ctrl+b then eToggle embed/floating
Ctrl+b then = / -Resize pane (increase / decrease)
Ctrl+b then tNew tab
Ctrl+b then wClose tab
Ctrl+b then [ / ]Previous / next tab
Ctrl+b then 1-5Jump to tab N
Ctrl+b then i / oMove tab left / right
Ctrl+b then sOpen Strider file picker (floating)
Ctrl+b then mSession manager
Ctrl+b then uEnter scroll mode
Ctrl+b then /Search scrollback
Ctrl+qQuit Zellij

Press Escape or Ctrl+b again to cancel the leader and return to normal mode.

Layouts

aibox ships three IDE layouts. Select one with aibox start --layout <name> (the default is dev). All layouts include shared tabs for git (lazygit) and shell (extra bash).

dev (default) -- file browser + editor

Yazi file manager on the left, Vim on the right. Claude Code, git, and shell in separate tabs.

focus -- one tool per tab, fullscreen

Each tool gets the entire screen in its own tab. Switch with Ctrl+b [/] or Ctrl+b 1-5.

Tabs: files (yazi) | editor (vim) | claude | git (lazygit) | shell

cowork -- side-by-side coding with AI

Yazi and Vim stacked on the left, Claude Code on the right. Git and shell in separate tabs.

Opening Files from Yazi

  • Enter -- opens file in vim in-place (suspends Yazi, :q returns to Yazi). Works in all layouts.
  • e -- opens file in the adjacent vim pane and focuses it. Works in dev (vim is right), cowork (vim is below), and focus (switches to editor tab).
Strider vs Yazi

Ctrl+b then s opens the built-in Strider file picker as a floating overlay (Zellij plugin). The sidebar file manager in all layouts is Yazi, an external terminal file manager with richer features (preview, bulk operations, async I/O).

Theme

Gruvbox dark, defined in themes/gruvbox.kdl.

Vim Configuration

Notable settings baked into the image:

  • Leader key: Space
  • Line numbers: Relative + absolute (hybrid)
  • Indentation: 4 spaces default, 2 spaces for YAML, JSON, KDL, HTML, CSS, JavaScript
  • Undo: Persistent undo files stored in /home/aibox/.vim/undo
  • No swap files -- clean container environment
  • Color column at 88 (Black/PEP8 default)
  • Grep program: ripgrep if available (rg --vimgrep --smart-case)
  • Netrw: Tree mode, no banner, 25% width
  • Colorscheme: desert (ships with vim-runtime, no plugins needed)

Git Configuration

Git config lives at /home/aibox/.config/git/config (XDG path, not ~/.gitconfig). The environment variable GIT_CONFIG_GLOBAL is set in the generated docker-compose.yml to point to this location.

Using a directory mount (rather than a single-file mount) allows a credentials file to coexist alongside config.

AI Coding Agents

AI coding agents (Claude, Aider, Gemini, Mistral) are not pre-installed in the base image. They are installed per-project via the addons system when you set [ai] providers = ["claude"] in aibox.toml.

Audio Support

The base image includes sox and pulseaudio-utils for audio bridging, enabling Claude Code's voice features inside the container. See Audio Support for setup details.

Configuration Persistence

All user configuration is persisted on the host under .aibox-home/ and bind-mounted into the container:

Host PathContainer PathContents
.aibox-home/.ssh//home/aibox/.ssh (read-only)SSH keys
.aibox-home/.vim//home/aibox/.vimVim config, undo history, plugins
.aibox-home/.config/git//home/aibox/.config/gitGit config and credentials
.aibox-home/.config/zellij//home/aibox/.config/zellijZellij config, themes, layouts, plugin cache
.aibox-home/.config/yazi//home/aibox/.config/yaziYazi file manager config and keymap

The Dockerfile bakes identical defaults into the image as a fallback. If no mounts are present, the container still works out of the box.

On first aibox init or aibox start, the .aibox-home/ directory is auto-seeded from built-in templates. Existing files are never overwritten.

File Preview

The base image ships with a complete set of preview tools covering raster images, vector graphics (SVG, EPS), PDF, and video — both inside Yazi and as standalone command-line viewers. PDF and SVG also support watch-mode preview that updates automatically as files change.

See the dedicated File Preview page for full documentation, including format coverage, standalone tools (chafa, timg), and the PDF/SVG watch-mode patterns.

Container Entrypoint

CMD ["sleep", "infinity"]

The container stays alive and idle. Both VS Code and aibox start exec into it. Zellij is never the container entrypoint -- it is launched on attach.