For homelabs on macOS

Your homelab, at home on your Mac.

MacTain is a native Mac app for the self-hosted services your homelab relies on. See what's running, start a whole Blueprint with a click, and keep everything up to date, all without living in Terminal.

See pricingTake the tourDownload opens at launch.

Free for up to 3 running containers · Plus $39.99 USD/year · Built for Apple Silicon

MacTain Containers view: the mediastack Blueprint with jellyseerr, prowlarr, radarr and sonarr running, sonarr selected

The app

One app for your whole homelab.

MacTain is built with the GUI in mind. Your containers, Blueprints, images, data and secrets all live in one Mac app, with the details a click away.

See your whole homelab at a glance.

Health, uptime, CPU and memory for everything that's running, with start, stop and restart right there.

  • Live CPU and memory per container
  • Top consumers and alerts
  • One-click start, stop and restart
MacTain Dashboard with running workloads, capacity and aggregate usage

Secure Egress Plus

Your containers. Your VPN. Managed by MacTain.

Route selected containers through your own WireGuard VPN connection. Import your configuration, choose which containers to protect, and manage everything in the native app—without configuring a separate VPN sidecar.

Bring your VPN.

Import a standard WireGuard configuration.

Choose what’s protected.

Assign individual containers or Blueprint components.

Protection built in.

Secure Egress is designed to block protected workloads when VPN protection cannot be established.

Requires your own WireGuard configuration. Included with MacTain Plus.

MacTain VPN Connections with a saved WireGuard connection and separate Protected and Blocked statuses for its assigned containers. Example configuration. (full-size image, opens in a new tab)
Connection health and each container’s protection status, in one view.View full-size screenshot (full-size image, opens in a new tab)
  1. Selected containers
  2. Your WireGuard VPN
  3. Internet
Do I need a separate VPN container like Gluetun?

No separate VPN sidecar is needed to use MacTain’s Secure Egress. Import your own WireGuard configuration and assign the containers or Blueprint components you want to protect. MacTain manages the VPN gateway and protection enforcement. You still choose and configure your VPN provider or WireGuard endpoint.

Compose to Blueprint Plus

Already have a Compose file? Start there.

Most homelabs begin as a compose.yaml copied from a project's README. MacTain converts the parts it supports into a Blueprint, a readable file you can review, edit and run.

compose.yamlYou bring
# compose.yaml
services:
  jellyseerr:
    image: fallenbagel/jellyseerr:latest
    ports:
      - "5055:5055"
    environment:
      - TZ=America/New_York
    volumes:
      - jellyseerr_config:/app/config

  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    ports:
      - "8989:8989"
    environment:
      - TZ=America/New_York
    volumes:
      - sonarr_config:/config
      - /Users/Shared/Media/TV:/tv

volumes:
  jellyseerr_config:
  sonarr_config:
mediastack.tomlActual converter output
[blueprint]
schema = "mactain.blueprint/v2"
name = "mediastack"

[defaults.component]
env = { "TZ" = "America/New_York" }

[[resources.volumes]]
id = "jellyseerr_config"
type = "local"

[[resources.volumes]]
id = "sonarr_config"
type = "local"

[[components]]
id = "jellyseerr"
kind = "container"
image = "fallenbagel/jellyseerr:latest"
ports = [
  { host = 5055, to = 5055, type = "tcp" }
]
mounts = [
  { volume = "jellyseerr_config", to = "/app/config" }
]

[[components]]
id = "sonarr"
kind = "container"
image = "lscr.io/linuxserver/sonarr:latest"
ports = [
  { host = 8989, to = 8989, type = "tcp" }
]
mounts = [
  { volume = "sonarr_config", to = "/config" },
  { type = "bind", source = "/Users/Shared/Media/TV", to = "/tv" }
]
✓ Validate✓ Plan previewStart

Not every Compose file converts one-to-one.

MacTain converts the common parts of Compose: images, ports, environment, volumes and bind mounts. Some settings assume a shared Docker host and have no equivalent when each container runs in its own lightweight VM, such as network_mode: host, privileged, devices (for example /dev/dri for hardware transcoding), cap_add and pid: host. The converter warns about each one and leaves it out of the Blueprint, so read the warnings before you start it.

Under the hood

Every container is its own lightweight VM.

MacTain is built on Apple Containerization. Your containers don't share one big Linux VM. Each one boots in its own small virtual machine, with a minimal Linux kernel and a tiny init process, and the MacTain Engine creates and controls each one.

Isolated by design

If something breaks out of a container, it's still inside that container's own VM, walled off from macOS and from your other services. The Engine runs as you, not as root. You get the protection rootless containers aim for, with nothing extra to set up.

Share only what's needed

Mount just the folders a service needs from your Mac.

Built to start fast

An optimized kernel and a minimal root filesystem keep each VM light.

Three containers, jellyseerr, sonarr and prowlarr, are each drawn as a separate lightweight virtual machine containing the app, vminitd and a minimal Linux kernel. Dashed lines connect each VM to the MacTain Engine, which sits on the Apple Containerization framework. Below that are macOS Virtualization.framework and Apple Silicon.

Made for always-on

The details a homelab needs.

Starts with your Mac Plus

Launch at login, autostart the containers you choose, and set startup delays so services come up in order.

Build your own images

Build from a Dockerfile or Containerfile right on your Mac, then run it like any other image.

Logs you can look back at

Follow live logs on Free. Plus keeps history across stops, failed starts and restarts.

Nice names for your services Plus

Local Domains and service-name discovery, so you stop memorizing port numbers.

⌘ For power users

Prefer a terminal? It's there when you want it.

You never need it to use MacTain. But if you like to script things, the mactain CLI drives the same Engine as the app, with JSON output where you need it.

CLI reference →
zshfrom the MacTain docs
# Define and start a container in one step
$ mactain container start \
    --name hello-web \
    --image docker.io/library/nginx:latest \
    --publish 8080:80 \
    --detach
Container started: hello-web

$ mactain container list
$ mactain container logs hello-web

# Bring a Compose file across
$ mactain blueprint convert compose \
    --input compose.yaml --output mediastack.toml
$ mactain blueprint plan ./mediastack.toml
Selected components (2): jellyseerr, sonarr
  - create jellyseerr (image: fallenbagel/jellyseerr:latest)
  - create sonarr (image: lscr.io/linuxserver/sonarr:latest)
$ mactain blueprint start ./mediastack.toml
Not every Compose file converts one-to-one.

Pricing

Start free. Upgrade when your homelab grows.

Free

$0

  • Up to 3 running containers
  • Create, edit and run Blueprints
  • Live logs, secrets and published ports