Installation

Quick Install
Section titled “Quick Install”Open Terminal and run:
curl -fsSL https://sanctum.run/install.sh | bashThe installer checks your hardware, installs dependencies, walks you through configuration, and sets up your Sanctum — all in about two minutes. No manual YAML editing required. Two minutes from “I wonder if this works” to “Oh God, it actually works.”
The installer will:
- Verify your Mac meets the requirements (Apple Silicon, macOS 15+, 16GB+ RAM)
- Install missing dependencies (Homebrew, Node.js, Python, Docker) with your permission
- Ask you a few questions about your haus and which features you want
- Create
~/.sanctum/instance.yamlwith your configuration - Start the Presidio privacy containers (PII scrubbing for external AI)
- Set up the shell library and LaunchAgents
After installation, visit the First Run guide to verify everything is working.
Manual Installation
Section titled “Manual Installation”If you prefer to set things up by hand — because you read man pages for fun, or because you have trust issues, or both — follow the steps below. Make sure you have completed all the Requirements first.
Create the Sanctum Home Directory
Section titled “Create the Sanctum Home Directory”-
Create the directory structure.
Sanctum stores all configuration, templates, and runtime data under
~/.sanctum. A hidden directory for a hidden infrastructure. Poetic.Terminal window mkdir -p ~/.sanctum/{templates/launchagents,tests,lib,scripts} -
Copy the example configuration.
The example file is an annotated template that documents every available option. It is the most lovingly commented YAML file you will ever read.
Terminal window cp ~/.sanctum/instance.yaml.example ~/.sanctum/instance.yaml -
Set your node identity.
Each node needs a single-line identity file that tells the system which node it is. This is the machine learning who it is, which — depending on your philosophical leanings — is either beautiful or terrifying.
Terminal window echo "your-haus-name" > ~/.sanctum/.node_idUse a short, lowercase slug. This value must match a key under the
nodessection of yourinstance.yaml.
Configure instance.yaml
Section titled “Configure instance.yaml”Open ~/.sanctum/instance.yaml in your editor. The file is organized into these top-level sections:
# Instance identityinstance: name: "Your Home Name" slug: "your-haus-name"
# Node topologynodes: your-haus-name: type: hub host: 192.168.1.10 # ...
# Services and their portsservices: gateway: enabled: true port: 1977 homeassistant: enabled: true port: 8123 # ...
# VM configurationvm: ip: 10.10.10.10 bridge_ip: 10.10.10.1 ssh_user: ubuntu # ...
# Secret managementsecrets: backend: keychain # "keychain" on Mac, "sops" on VM rotation_day: 1 # Day of month for auto-rotationKey Sections to Edit
Section titled “Key Sections to Edit”At minimum, configure the following for your environment:
| Section | What to Set |
|---|---|
instance.name | Human-readable name for your haus |
instance.slug | URL-safe lowercase slug |
nodes | At least one hub node with its LAN IP |
services | Enable or disable services based on what you need |
vm.ip | Your VM’s static IP (default: 10.10.10.10) |
Install the Shell Library
Section titled “Install the Shell Library”The shell library provides helper functions used by scripts and LaunchAgents. It is the connective tissue of the system — unglamorous, essential, and the first thing to check when something stops working.
-
Source the library in your shell profile.
Add this line to your
~/.zshrc(or~/.bashrc):Terminal window source ~/.sanctum/lib/config.sh -
Reload your shell.
Terminal window source ~/.zshrc -
Verify the library is loaded.
Terminal window sanctum_get instance.slugThis should print your instance slug. If it does, the config library is working. If it prints nothing, stare at the cursor for a moment, then check that
instance.yamlexists and is valid YAML.
The shell library provides these functions:
| Function | Purpose |
|---|---|
sanctum_get <key> | Read a value from instance.yaml |
sanctum_slug | Shortcut for the instance slug |
sanctum_home | Returns the Sanctum haus directory path |
sanctum_vm_ssh <command> | Run a command on the VM via SSH |
sanctum_enabled <service> | Check if a service is enabled |
sanctum_expand <template> | Expand {{PLACEHOLDER}} variables in a template |
Generate LaunchAgents
Section titled “Generate LaunchAgents”Sanctum uses macOS LaunchAgents to manage services. Rather than maintaining individual plist files by hand — an activity that has driven better engineers than you to drink — you generate them from templates.
-
Review the templates.
Templates live in
~/.sanctum/templates/launchagents/. Each template uses{{PLACEHOLDER}}syntax for values pulled frominstance.yamland macOS Keychain. -
Run the generator.
Terminal window # Preview what will be generated (no files written)bash ~/.sanctum/generate-plists.sh --dry-run# Generate for realbash ~/.sanctum/generate-plists.shThe generator does the following:
- Reads each template from
~/.sanctum/templates/launchagents/ - Expands placeholders with values from
instance.yaml - Pulls tokens from macOS Keychain where referenced
- Skips templates for disabled services
- Writes rendered plists to
~/Library/LaunchAgents/
- Reads each template from
-
Load the generated agents.
Terminal window # Load all Sanctum LaunchAgentsfor plist in ~/Library/LaunchAgents/com.sanctum.*.plist; dolaunchctl load "$plist"done
Set Up the Dashboard
Section titled “Set Up the Dashboard”The dashboard is a web interface that displays the status of all services, nodes, and agents. It is the face of Sanctum — the thing you show people when they ask “So what does this Mac Mini actually do?”
-
Install dependencies.
Terminal window cd ~/.sanctum/dashboardnpm install -
Build and start.
Terminal window npm run devThe dashboard will be available at
http://localhost:1111.Terminal window npm run buildnpm startIn production, the dashboard LaunchAgent handles startup automatically. The generator creates the appropriate plist if the dashboard service is enabled in
instance.yaml. -
Verify the config endpoint.
The dashboard serves instance configuration (with secrets excluded) at its API endpoint:
Terminal window curl -s http://localhost:1111/api/config | python3 -m json.toolYou should see your instance configuration as JSON. If you see an error, welcome to your first Sanctum debugging session. There will be others.
Set Up the VM
Section titled “Set Up the VM”If you plan to run VM workloads (agent orchestration, knowledge graph), set up the Ubuntu VM. This is where the system goes from “neat haus automation project” to “wait, you’re running a knowledge graph in a virtual machine inside a Mac Mini?”
-
Create the VM in UTM.
Use the settings from the Requirements page. Install Ubuntu 24.04 LTS with SSH enabled.
-
Configure networking.
The Mac needs to set the bridge IP each time the VM starts. This is handled by the UTM autostart LaunchAgent, which runs:
Terminal window sudo ifconfig bridge100 10.10.10.1/24A sudoers entry at
/etc/sudoers.d/vmnet-bridgeallows this without a password prompt. -
Set the VM’s static IP.
Inside the VM, configure a static IP of
10.10.10.10on the vmnet interface using netplan or your preferred method. -
Test connectivity.
Terminal window # From Mac# From VMping 10.10.10.1
Next Steps
Section titled “Next Steps”With the base installation complete, proceed to First Run to verify everything is working and complete initial setup. This is the moment of truth. Deep breath.