Skip to content

Configuration Reference

SkyBox uses a YAML configuration file to store global settings, remote server connections, sync preferences, and project-specific configurations.

Config File Location

The configuration file is located at:

~/.skybox/config.yaml

You can override the SkyBox home directory by setting the SKYBOX_HOME environment variable:

bash
export SKYBOX_HOME=/custom/path/.skybox

When set, the config file will be located at $SKYBOX_HOME/config.yaml.

Directory Structure

SkyBox creates the following directory structure:

~/.skybox/
├── config.yaml          # Main configuration file
├── .update-check.json   # Update check cache (24h TTL)
├── audit.log            # Audit log (when SKYBOX_AUDIT=1)
├── Projects/            # Local synced project copies
│   ├── my-app/
│   └── backend/
├── bin/
│   ├── mutagen                # Auto-downloaded sync binary
│   └── mutagen-agents.tar.gz  # Mutagen agents archive
├── templates/           # Custom local devcontainer templates
└── logs/                # Log files (auto-up, etc.)

Configuration Schema

The configuration file has four main sections:

remotes

A map of named remote server configurations. Each remote represents a server where projects can be stored and synced.

FieldTypeRequiredDescription
hoststringYesSSH hostname or IP address
userstringNoSSH username (null to use SSH config default)
pathstringYesBase directory for projects on the remote
keystringNoPath to SSH private key (null to use SSH config default)
useKeychainbooleanNomacOS only: persist SSH key passphrase in Keychain (default: false)

The useKeychain field is optional and defaults to false. When set to true on macOS, SkyBox uses the Keychain to store the passphrase for the SSH key, so you don't need to re-enter it after reboots. This setting is ignored on Linux and has no effect on passwordless keys.

Example:

yaml
remotes:
  production:
    host: prod.example.com
    user: deploy
    path: ~/code
    key: ~/.ssh/id_ed25519
    useKeychain: true   # macOS only: persist passphrase in Keychain

  personal:
    host: home-server
    user: null          # Uses SSH config
    path: ~/projects
    key: null           # Uses SSH config

editor

OptionTypeDefaultDescription
editorstring-Command to launch your preferred editor

Supported editors:

EditorCommand
Cursorcursor
VS Codecode
VS Code Insiderscode-insiders
Zedzed
Othercustom command

Vim (vim), Neovim (nvim), and any custom editor command are also supported.

defaults

Default settings for file synchronization.

OptionTypeDefaultDescription
sync_modestring"two-way-resolved"Mutagen sync mode for file synchronization
ignorestring[]See belowDefault patterns to ignore during sync
encryptionbooleanfalseEnable encryption by default for new projects
auto_upbooleanfalseAuto-start containers when entering project directories (see Shell Integration)

Default Ignore Patterns

The following patterns are ignored by default:

yaml
ignore:
  - ".git/index.lock"
  - ".git/*.lock"
  - ".git/hooks/*"
  - "node_modules"
  - "venv"
  - ".venv"
  - "__pycache__"
  - "*.pyc"
  - ".skybox-local"
  - "dist"
  - "build"
  - ".next"
  - "target"
  - "vendor"

Sync Modes

The sync_mode option accepts Mutagen sync mode values:

ModeDescription
two-way-resolvedBidirectional sync with automatic conflict resolution (recommended)
two-way-safeBidirectional sync that flags conflicts for manual resolution
one-way-replicaOne-way sync that mirrors alpha exactly on beta

projects

A map of project names to project-specific configurations. Each project references a remote by name.

OptionTypeRequiredDescription
remotestringYesName of the remote this project belongs to
ignorestring[]NoAdditional ignore patterns for this project
editorstringNoOverride editor for this project
sync_pathsstring[]NoSelective sync: only sync these subdirectories instead of the entire project
encryptionobjectNoPer-project encryption config (see below)
hooksobjectNoLifecycle hooks: shell commands to run before/after up and down (see Hooks)
auto_upbooleanNoAuto-start container when entering this project's directory (see Shell Integration)

Example:

yaml
projects:
  my-web-app:
    remote: production
    ignore:
      - ".cache"
      - "coverage"
    editor: code

  backend-api:
    remote: production
    ignore:
      - "*.log"
      - "tmp"

  side-project:
    remote: personal
    editor: nvim

  large-monorepo:
    remote: production
    sync_paths:
      - src
      - build

Per-Project Encryption

Projects can have encryption at rest enabled. When enabled, project files are encrypted on the remote when not in active use.

yaml
projects:
  my-app:
    remote: production
    encryption:
      enabled: true
      salt: "a1b2c3d4e5f6..."
      kdf: "scrypt"
      kdfParamsVersion: 1
FieldTypeDescription
enabledbooleanWhether encryption at rest is active
saltstringAuto-generated hex salt for key derivation. Do not edit.
kdf"scrypt"Key-derivation function used for passphrase-to-key derivation.
kdfParamsVersion1Parameter profile version for the configured KDF.

Use skybox encrypt enable/disable to manage these settings. See skybox encrypt.

templates (Optional)

Custom project templates as git repository URLs. These templates appear in skybox new when selecting "From a template".

yaml
templates:
  company-starter: https://github.com/myorg/starter-template.git
  react-app: https://github.com/myorg/react-template.git

TIP

You can also create local templates stored as .json files in ~/.skybox/templates/. See Custom Templates for details.

Complete Example

Here is a complete example configuration file:

yaml
# Default editor command
editor: cursor

# Default sync settings
defaults:
  sync_mode: two-way-resolved
  # Default ignore patterns (see above for details)
  ignore:
    - ".git/index.lock"
    - ".git/*.lock"
    - ".git/hooks/*"
    - "node_modules"
    - "venv"
    - ".venv"
    - "__pycache__"
    - "*.pyc"
    - ".skybox-local"
    - "dist"
    - "build"
    - ".next"
    - "target"
    - "vendor"

# Remote server configurations
remotes:
  production:
    host: prod.example.com
    user: deploy
    path: ~/code
    key: ~/.ssh/id_ed25519
    useKeychain: true     # macOS only: persist passphrase in Keychain

  staging:
    host: staging.example.com
    user: deploy
    path: ~/code
    key: ~/.ssh/id_ed25519

  personal:
    host: home-server
    user: null
    path: ~/projects
    key: null

# Project-specific configurations
projects:
  my-web-app:
    remote: production
    ignore:
      - ".cache"
      - "coverage"
    editor: code

  backend-api:
    remote: production
    ignore:
      - "*.log"
      - "tmp"

  data-pipeline:
    remote: staging
    editor: nvim
    ignore:
      - "data/*.csv"
      - "output"

  side-project:
    remote: personal

  large-monorepo:
    remote: production
    sync_paths:
      - src
      - build

# Custom project templates
templates:
  company-starter: https://github.com/myorg/starter.git
  react-app: https://github.com/myorg/react-template.git

Environment Variables

Runtime Configuration

VariableDefaultDescription
SKYBOX_HOME~/.skyboxOverride the default SkyBox home directory
SKYBOX_AUDIT0Set to 1 to enable audit logging to ~/.skybox/audit.log
SKYBOX_HOOK_WARNINGS1Set to 0 to suppress one-time hook security warnings
HOME-Used for ~ expansion in paths (e.g., remote path and key fields)
DEBUGunsetSet to any value to enable debug output in list command
EDITOR-Fallback editor command if not configured in SkyBox config

Build-Time Metadata (not user-configurable — set during compilation)

VariableDefaultDescription
SKYBOX_INSTALL_METHODunsetInstall source metadata (homebrew or github-release for direct download)

Audit Logging

When SKYBOX_AUDIT=1, security-relevant operations are logged to ~/.skybox/audit.log in JSON Lines format:

json
{"timestamp":"2026-02-04T12:00:00Z","action":"clone:success","user":"john","machine":"macbook","details":{"project":"myapp"}}

Logged actions include: clone:start, clone:success, clone:fail, push:start, push:success, push:fail, rm:local, rm:remote, up:start, up:success, down, lock:force, config:change.

Log Sanitization

Audit log entries are automatically sanitized before being written:

  • Home directory paths are replaced with ~ (e.g., /Users/john/code becomes ~/code)
  • Credentials matching password=... or token=... patterns are redacted

Log Rotation

The audit log is automatically rotated when it exceeds 10 MB. When rotation occurs, the current log is renamed to audit.log.YYYY-MM-DD and a new log file is started.

Manual Rotation

You can also rotate the log manually at any time:

bash
mv ~/.skybox/audit.log ~/.skybox/audit.log.$(date +%Y%m%d)

Creating Configuration

The configuration file is automatically created when you run:

bash
skybox init

This interactive command will:

  1. Check for required dependencies (Docker, Node.js)
  2. Download and install Mutagen for file synchronization
  3. Configure your first remote SSH server
  4. Set your preferred editor
  5. Create the configuration file

Modifying Configuration

Using SkyBox Commands

bash
# View current configuration
skybox config

# Change editor
skybox config set editor vim

# Add a new remote
skybox remote add myserver user@host:~/code

# Remove a remote
skybox remote remove myserver

# Validate all remote connections
skybox config --validate

Direct File Editing

You can edit the configuration file directly:

bash
# Open with your default editor
$EDITOR ~/.skybox/config.yaml

# Or use any text editor
nano ~/.skybox/config.yaml
vim ~/.skybox/config.yaml

Changes take effect immediately for new commands. Running containers or sync sessions may need to be restarted to pick up configuration changes.

Per-Project Overrides

Projects can override global settings:

yaml
projects:
  my-project:
    remote: production

    # Use a different editor for this project
    editor: nvim

    # Additional ignore patterns (merged with defaults)
    ignore:
      - "local-only/"
      - "*.local"

    # Selective sync: only sync specific subdirectories
    sync_paths:
      - src
      - config

Validation

SkyBox validates the configuration file on load. Common issues include:

  • Missing remotes section: At least one remote must be configured
  • Invalid project remote reference: Project references a non-existent remote
  • Invalid YAML syntax: Check for proper indentation and formatting
  • Invalid sync mode: Use one of the supported Mutagen sync modes

If the configuration is invalid, SkyBox commands will fail with an error message indicating the issue.

Migration from Old Format

If you have an older configuration with a single remote section (instead of remotes), SkyBox will automatically migrate it on first use:

Old format:

yaml
remote:
  host: my-server
  base_path: ~/code

New format (auto-migrated):

yaml
remotes:
  my-server:           # Name derived from host
    host: my-server
    user: null
    path: ~/code
    key: null

projects:
  existing-project:
    remote: my-server  # Updated to reference new remote name

The migration happens automatically and preserves all your existing projects.

See Also

Released under the Apache License 2.0.