FrontierStack User Manual Manual home
Desktop Manual Mobile Manual 日本語한국어 frontierstack.app ↗

User Manual

FrontierStack

Desktop Edition

Install, run and monitor Apache, databases, mail, security and 1,000+ services on your Mac and across your fleet — with an AI administrator at the helm.

Version 1.0.0 · First Edition · August 2026
Published by Enfour, Inc.

Table of Contents

Getting Started
  1. 1Introduction
  2. 2Installation & First Run
  3. 3The Interface
Running Services
  1. 4The Web Stack
  2. 5Databases & Data
  3. 6The Service Catalog
  4. 7Sites, Domains & the Web
Fleet, Network & Security
  1. 8Connecting Servers: Locations & the Fleet
  2. 9Networking & the Perimeter
  3. 10Security & Hardening
  4. 11Monitoring & Alerts
Automation & AI
  1. 12Scripts, Cron & Automation
  2. 13The AI Administrator
  3. 14FrontierStack in Agentic Workflows
  4. 15The AI Stack
Business & Reference
  1. 16Business & Vertical Solutions
  2. 17Settings, Licensing & Updates
  3. 18Keyboard, URL Scheme & Troubleshooting

Part I

I
Getting Started

What FrontierStack is, how it thinks, and how to get it running on your Mac.

1

Chapter 1

Introduction

The server control panel Apple took away — rebuilt for one Mac or a whole fleet, and driven by an AI that can actually see and fix your servers.

When Apple discontinued macOS Server.app, Mac users lost the simple, point-and-click way to run websites and services. FrontierStack brings that back and goes much further: it installs, controls, secures and monitors Apache, PHP, MySQL, PostgreSQL, Nginx and more than a thousand other services — on the Mac in front of you and on every server you link to it — and it puts a tool-using AI administrator at the helm.

This manual is the complete reference for the desktop app. A companion Mobile Manual covers the iPhone and iPad app. Read this first chapter end to end; after that, dip into whichever part you need.

1.1What FrontierStack is

FrontierStack is a native macOS application — not a web panel, not a container you have to babysit. It manages real services on real machines using the tools they already ship with: Homebrew formulae, launchd and systemd units, Apache and Nginx config, certificates, firewalls and SSH. It is three things at once:

  • A control panel. Install, start, stop and configure services with validation, live status and one-click fixes — the macOS Server replacement, modernised.
  • A monitoring and alerting system. A continuous health sweep watches services, sites, certificates, disks and your whole fleet, and turns the first sign of trouble into a message on the channels you choose.
  • An AI administrator. A guard-railed, tool-using assistant with a live, accurate picture of your setup. It can diagnose what is broken, propose a fix you approve, run it locally or across your fleet, and reshape the app to exactly what you run.
screenshot to be added
Figure 1.1. The FrontierStack main window: the service sidebar on the left, the active pane in the centre, and live health at a glance.Capture: open the app at the Local Health pane with a few services running, sidebar expanded

1.2An AI-first design

Most apps bolt a chat box onto the side. FrontierStack is built the other way around: the AI is a first-class operator of the same controls you use. Because it acts only through a fixed set of audited tools — read a log, run a diagnostic, restart a service, issue a certificate, write a file — everything it does is something you could do by hand, and everything that changes the system is shown to you for approval first.

Three principles make this safe enough to trust with production servers:

  • Read-only by default. Out of the box the assistant can look but not touch. Changes and scripts are unlocked by explicit toggles, and every mutating action shows an approval card before it runs.
  • Your secrets never reach the model. Passwords and API tokens live in a local .env vault. Scripts reference them by name; the app injects the real value at run time, locally or over SSH. The cloud model sees the name, never the value. Logs and files are secret-redacted before they are sent.
  • You bring your own AI. Point it at a cloud model or a local one (Ollama, LM Studio). If you drive it from your own subscription tool over MCP — Claude Code, Cursor — there is no metered per-token bill at all.
SecurityThe AI Administrator, the privileged helper and every remote action are off until you enable them. Nothing in this manual happens behind your back; each capability is something you switch on deliberately. See Chapter 13 for the full trust model.

1.3Who it is for

FrontierStack suits anyone running — or wanting to run — servers on a Mac:

  • Developers who want a clean local stack instead of MAMP or XAMPP.
  • Small businesses self-hosting POS, CRM, e-commerce, mail and helpdesk on a Mac mini.
  • Admins keeping a vintage Xserve or Mac mini on macOS Server useful by managing it remotely.
  • Anyone moving from metered SaaS to self-hosted, or running a fleet of Macs, Linux boxes, BSD servers and Raspberry Pis from one window.

1.4Key concepts and vocabulary

A handful of terms recur throughout this manual. Meet them once here.

TermWhat it means
ServiceAnything FrontierStack can install, run and monitor — Apache, a database, a mail server, a container, a router integration. The full list is the catalog (Chapter 6).
PaneA screen in the app for one service or tool, opened from the sidebar.
The helperA small privileged tool (an SMAppService daemon) that performs admin actions without a password prompt each time. Optional; you install it on first run.
LocationWhere the Mac is on the network right now (home, office, away). Locations make alerts and reachability network-aware (Chapter 8).
Linked serverAnother machine you have connected over SSH so FrontierStack can run diagnostics and scripts on it. Your fleet is all of them together.
The AI AdministratorThe built-in tool-using assistant. Also called the AI Harness. Covered in depth in Chapter 13.
MCPModel Context Protocol — the open interface that lets an outside AI tool (Claude Code, Cursor) drive FrontierStack through the same guarded tools (Chapter 14).
Secret / the vaultA named credential in the local .env store. Scripts reference $NAME; values stay on your Mac.

1.5How this manual is organised

The manual follows the shape of the work:

  • Part I — Getting Started: install, first run, and a tour of the interface.
  • Part II — Running Services: the web stack, databases, the full catalog, and sites & domains.
  • Part III — Fleet, Network & Security: linking servers, networking and the perimeter, hardening, and monitoring & alerts.
  • Part IV — Automation & AI: scripts and schedules, the AI Administrator in full, MCP, and the AI stack.
  • Part V — Business & Reference: vertical solutions, settings, shortcuts, licensing and troubleshooting.

If you are brand new, continue to Chapter 2, Installation & First Run. If you just want to understand the AI, jump ahead to Chapter 13 — but the safety model there assumes the concepts above.

2

Chapter 2

Installation & First Run

From a fresh download to a working stack: what macOS asks for, the optional helper that makes admin painless, and how to bring an existing MAMP, XAMPP or Server.app setup across.

FrontierStack installs like any other Mac app — drag it to /Applications and open it. What happens next is up to you: it can run entirely with the per-action password prompts macOS already gives you, or you can grant it a small set of permissions once and never be asked again. This chapter walks the whole first run, then shows how to migrate an existing local stack so you keep your sites and databases.

2.1System requirements

FrontierStack is a native, signed macOS application. You need:

RequirementDetail
macOSmacOS 13 (Ventura) or later. The optional helper uses SMAppService, which is a macOS 13+ API.
ArchitectureApple silicon or Intel. The app manages the Homebrew stack at /opt/homebrew on Apple silicon (or /usr/local on Intel).
HomebrewRecommended but not required to launch. Most services are installed as Homebrew formulae; FrontierStack can install Homebrew for you (see below).
Admin accountAn administrator account on the Mac. Installing services and editing system config needs admin rights — either through the optional helper, or via the password prompt macOS shows per action.

Nothing in this list is unusual; if your Mac is recent enough to run a current macOS, it can run FrontierStack.

2.2Downloading and first launch

Download the app, move FrontierStack.app into your /Applications folder, and double-click it. Because the app is signed by Enfour, Inc. (Apple Developer team 6Y87KNMALP) and notarised, macOS opens it without the unidentified-developer warning.

  1. Open FrontierStack. The main window appears with the service sidebar on the left and a health overview in the centre — the layout you met in Chapter 1.
  2. If Homebrew isn't present yet, panes that need it will say so and offer to install it. You can do that now or later.
  3. FrontierStack enforces a single running instance. If a copy is already open and you launch it again, the existing window is simply brought to the front rather than a second copy starting. This keeps two windows from fighting over the same services and config files.

The first launch makes no changes to your system. The app reads what is installed and shows you the state of things; nothing is started, stopped or reconfigured until you ask.

screenshot to be added
Figure 2.1. The main window on first launch, before any services are installed: sidebar on the left, the health overview in the centre, and the helper-install prompt at the bottom of the sidebar.Capture: open the app on a clean Mac with no services running, sidebar expanded, the "Install helper" affordance visible at the foot of the sidebar

2.3The Setup Assistant

The first time you open FrontierStack it offers a short Setup Assistant rather than dropping you into a sidebar of several hundred services. It is eight pages, it asks about you rather than about configuration, and nothing it asks is permanent — every answer only decides what the app shows and suggests first. You can leave at any point and reopen it from Add Server or Device ▸ Setup Assistant.

PageWhat it asks
Starting pointWhether you are moving a website from another platform — STUDIO, Wix, Squarespace, Webflow, WordPress.com, Shopify, shared hosting, another server, MAMP or XAMPP, Apple Server or Windows. If you are, it says what FrontierStack does for a move from there, and the sidebar starts with only the tools that move needs. If not, it asks whether you already have a network or servers to look after, or are starting from scratch. An existing MAMP-style setup found on the Mac answers this for you.
Your businessWebsite moves only: your line of business — a shop, restaurant, hotel, clinic, school, agency and so on. The tools for that kind of business are added on top of the move’s.
GoalsWhen you aren’t moving a website: run a business, build and develop, manage servers, manage clients, self-host services, or look after a home network. More than one is fine.
EnvironmentYour experience with server administration, how many people the setup serves, and how many devices you look after — one Mac through to more than 250.
StackApache, Nginx, PHP, Node.js, Python, MySQL, PostgreSQL, MongoDB, Redis, Git and the rest, with an offer to install what is missing.
AIWhether the AI Administrator should use AI subscriptions you already pay for, or an API key or local model.
ReviewWhat will be installed and what is only suggested, shown before anything runs.
BackupsWhether to keep an hourly, versioned settings history on this Mac (on by default) and, optionally, a daily copy in a folder that syncs elsewhere such as iCloud Drive or Dropbox — so pins, Setups, Locations, preferences and Apache/PHP configuration survive an OS upgrade or a reset.
LicenceWhere you stand: an active licence, or what is available without one — with a field to paste a licence code you already have.

Finishing opens one more step: the Services Manager, filling the screen, with the sections that match your answers already open and every item in them switched off. Switch on what you want in the sidebar and choose Continue. Choose Skip — or Continue without switching anything on — and everything recommended is turned on instead. The AI Administrator and AI Models stay on either way, and the AI Administrator is briefed only once this step closes.

The last page is about licensing, and it is honest rather than a sales gate. FrontierStack works unlicensed — monitor this Mac, connect servers, use the AI Administrator, read every diagnostic. One capability in the plan you just built is licensed: running a migration. Moving a stack copies databases, sites and configuration onto a target and changes what runs there, so it needs a licence. Without one FrontierStack still detects the source, lists the sites and databases it found, and shows exactly what a migration would move — and the AI Administrator will still write you the full plan. Only carrying the move out is gated, and the Migration pane says so on the button rather than failing silently.

Containers, backup destinations and monitoring are deliberately not installed from the Stack page. They need decisions the assistant should not make on your behalf, so they go into the plan instead.

NoteThe assistant only appears on a genuinely new install. If this copy has already been through first launch, it is marked complete silently rather than interrupting a working setup.
TipIt is a starting point, not a commitment. Which services appear and which panes are visible can all be changed afterwards from the Services menu and Presets.

2.4The privileged helper — and the permissions macOS asks for

Starting and stopping services and editing system configuration (Apache, Nginx, MySQL, DNS, the firewall) are privileged operations. Out of the box, FrontierStack performs each one through the standard macOS authorisation prompt: you type your password every time. That is safe but quickly becomes tedious.

The optional helper removes that friction. It is a small privileged tool — an SMAppService daemon — that the app registers with macOS so it can carry out admin actions without re-entering your password each time. You install it deliberately: use the Install affordance at the foot of the sidebar, or accept the prompt when an action first needs it.

  1. Click Install on the helper row at the bottom of the sidebar.
  2. macOS shows its Login Items & Extensions approval (or asks you to enable the background item in System Settings ▸ General ▸ Login Items). Approve it — this is macOS asking whether to let the daemon run, not the app overriding anything.
  3. The sidebar row flips to show the helper registered and running. From now on, service start/stop and config edits proceed without the per-action password prompt.

You can remove the helper at any time; FrontierStack then falls back to per-action admin prompts. Both modes work — the helper is purely a convenience.

SecurityThe helper is signed by the same Enfour, Inc. team (6Y87KNMALP) as the app, which is what lets it register as an SMAppService daemon at all. It runs only the privileged operations the app drives; it is optional, you install it deliberately, and you can remove it. Like the AI Administrator and every remote action, it is off until you turn it on. For the full trust model see Chapter 10.

2.5Installing Homebrew

Most of the catalog — web servers, databases, caches, mail, dozens of CLI tools — is installed as Homebrew formulae. Homebrew is the package manager FrontierStack uses to fetch and update those services, so if it isn't already on your Mac you'll want it early.

Open the Homebrew pane from the sidebar. If Homebrew is missing, the pane says "Homebrew isn't installed. It's the package manager this app uses to install services," with a Get Homebrew… button. Installation runs in the app's in-app console: it executes the official Homebrew installer and, at the point the installer needs administrator rights, you type your own password into the console. FrontierStack never captures or stores it — the prompt is Homebrew's own.

Once Homebrew is present, the pane becomes a full package manager: a searchable table of installed formulae and casks with their versions, an Install formula or cask field, an Update All button that shows the outstanding count, and per-row Update / Uninstall actions. The AI Administrator can drive the same flow with its install_homebrew and install_package tools, again through the in-app console where you enter your password.

NoteWhy a separate package manager at all? FrontierStack manages real services using the tools macOS and Homebrew already ship, rather than bundling its own copies. That means the versions you run are mainstream, updatable, and identical to what you'd get on the command line — no proprietary fork to get stuck on.
The Homebrew pane: every installed formula and cask with its version, outdated packages flagged with an Update button, and Update All for the lot.
Figure 2.2. The Homebrew pane: every installed formula and cask with its version, outdated packages flagged with an Update button, and Update All for the lot.

2.6Nix, Devbox and Home Manager

Everything Nix lives in the Nix pane (under Infrastructure as Code), in tabs. Overview shows which Nix is installed — upstream Nix, Determinate Nix or Lix — whether its daemon is running and whether flakes are on. Without Nix, it offers both installers. It also catches the problem Mac users meet most: a macOS update replaces /etc/zshrc, so new terminals say nix: command not found although Nix is fine. Repair Shell Set-up puts the installer’s lines back.

  • Packages searches nixpkgs and installs, removes, upgrades or rolls back the packages in your Nix profile.
  • Devbox lists every project with a devbox.json in your usual project folders, with its packages, scripts and the services Devbox runs for it. Start, stop, restart or attach to them, open a devbox shell, or generate a Dev Container, Dockerfile or direnv file. Run a service with Devbox sets up PostgreSQL, MySQL, MariaDB, Redis, Valkey, Nginx, Caddy, Apache or PHP + Nginx in its own folder under ~/FrontierStack/Devbox and starts it, with no Docker and no Homebrew service.
  • nix-darwin (when installed) switches, builds and rolls back the Mac’s system configuration. Store shows how much space /nix/store uses and collects garbage.
  • A stopped daemon, a missing /nix volume or a failing Devbox service shows under Needs Attention and can raise an alert. Servers with Nix, NixOS or Devbox get a Nix tab in the Server Activity window.

The Home Manager tab is for Nix Home Manager, set up on its own or as a nix-darwin module. It shows where your configuration lives and whether it is a flake, and can set Home Manager up with a flake in ~/.config/home-manager.

  • Switch Configuration builds and activates your configuration, Build Only checks it without activating, and Update Inputs runs nix flake update. Each runs in the in-app console.
  • Flake inputs shows how long ago nixpkgs was pinned and turns orange after 60 days: Nix packages only get security fixes when you update and switch.
  • Generations lists every generation with its date. Activate rolls back to one; Remove Old Generations clears those older than 30 days and frees the disk space.
  • The pane also lists the packages and dotfiles the current generation provides and Home Manager’s launchd agents. Nix packages using too much CPU or memory appear under Needs Attention, as in the Homebrew pane.

2.7Tool versions with mise

mise (short for mise-en-place) gives each project the right Node, Python, Ruby, Go or Terraform version, its environment variables and its tasks — one tool in place of nvm, pyenv, asdf, direnv and make. The mise pane (under Runtimes) installs it and warns when your shell doesn’t activate it, since until then new terminals ignore the versions mise installed; Activate in Shell fixes that.

  • Tools lists every installed version, the config that asks for it and which one is active. Add a tool for every folder, uninstall a version, or prune versions nothing uses.
  • Updates shows tools behind the newest version their config allows and upgrades them.
  • Projects lists folders with a mise.toml or .tool-versions: their tools and tasks, whether mise trusts them yet, and which kinds of secrets they use (age, SOPS or fnox). FrontierStack never decrypts or shows a secret value.
  • Secrets (fnox) lists every fnox.toml with its providers and secret names, warns about secrets kept as plain text, and marks the ones KeyRotate can rotate through fnox.
  • Servers with mise get a mise tab in the Server Activity window.

2.8The Command-Line PATH pane

FrontierStack detects installed tools by resolving them the way your shell does. Occasionally a tool you've installed (via pip, pipx, a virtualenv, or a non-standard prefix) isn't on the PATH the app sees, so it reports the tool as missing. The Command-Line PATH pane fixes that.

  • Pick your shell profile (for example ~/.zprofile). Directories you add are written to a clearly marked managed block in that file and prepended to your PATH — open a new terminal to pick up the change.
  • Directories to add lets you add a path by typing it or with Choose…; the top entry is searched first. Current PATH (effective) shows your login shell's PATH, tagging entries the app manages.
  • PATH Doctor diagnoses why a tool isn't detected: enter a command (e.g. mlx_lm.server, gcloud) and it reports whether the app finds it, whether only your shell finds it, or whether it isn't installed at all — with a one-click Add to managed PATH for any directory the app is missing.

2.9The Install Wizard

If you're starting from scratch, the Install Wizard (in the sidebar) is the fastest way to a working stack. Pick a target use-case — WordPress/PHP, Full-Stack JS, Python/Django, Rails, static site, database, or reverse proxy — and the wizard pre-selects the recommended components (web server, database, cache) for that goal. Adjust the selection to taste, then it installs everything through Homebrew.

The same pane shows the status of the native Apache + MySQL + PHP stack at a glance, and detects all-in-one bundles already on your Mac — XAMPP, MAMP, AMPPS, Local. If it finds one, it routes you to Migrate Setups rather than installing a parallel stack, so you don't end up running two of everything.

2.10Migrating an existing stack

If you already run sites locally under MAMP, XAMPP or Apple's Server.app, you don't have to rebuild them. The Migrate Setups pane detects those stacks and brings their pieces into FrontierStack's native Homebrew stack: web files, MySQL databases, PHP settings, and the Apache vhosts that define each site.

  1. Open Migrate Setups. It scans for installed sources — MAMP / MAMP Pro, XAMPP, Pancake Stack and Apple Server — and reports what it found: the sites, the database, and whether PHP was detected. (The AI Administrator's detect_migration_sources tool runs the same read-only scan.)
  2. Review the Sites to import list. Each candidate shows its server name and listening port; anything that can't be brought across cleanly appears under Skipped with the reason.
  3. For settings, the Import All Settings action copies the source's php.ini, my.cnf and nginx.conf over the matching Homebrew config. A .pre-mamp.bak backup of each file is kept so you can compare or revert.
  4. Choose Import Selected to run the migration. Live progress is shown in the pane as it installs the needed Homebrew services, copies web files, migrates the MySQL databases and imports the vhosts.
  5. Review afterwards. Source configs often reference the old tool's paths and ports (for example MAMP's extension_dir, datadir, socket, or port 8889), so check the imported settings before relying on them.

From Pancake Stack. Keep Pancake running so its MySQL answers. FrontierStack reads Pancake's site list and copies its databases with the Homebrew MySQL tools, using the root password Pancake keeps in your keychain; macOS asks once whether FrontierStack may read Pancake's data and use that password — choose Allow. Pancake gave each site its database settings through the environment, so the Give each site its own MySQL user step creates a MySQL user per site and writes it into the site's wp-config.php or Laravel .env. Python apps, custom Apache directives and sites without one of those files are listed in the log for you to finish by hand. Pancake itself is not changed.

The AI Administrator can drive this end-to-end with run_migration, but only after detecting sources and confirming with you — and only with changes enabled.

WarningMigration is a big, partly irreversible operation. It installs Homebrew services, overwrites the matching Homebrew config files, and imports databases and vhosts. Back up anything precious first, and always run the detection scan and review the plan before choosing Import Selected. The .pre-mamp.bak backups cover config files, not your databases.
Migrate Setups after it has found MAMP and Apple Server.app: import servers from a hosts file or a repo, move a legacy Git server to Gitea, then choose exactly what to carry over — every step is a checkbox.
Figure 2.3. Migrate Setups after it has found MAMP and Apple Server.app: import servers from a hosts file or a repo, move a legacy Git server to Gitea, then choose exactly what to carry over — every step is a checkbox.

2.11Where your data lives

FrontierStack keeps its own state in predictable, standard places, so you always know what it touches and can back it up:

WhatWhere
App settings & data~/Library/Application Support/FrontierStack/
Secrets & tokensThe macOS Keychain, under service jp.co.enfour.frontierstack
App-managed Apache config/opt/homebrew/etc/httpd/frontierstack/ — a dedicated directory the app owns, kept separate from any hand-edited Apache config
App logs~/Library/Logs/FrontierStack/

Keeping the app's Apache config in its own frontierstack/ directory means FrontierStack can manage vhosts safely without clobbering configuration you maintain by hand. The bundle identifier is jp.co.enfour.frontierstack (the helper and DDNS components use the .helper and .ddns suffixes).

With the app installed, the helper decided, Homebrew in place and any old stack migrated, you're ready to actually use it. Chapter 3, The Interface tours the window in detail: the sidebar, panes, search, the menu bar, and the controls you'll reach for every day.

3

Chapter 3

The Interface

One window, a thousand services. This chapter is the guided tour: the sidebar, the panes, the floating palettes, Search, Help and the small touches that keep the app out of your way.

FrontierStack manages an enormous range of services, yet it presents them through a single, familiar macOS window: a sidebar of things on the left, the screen for the selected thing in the centre, and a row of always-available tools in the toolbar. Learn this layout once and every pane in the book — from Apache to a Cloudflare zone — sits exactly where you expect it. This chapter walks the interface end to end so the rest of the manual can simply say "open the Sites pane" and trust that you know how.

3.1The main window

The window is a standard macOS NavigationSplitView with three regions. On the left is the service sidebar: a scrollable, collapsible list of every service and tool you have chosen to see, grouped into categories. In the centre is the active pane — the screen for whatever you selected in the sidebar, with its own header, tabs and controls. Running across the top is the toolbar, whose buttons are available no matter which pane you are in.

From right to left, the toolbar holds: Search (the magnifying glass, also ⌘F); the AI assistant (the wand, which opens the floating command palette); a Shell button that drops a terminal into the current working directory; a Dark mode toggle that forces dark even when macOS is in light; and, when the selected pane can be floated, a break-off button to pop it out as a palette. If you have unsaved changes to a Setup, an orange Unsaved menu appears here too. When KeyRotate is installed, its ring-of-keys button sits in a group of its own at the far left; it opens KeyRotate, or brings it to the front.

The sidebar's width is yours to set — drag the divider and FrontierStack remembers it across launches. Your last-selected pane is restored when you reopen the app, so you return to where you left off.

Sidebar groups tame a sidebar that spans several sites or companies. Right-click any pinned server, device, Cloudflare zone, Wi-Fi network or cluster and assign it to a group ("Osaka office", "Acme Corp"); group rows at the top of the sidebar then switch between the sets, showing the active group's items plus everything ungrouped — grouping is optional, and ungrouped items are always visible. A red count on a non-active group warns that something hidden inside it has a problem, and a group linked to a Location activates itself when you arrive on that network. The iPhone app mirrors the same folders in its Fleet tab.

The FrontierStack main window in dark mode: the categorised service sidebar on the left, the active pane in the centre (here the Install Wizard), and the toolbar across the top.
Figure 3.1. The FrontierStack main window in dark mode: the categorised service sidebar on the left, the active pane in the centre (here the Install Wizard), and the toolbar across the top.

The sidebar is organised into two tiers. At the top sits Overview — the app's own built-in tools: Local Health, Status Page, Alerts, Spend & Billing, Domains, Logs, Certificates, Notes, Scripts, Setups, Settings and more. Below it, one section per service category — Web Servers, Databases, Caching, Mail, Networking, Security Tools, Containers, AI and dozens more — each listing the services you have chosen to show from the catalog (Chapter 6). Every section header is a chevron you can click to collapse, and the app remembers which groups you leave folded.

Each service row shows a status dot when it is running. Right-click a service for two quick actions: Pin to Top of Section keeps a service you touch often at the top of its category, and Hide removes it from the sidebar. Hiding never uninstalls anything — the service keeps running and stays reachable from Search; it just stops cluttering the list.

Below the categories, the sidebar grows extra sections for the things you pin elsewhere in the app: linked servers (each with little category icons showing which services it runs), monitored Wi-Fi networks, Cloudflare zones and Kubernetes clusters. Type in the filter field at the top of the sidebar to narrow every section at once.

TipThe sidebar is not a fixed menu — it is your menu. With a thousand services in the catalog, the point is to show only the handful you run. Hide aggressively; you can always bring something back from Search or the Presets menu.

3.3Presets and Setups

Two features shape what the sidebar shows. The Presets menu (in the menu bar) is the fast way to load a whole use-case at once. Its Base — show services for… section swaps the sidebar to a curated set for a scenario (a web stack, a mail server, a shop), while Add to current view… layers an extra group onto what you already have. Show All reveals everything; it is the escape hatch when you cannot find something.

Setups go further: a Setup is a named snapshot of your whole working view — which services are hidden, which are pinned, and the floating palettes you have open and where they sit. Save one from Presets ▸ Save Current as Setup… (or from the Setups pane), then flip between Setups from the top of the Presets menu; the active one carries a check mark. The palette layout auto-saves into the active Setup as you move windows around, so a Setup always reflects how you really work. Change which services are shown and the Setup goes dirty; the toolbar shows an orange Unsaved badge with Update, Save as New and Revert.

A Setup can also be bound to a Location (Chapter 8). Bind your "Office" Setup to your office network and FrontierStack switches to it automatically when you arrive — the right services, the right palettes, for where you are.

NotePresets, Setups and Hide are purely about the interface. They never start, stop or change a service — they only decide what you look at. Nothing you do here can break a running server.

3.4Floating palettes and mini-palettes

Sometimes you want to keep one screen visible while you work elsewhere. Any monitor-style pane can be broken off into a floating palette: a small, always-on-top utility window built on macOS NSPanel, so it stays above the main window and other apps. Use the break-off button in the toolbar (or ⌘⌥⇧W to close the front palette). Local Health, Containers, Cloud Servers, the Wi-Fi Analyzer and others all float.

For an even lighter footprint there are mini-palettes — compact, glanceable summaries rather than the full pane. Minis exist for Local Health, Cloudflare Zones, Wi-Fi, Printers, Router & Network, Containers, Scripts, Message Delivery and AWS. Each mini row has a button to open the matching pane in the main window when you need the detail. Open palettes are part of a Setup, so a saved view restores your floating windows exactly as you arranged them.

3.5The command and AI palette

The wand button in the toolbar opens the AI assistant palette — a draggable, always-on-top NSPanel with a single ask-anything field ("why is my site down?", "tune MySQL", "show only what I use"). It is the same AI Administrator covered in Chapter 13, surfaced as a floating window you can keep beside whatever you are doing. Like every floating palette it stays above the main window; unlike the others it talks back, proposes fixes and — with your approval — acts. It carries its own conversation history and an approval card for any mutating action, so nothing runs until you say so.

FrontierStack can place a small item in the macOS menu bar (toggle Show in Menu Bar). It is the quickest way to act without bringing the whole window forward. From it you can Start or Stop your startup group, Restart any of the core servers (Apache, Nginx, PHP-FPM, MySQL, Postgres) or everything running at once, refresh status, and open or quit the app. Only Background quits the app but keeps the background service (MCP, the CLI, paired devices, monitors) running, turning it on first if needed. The FrontierStack icon stays in the menu bar, now served by the background service, with Open FrontierStack and Quit FrontierStack; quitting there stops the background service until FrontierStack is next opened or you next log in. The icon also stays after a background launch quits when idle. Launch-at-login settings are in Settings › General.

Its Localhost Sites section lists every site from the Localhost pane by name, marked with a filled circle when running and a hollow one when stopped, together with what serves it and the versions (for example Apache 2.4.62 · PHP 8.3.14 or PHP 8.4.5). Each site's submenu starts, stops, restarts or opens it; Start and Open in Browser waits until the server is listening before opening the page.

Search (the magnifying glass, ⌘F) is the fastest way to reach anything. Start typing "search services, tools & actions…" and the palette matches panes, tools, services and actions as you go — including services you have hidden from the sidebar. Pick a result and the app navigates straight to it. A Semantic mode lets you search by meaning ("block an IP", "free up disk") rather than exact names, so you can find a capability without knowing what FrontierStack calls it.

TipWhen the manual tells you to open a pane you do not see in your sidebar, do not go hunting — press ⌘F and type its name. Search reaches hidden panes, and opening one puts it back in your sidebar — so your tidy sidebar costs you nothing.

3.8The Help window

Open Help with ⌘? for a dedicated FrontierStack Help window. It is a real book of in-app documentation, organised to mirror the app. Help is more than reading: its pages carry Open in app links. Click one and FrontierStack jumps the main window to that exact pane or service — the Help window stays open beside it, so you can read a procedure and follow along step by step. Many panes have a small help button in their header that opens Help at the matching topic.

3.9The Notes pane

Notes is your private place for credentials, runbooks and per-service instructions. Each note has a title, a service tag and a body, and the whole thing is encrypted in the macOS Keychain — not stored in plain files. The defining feature is the per-note lock: every note carries a Share with AI Administrator toggle that is off by default. While a note is locked, the AI literally cannot read it. Unlock a note only when you want the assistant to use those credentials or steps; it then appears in the AI's list_notes and can be read on demand.

SecurityThe Share-with-AI lock is the boundary between your secrets and the model. A locked note is invisible to the assistant — it cannot list it, read it or leak it. Unlock deliberately, per note, only for the credentials a given task needs. See Chapter 13 for how shared notes feed the AI's tools.

3.10The Status Page

The Status Page pane publishes a static index.html built from the same up/down data as Local Health, so customers or colleagues can see what is running without access to the app. Choose a destination — a folder inside one of your Apache sites' DocumentRoots, so it is served at a path like /status/ — set a page title, and decide whether to Include item details (leave detail lines off for a public page, since they can reveal internal hosts and ports). The page regenerates on an interval you set, or on demand with Generate Now. Serve with picks Apache or the built-in server (a bundled static file server on a port of your choice, localhost or LAN), and Launch keeps that server running at login or at system start so the page outlives the app. A Servers section can list pinned servers with monitors, kept live even while the app is closed, and Internet access offers persistent routes (Cloudflare Tunnel, Tailscale, router port-forward with Dynamic DNS). Location Pages publish a separate page for any place or client, listing only what you put there in Places; an item has one physical place but can be shared with any number of clients, and appears on each of their pages. Chapter 11 has the details.

3.11Local Health and Locations at a glance

Two Overview panes anchor everyday use, and each has a full chapter of its own. Local Health is the board that answers "is everything OK?": every monitored service, device and subsystem with an UP or DOWN state and a one-line summary. You mark items as critical from their own panes to add them to the board, and it doubles as a floating palette and a mini. Its full treatment — the health sweep, thresholds and how it drives alerts — is Chapter 11.

Locations teach the app where your Mac is on the network right now — Home, Office, On VPN — matched from the Wi-Fi network or subnet. Locations make monitoring network-aware: while you are somewhere unrecognised the app treats you as Away and pauses location-scoped checks, so a café or hotel network never sets off false alarms. They also bind Setups, as we saw above. The complete model — defining locations, scoping alerts and reachability, the fleet — is Chapter 8.

With the layout learned, you are ready to put it to work. The next part of the manual opens the panes themselves, starting with Chapter 4, The Web Stack.

Part II

II
Running Services

Running the web stack, databases, the service catalog and your sites on the Mac in front of you.

4

Chapter 4

The Web Stack

Apache or Nginx, the PHP version each site needs, virtual hosts, trusted local HTTPS and DNS — the whole web stack, controlled from one window with no hand-edited config.

A web server is the heart of most self-hosted setups, so FrontierStack treats it as a first-class citizen. The Apache pane installs, starts, validates and configures a Homebrew Apache; the PHP, Localhost, Certificates and DNS panes round out a complete development and hosting stack — and every change goes through validation so a typo never takes a site down silently.

This chapter covers the panes that make and run web sites on the Mac in front of you. Connecting that stack to a real domain and the public internet is Chapter 7; tightening it for production is Chapter 10.

4.1The Apache pane

Open the Apache pane from the sidebar to see your web server’s state at a glance: version, whether it is running, and the ports it listens on. The buttons across the top are the controls you reach for daily — Start, Stop, Restart and Validate Config. Validation runs apachectl -t (a real syntax check) and shows the result in Last Result, so you can confirm a change is sound before you reload.

FrontierStack recommends a Homebrew Apache rather than the macOS system copy. The Homebrew server lives under /opt/homebrew (or /usr/local on Intel Macs), runs as you through brew services without a root prompt for every action, and is not locked down by System Integrity Protection — so a current mod_php loads cleanly and the whole stack stays on one toolchain. The system Apache under /etc/apache2 is wiped by OS updates and ties you to Apple’s bundled libphp. If Homebrew Apache is not installed, the pane offers Install Homebrew Apache… in one click.

If you keep several Apache builds — the Homebrew one, a legacy local build, or a remote server’s — the binary picker (see Add Homebrew Apache / Add Local Build…) lets you register and switch between them, each with its own version and ports shown.

NoteAll of FrontierStack’s own additions to Apache live in an app-managed config tree at /opt/homebrew/etc/httpd/frontierstack/, pulled in by an IncludeOptional from httpd.conf. Keeping the app’s vhosts, MIME types and managed includes there means your hand-written httpd.conf stays clean and you can always tell what FrontierStack added.

4.2Modules, ports and the managed config

Lower in the Apache pane are the parts of the config you most often edit, each surfaced as a control rather than a file:

SectionWhat it does
PortsSet the HTTP and SSL listen ports (default 80 and 443). Move Apache off 80/443 if Nginx is using them. Apply rewrites the Listen directives and reloads.
Apache Modules (Modules…)List loaded modules and enable or disable them. Disabling an unused module is the simplest hardening step you can take.
PHP ModuleChoose which version’s mod_php (libphp.so) Apache loads for websites — see the next section.
WebDAVEnable mod_dav for a shared folder, with optional Basic-auth user, written into a managed include.
Edit MIME Types…Add or remove AddType mappings in a FrontierStack-managed MIME file, never touching the distro’s mime.types.

For anything not exposed as a control, the config rows give you Edit Managed Config… (the FrontierStack include) and Edit httpd.conf… (the main file) directly. Every save validates with apachectl -t, reloads gracefully, and rolls back if the new config does not parse — so a bad edit is caught before it can break the running server.

WarningEditing httpd.conf by hand is powerful and unguarded. The app validates and rolls back on a syntax error, but a config that parses yet points a document root at the wrong place can still expose files. Prefer the managed include for FrontierStack’s own additions, and keep a copy of any large change.

Toggling a module rewrites its LoadModule line and revalidates. If a change leaves httpd -t failing — the classic case is enabling proxy_fcgi without proxy, which the app now auto-enables for you — the Modules window shows the error and won’t close silently: you either correct it or choose Save anyway. When Apache is wedged and won’t start (the classic Homebrew Bootstrap failed: 5: Input/output error, from a service that was already loaded, or from sudo brew services leaving some httpd paths owned by root), the pane’s Recovery & reset section offers three escalating fixes: Restart cleanly (stops httpd in both the user and system launchd domains, then starts it once), Reset config to default (backs up your httpd.conf and restores Homebrew’s), and Remove & Reinstall (clears the root-owned paths and reinstalls the formula). All run in the in-app console so you see the sudo prompt and output. If Service Watchdog keep-alive is also on for Apache, it may restart httpd on its own — expected, but pause it if it fights a manual recovery.

4.3Choosing the PHP version

Open the PHP pane to manage the PHP runtimes installed on the Mac. Homebrew lets several major versions live side by side (for example [email protected] through the current release), and FrontierStack treats them as a set you switch between rather than a single global install.

Version ▸ Add Version… installs another version alongside the ones already there — nothing is replaced, and the version you are using does not change. The list has two parts. Homebrew’s own releases are the ones still supported upstream. Below them sit the end-of-life builds — PHP 8.0 back to 5.6 — which PHP itself no longer patches and Homebrew has dropped; FrontierStack fetches those from the community shivammathur/php tap, and asks you to confirm each one first, because installing from a tap means running that tap’s own code. Keep an end-of-life PHP for testing or maintaining a legacy site on your own machine, and never point the public internet at it.

There are two distinct choices:

  • The Apache module. In the Apache pane’s PHP Module section, the Load for websites picker chooses which version’s libphp.so Apache loads. Changing it rewrites the managed config and reloads Apache.
  • Per-site PHP. A local dev server (the Localhost pane, below) has its own PHP Version picker listing every installed version, so one project can run on an older PHP while another runs on the latest — without changing what the rest of the machine uses. This is the usual way to keep a legacy app and a new one happy at the same time. It applies to both local runtimes: the PHP built-in server and the Apache runtime. One caveat for Apache, which serves through mod_php: a version is only usable there if its keg ships libphp.so, and the editor tells you when the one you picked does not. When it does not, run that site on the built-in server, or serve it through PHP-FPM.

PHP Cache. The PHP pane’s PHP Cache section chooses between No cache, OPcache and OPcache + APCu. OPcache keeps each script’s compiled form in shared memory, so pages run faster; APCu adds a key-value cache that apps call directly (apcu_store/apcu_fetch) — WordPress object-cache plugins, Laravel and Symfony use it. Set the OPcache memory and Check for changed files: Every request suits development, because an edited file shows on the next reload; Never suits production, where code changes appear only after a restart. APCu is a PECL extension, so the first time you pick it, press Install APCu. Apply Cache Settings writes php.ini and restarts Apache. Sites served through PHP-FPM pick up the change when their pool restarts.

The Runtime Health pane gives the wider picture — PHP alongside Python, Node.js, Java, Go, Rust, Ruby, Perl and .NET — with a self-check that flags a missing or end-of-life runtime before it bites you.

The Runtimes section also carries a React pane for front-end work. It scaffolds a new app (Vite, TanStack Start or Next.js), points at any React project, and offers a curated companion-library list filed by the job each does — state management (Zustand, Jotai, Redux Toolkit), data fetching and server state (TanStack Query — the library formerly called React Query — and SWR), full-stack frameworks (TanStack Start, Next.js), routing, validation (ArkType, Zod), forms, and authentication (Clerk). Each row shows its docs, whether the selected project already uses it, and a one-click npm install into that project.

4.4Updating PHP on an older Mac with MacPorts

Older Macs (macOS 10.13 High Sierra and earlier, including Apple Server.app machines) still run Apple's built-in PHP. On High Sierra that is PHP 7.1, which has had no security fixes since 2019. Homebrew no longer supports macOS this old, but MacPorts still does. Use it to install a current PHP alongside Apple's, then move the command line and the websites over to it. Run the commands in Terminal on that Mac, or over SSH. Every port command that changes something needs sudo; the error “attempt to write a readonly database” means it was left off. For a linked server, you can also ask the AI Administrator to walk you through these steps.

1. Make sure Terminal finds MacPorts. If port answers “command not found” although /opt/local/bin/port exists, the MacPorts installer didn't add its PATH line. Open ~/.bash_profile (or ~/.profile, if that is the file your shell reads) and find the comment “MacPorts Installer addition”. If nothing sits between it and “Finished adapting”, add this line there, then open a new Terminal window:

export PATH="/opt/local/bin:/opt/local/sbin:$PATH"

2. Update MacPorts and see what's installed. The last command lists the PHP 8 versions MacPorts offers.

sudo port selfupdate
port installed 'php*'
port echo 'name:^php8[0-9]$'

3. Install the new PHP and its extensions. The example uses PHP 8.4. Install the same extensions your sites already use; port installed 'php80-*' lists an older version's set.

sudo port install php84 php84-fpm php84-mysql php84-openssl
sudo port install php84-curl php84-intl php84-mbstring php84-gd php84-zip
sudo cp /opt/local/etc/php84/php.ini-production /opt/local/etc/php84/php.ini

Set date.timezone in the new php.ini. MacPorts usually downloads a ready-made build. If it compiles from source instead, this can take an hour and needs Apple's command-line tools (xcode-select --install).

4. Switch the command line.

sudo port select --set php php84
hash -r; php -v

php -v should now report 8.4. Apple's /usr/bin/php stays at 7.1, so cron jobs and scripts that name it by its full path keep the old version until you change them to /opt/local/bin/php.

5. Switch the websites to PHP-FPM. Apple's Apache can't load MacPorts' mod_php, which is built for MacPorts' own Apache. Run PHP as a FastCGI service instead:

cd /opt/local/etc/php84
sudo cp php-fpm.conf.default php-fpm.conf
sudo cp php-fpm.d/www.conf.default php-fpm.d/www.conf

In php-fpm.d/www.conf, set user = _www and group = _www, the account Apache runs as on macOS. PHP-FPM listens on 127.0.0.1:9000; if lsof -iTCP:9000 -sTCP:LISTEN shows something already using that port, choose another. Start it now and at every boot:

sudo port load php84-fpm

Then tell Apache to send .php files to it. Save the lines below as a file ending in .conf, for example zz-php84-fpm.conf. On a Server.app Mac it goes in /Library/Server/Web/Config/apache2/other/. On a Mac without Server.app, put it in /etc/apache2/other/ and remove the # in front of the mod_proxy and mod_proxy_fcgi LoadModule lines in /etc/apache2/httpd.conf.

<FilesMatch "\.php$">
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

This takes precedence over Apple's PHP module without removing it, so leave Server.app's PHP setting as it is. Apple's setup also runs .html pages through PHP, but PHP-FPM handles only .php. To include other extensions, add them both here and to security.limit_extensions in www.conf.

6. Check the configuration and restart the web server. On a Server.app Mac:

export SERVER_INSTALL_PATH_PREFIX=/Applications/Server.app/Contents/ServerRoot MODULE_INSTALL_PATH_PREFIX=
httpd -t -D WEBSERVICE_ON -f /Library/Server/Web/Config/apache2/httpd_server_app.conf
sudo serveradmin stop web; sudo serveradmin start web

Server.app's Apache keeps its own process ID file, so don't use apachectl graceful there. On a Mac without Server.app, run sudo apachectl configtest, then sudo apachectl graceful. If the check reports anything other than “Syntax OK”, fix the file before restarting.

7. Confirm. Put a file containing <?php phpinfo(); in a site's folder and open it in a browser. Server API should read “FPM/FastCGI” and the version should be 8.4. Delete the file afterwards, because it shows the server's configuration to anyone.

WarningMoving from PHP 7 to 8 breaks some older code, so test each site after switching. To go back, delete the .conf file you added and restart the web server: the sites return to Apple's PHP straight away. sudo port select --set php none returns the command line to Apple's PHP. Keep the older MacPorts PHP installed until every site works.
TipIf a site can't reach MySQL on localhost (“No such file or directory”), PHP is looking for the database socket in the wrong place. Find the right path with mysql -e 'select @@socket', set mysqli.default_socket and pdo_mysql.default_socket to it in php.ini, then run sudo port reload php84-fpm.

4.5The Modernize Old Mac Server pane

For a linked Mac that still runs Apple’s Server.app, the Modernize Old Mac Server pane (Setup & Migration) does the steps above for you, then keeps going. Choose the server and press Check server. It first finds out which services the server actually runs and shows only the sections that apply, listing the ones it left out; nothing changes until you press a button, and every change runs in the console so you can watch it.

  1. System disk — shown at the top when the system runs from a spinning disk: move it to an SSD, inside the Mac or as an external SSD over Thunderbolt, USB 3 or FireWire 800, whichever is fastest on that model.
  2. MacPorts — install or update MacPorts, and put it on the Terminal PATH.
  3. PHP 8.4 (PHP-FPM) — install PHP 8.4 beside Apple’s PHP, then Switch websites: the old php.ini limits are copied, Deprecated notices hidden, and every site’s home page checked before and after, with an automatic switch back if one breaks. The PHP-FPM pool is sized to the Mac’s memory (not PHP’s stock 5 workers); Size Workers to Memory redoes it from the real worker size.
  4. Health check — which PHP answered each site, failures, visible PHP messages and the most frequent PHP errors.
  5. Code updates — mechanical PHP 8 fixes ($s{0} offsets, each() loops, literal create_function(), magic quotes, error_reporting(E_ALL), opt-in short <? tags), with the rest handed to the AI Administrator.
  6. Apache migration (optional) — everything else in the pane works with Server.app’s web service, so you can keep it (Keep Server.app’s web; the one-run paths then leave it alone). Or move all web services to MacPorts Apache, which still gets fixes — serviceproxy and Server.app’s own Apache behind it (after Apple’s PHP is retired; Test Front End Only moves serviceproxy alone): Retire serviceproxy works like Retire Apple’s PHP — every site, Server.app service path, page and file is named and fetched through both front ends before and after, scripts other than a folder’s index page are never opened, and serviceproxy comes straight back if any answer differs. Restore serviceproxy undoes it.
  7. Server.app services — a guard that keeps the service proxy (ports 80/443) running and reports a broken proxy configuration rather than restarting it blindly; for an installation still running Apple’s BIND, a guided move to Cloudflare or a current MacPorts BIND; where Server.app’s L2TP VPN runs, a recommendation to move users to WireGuard, OpenVPN or Tailscale and turn it off.
  8. Directory (LDAP & Kerberos) — checks for anonymous reads, the LDAPS certificate and weak Kerberos encryption; a pf rule that limits the directory ports to private networks; nightly encrypted Open Directory archives.
  9. Password-guessing blocks — the mail block described in Chapter 18, plus a login guard for SSH, Screen Sharing, Kerberos and websites. Attacks arriving through Cloudflare are listed per site for a Cloudflare rate-limit rule.
  10. Mail authentication (DKIM) — OpenDKIM, a key per domain, signing once DNS has the key; records published from the pane, copied, or handed to the AI.
  11. Mail TLS — TLS 1.2 and later only, and a Let’s Encrypt certificate issued on this Mac in place of a self-signed one.
  12. Mail DNS — SPF (with its lookup count), DMARC, DKIM, TLS-RPT and MTA-STS per domain; DMARC to quarantine and TLS-RPT from the pane, SPF fixes and MTA-STS with the AI.
  13. Spam filtering — rspamd, adding X-Spam headers only.
  14. Remote access (Tailscale) — Tailscale as a system service that starts at boot with nobody logged in, from the 1.44.3 build staged for macOS 10.13 (the installer refuses a server older than the build supports). It also checks that tailnet traffic really leaves through the tunnel: Tailscale.app running alongside fights over the routes and takes them away when it quits. Retire Tailscale.app quits it, stops it starting at login and restarts the daemon.
  15. Newer curl, rsync & OpenSSL — installed in /opt/local beside Apple’s copies, which Server.app keeps using.
  16. Admin-ports firewall — Screen Sharing, Remote Desktop, port 311, AFP, SMB and optionally SSH answer only private networks, Tailscale and the address FrontierStack connects from. The rules undo themselves within 10 minutes unless FrontierStack confirms them over a fresh connection.
  17. File integrity — a daily, root-only SHA-256 check of startup jobs, sudoers, pf, ssh keys, cron, Server.app and Apache configuration and the sites’ PHP. FrontierStack alerts on changes, and on a baseline replaced behind its back; Accept changes records the current files as the new baseline.
  18. Scanning with ClamAV — the pane installs and schedules the open-source ClamAV scanner: daily signature updates and a weekly, report-only scan of the websites plus a check for web-shell code and PHP in upload folders; optionally virus scanning of incoming mail through the spam filter.
  19. OpenSSH — install a newer OpenSSH, run it on port 2222 with Apple’s host keys, test a login, then switch port 22. The switch needs a second way in, and reverts by itself unless FrontierStack reconnects to confirm.
  20. Network around this server — read from your linked firewall and Subnets: Suricata and Zenarmor on the OPNsense in front of it, where a web application firewall belongs, VPN-only administration, and which machines share its network.
  21. Security checklist — TLS, SPF, DMARC, DKIM, reverse DNS, the service proxy, SSH logins and OS support, each linked to the pane that fixes it.

Keeping PHP patched. The pane compares the server’s PHP with php.net’s latest release of its branch, so it warns the day PHP ships a security release, even before MacPorts has packaged it; until MacPorts has, the warning says so. Once it has, Update PHP 8.4 (the Install button, run again) upgrades the PHP ports and restarts PHP-FPM, so no worker keeps running the old code. The Update for curl, rsync and OpenSSL upgrades those ports the same way, and the MacPorts section lists every MacPorts tool that is out of date on the server. The MacPorts installer works on every macOS version MacPorts supports, including macOS 26 and 27. In the security checklist, websites still served by Apple’s PHP are a failing item: it has had no fixes since 2019 and runs inside Apache as mod_php, the setup most exposed to remote-code flaws.

WarningA fixed file keeps its original beside it as .bak-fsmodernize-<date>, and is written only when it passes PHP’s syntax check on the new PHP (and on Apple’s PHP too, if it passed there before). A syntax check can’t prove a page behaves the same, so run the health check afterwards and look at the pages you care about.

4.6Sites and virtual hosts

The Websites list in the Apache pane is where you manage virtual hosts. Each row shows the site’s name, the bind address and the port (for example :8080), and a Running toggle for its live status. The buttons let you Add Site…, edit, duplicate, disable, Push to Server… (copy a vhost to a linked server), and open the site in a browser. Import Sites… and Copy from… pull existing vhosts in from MAMP, XAMPP, Apple’s Server.app or another Apache, bound to localhost by default.

Adding or editing a site, you set the essentials a vhost needs: its ServerName (the domain), the document root (Choose… a folder), and the bind address and port. Enable the site and it appears in the list with a live status dot; FrontierStack writes the vhost into a .conf file under the managed tree, validates, and reloads. To create the vhost, certificate and a Cloudflare DNS record together, use New Site + DNS… — the one-flow wizard described in Chapter 7.

screenshot to be added
Figure 4.1. A virtual host’s settings: ServerName, document root, bind address and port, with TLS and PHP options.Capture: open the Apache pane, select a site in the Websites list, and show its settings editor with ServerName and document root filled in
TipBind a site to 127.0.0.1 while you develop and it is reachable only from your Mac — the safest default for work in progress. Move the bind address to 0.0.0.0 or a LAN IP only when you genuinely want other machines to reach it.

4.7TLS certificates for sites

The Certificates pane issues and manages the certificates that put the padlock on your sites. It offers three paths, suited to different needs:

MethodUse it for
mkcert (Get Certificate (mkcert))Trusted local HTTPS. mkcert installs a local certificate authority your Mac trusts, so https://myapp.test works with no browser warning — ideal for development. Install mkcert sets it up first.
Let’s Encrypt (ACME)Public, browser-trusted certificates for real domains, via acme.sh or certbot. Issue by webroot (the domain already serves HTTP) or by DNS-01 via Cloudflare (no inbound HTTP needed). Renew All Now and a renew cron keep them current.
Create Self-Signed CertificateA quick certificate for internal or testing use where a browser warning is acceptable.

Once issued, Deploy to Apache wires the certificate into the site’s vhost. The Expiry Monitoring section watches your certificates (and any domain you add with Watch) and alerts you well before they lapse — the deeper hardening story, including HSTS and modern cipher policy, is in Chapter 10.

4.8Updating certificates, here and on linked servers

Every certificate in Installed Certificates shows who issued it and how many days it has left. Update… on its row renews it in place, offering only the methods that fit that certificate: Re-issue self-signed (the same private key by default, up to 397 days), Renew with certbot or acme.sh (so the client’s own deploy hooks run), Renew with mkcert, or Replace from files… for a certificate bought elsewhere. The previous files are kept beside the new ones as .bak, and you can reload the web server in the same step.

When you have linked servers, a Host picker appears at the top of the pane. Choose a server and the pane reads its certificates over SSH: Let’s Encrypt lineages, acme.sh, /etc/ssl and the nginx, Apache, Caddy and HAProxy certificate folders. Only certificates with their private key beside them are listed. Update and Create… work there too; changes run as root with the server’s saved sudo password, so without one the server is shown read-only.

Installed certificates are watched automatically, on this Mac and on linked servers, so Alerts warn before any of them expire with no setup. The bell on each row turns watching on or off, and certificates that were already expired when first seen are left out.

screenshot to be added
Figure 4.2. The Certificates pane showing a linked server's certificates with expiry and Update buttons.Capture: open Certificates, pick a linked Linux server in the Host picker, with one Let's Encrypt and one self-signed certificate listed
WarningA server certificate valid for more than 398 days is refused outright by Safari and Chrome, with no way to click through. FrontierStack therefore caps self-signed certificates at 397 days; for longer life, use ACME renewal instead.
Securitymkcert’s local CA is trusted only by the Mac it runs on, and Let’s Encrypt certificates are real public certificates — never use a self-signed certificate for a site the public will visit. The Cloudflare API token for DNS-01 issuance is stored as a CF_TOKEN vault secret and injected at run time; it is never sent to a cloud AI.

4.9The .htaccess editor

Per-directory Apache rules — rewrites, redirects, access control — live in .htaccess files, and FrontierStack gives them a dedicated editor with line numbers and a syntax sanity check. Open a site’s document-root .htaccess with Use Site Root, or point it at a custom path. Insert Recipe drops in common, correct snippets (a front-controller rewrite, a force-HTTPS block) so you start from working rules rather than memory, and the editor flags obvious problems before you save. Export PHP Router… turns .htaccess rewrite rules into a router file for a built-in PHP dev server — useful when you move a site to the Localhost pane.

4.10Nginx and reverse proxies

FrontierStack manages Nginx as an alternative web server or a reverse proxy in front of an app. When both are installed, the Domains view groups your sites by server — Apache virtual hosts and Nginx server blocks side by side — reading each Nginx server block’s listen port, root and TLS state. A reverse proxy is the standard pattern for fronting an application that speaks HTTP on a high port (a Node, .NET or Python service): Nginx terminates TLS on 443 and forwards to the app. Because Apache and Nginx both want 80/443 by default, use the Apache pane’s Ports section to move one off those ports if you run them together.

4.11Localhost, DNS and dev stacks

Three more panes complete the local picture:

  • Localhost — a manager for ad-hoc local dev servers. Add a New Local Server, pick a Runtime (PHP, Python/Django, Node/Vite, or a private Apache, Nginx or Caddy…) and folder, set a port and an optional ServerName, and Start it — with per-server Environment Globals and a .test resolver so myapp.test resolves locally. A Free Port helper and a stop whatever is holding localhost action clear the usual conflicts. Tick Also serve on Tailscale to reach a server from your other Tailscale devices at this Mac’s tailnet address on the same port — the server still listens on localhost only and FrontierStack forwards tailnet connections to it, so the LAN can’t reach it. For a Django server, Allow Tailscale Host… adds the tailnet address to the project’s ALLOWED_HOSTS after showing you the change (or hands you the line to add, when the setting is built from environment variables). The AI Administrator (and an agent over MCP) can start a folder the same way with debug_share action serve; the reply names the localhost host and port and, when asked, the Tailscale URL, so the agent can report where the site is running.
  • DNS — local name resolution and authoritative hosting. Run dnsmasq, unbound or nsd; import and export zone files; and flush the resolver when records change so the Mac stops serving a stale answer.
  • LAMP / DevStacks — one-click stacks. The LAMP pane offers presets (Choose a Setup) that install and start a matched set of components together (Install & Start, Start All, Stop All); DevStacks detects the framework of a project folder and shows the right commands and npm scripts to run it.

An Localhost overview shows every local server you have running, side by side, so you can run many sites at once without a wall of Terminal windows to babysit.

4.12Putting a site online, and handing it to an agent

Every local server has an Internet access box in its detail. Pick Cloudflare hostname and type a name on one of your zones (say demo.example.com), and FrontierStack adds the route and the DNS record and runs cloudflared as a system service, so the address stays up when the app is closed and after a reboot. The first site asks once for your admin password. Later sites share the same tunnel, each on its own hostname. A temporary link (trycloudflare.com) and Tailscale Funnel are the other choices. Vite and Django normally refuse hostnames they don’t know, so Cloudflare routes hand them localhost instead and they work unchanged.

The same globe button sits on Apache ▸ Websites rows (the tunnel asks Apache for the site by its ServerName) and on catalogue services, Docker containers, Vagrant boxes and Spin apps.

Hosting Preferences… (in the Localhost pane, and under Settings ▸ Websites & Hosting) says where your new sites belong. Choose this Mac, an Apache site, one of your servers, here.now, Hostinger, Vercel or ChatGPT Sites, and if you like a different place per kind of site. It also holds the web server new sites run on — Apache, Nginx, Caddy, or Ask each time — the domain new sites are named under, the folder they’re created in, who builds them, and the design skills (folders holding a SKILL.md) the builder should follow.

Then ask the AI Administrator for a site (“a one-page site for the bakery, warm colours, opening hours and a map”). Unless you said, or set one in Hosting Preferences, it first asks which web server the site should run on — Apache, Nginx, Caddy or Other (you name it). A static or PHP site is then served on this Mac by a private instance of that server; another server is noted for the builder and previewed with the built-in one. In one step it then creates the folder, writes the .env with the site’s settings (never passwords), a BRIEF.md, rules for the builder in AGENTS.md and your design skills in .claude/skills, starts the server, gives it its public address and makes the first git commit. It then builds the pages itself, or hands the job to Claude Code or Codex running in an isolated Sandcastle container; their files are copied back into the folder when they finish, and you get a notification. An outside agent connected over MCP can ask for the same set-up and build in the folder it’s given.

NoteNothing secret goes into the folder. If the site needs a key, the builder reads it from an environment variable, and you keep the value in FrontierStack’s Secrets.
The same tools the AI uses
Everything in this chapter is also available to the AI Administrator (Chapter 13) and to outside AI tools over MCP (Chapter 14) through the same guarded actions: vhost_create makes a virtual host, reload_webserver tests and gracefully reloads Apache or Nginx, and issue_certificate obtains a Let’s Encrypt certificate. They are mutating tools, so each shows an approval card and requires changes to be enabled — the AI does exactly what you would do in these panes, and nothing it has not been allowed to.
5

Chapter 5

Databases & Data

Run MySQL, PostgreSQL, Redis and the rest from one window; let the AI inspect and fix a site's database; and keep every byte backed up, verified and restorable.

A web stack is only as good as the data underneath it. FrontierStack treats databases as first-class services: it installs and runs them, browses what is inside, lets the AI Administrator inspect and repair a site's database in plain language, and — the part most setups forget — backs everything up on a verified schedule that you can actually restore from. This chapter covers the relational engines, the in-memory caches, the newer vector and analytics stores, and the backup machinery that protects them all.

5.1The MySQL / MariaDB pane

Open MySQL from the Databases section of the sidebar. The pane installs the server through Homebrew if it isn't present, then gives you the controls Server.app used to: Start, Stop and a live status light, the listening port (default 3306), and a list of the databases on the server. MariaDB — the drop-in MySQL-compatible fork — is managed the same way; the pane recognises whichever is installed.

Local development follows one deliberate convention: the local root account has no password. This is the MAMP/XAMPP norm and it is what makes one-click setup and the AI's SQL tools work without a credential prompt. It is safe precisely because MySQL on your Mac listens only on 127.0.0.1 and is reachable only from the machine itself. The moment a database needs to be reached from elsewhere — a passworded account, or a database on a linked server — you switch to the secret vault, described below.

The MySQL pane in dark mode: each detected installation as a tab, its data and configuration paths, service controls and start-up options, and the admin tools found on this Mac.
Figure 5.1. The MySQL pane in dark mode: each detected installation as a tab, its data and configuration paths, service controls and start-up options, and the admin tools found on this Mac.
NoteThe no-password local root applies only to MySQL bound to localhost on the Mac in front of you. It is a development convenience, not a recommendation for any server that accepts connections from the network. Production databases get a real password and live in the vault.

5.2Database Ops and running SQL

The Database Ops pane is where databases stop being a black box. Its Replication section detects whether a configured server is a MySQL replica or a PostgreSQL standby and shows the lag: MySQL reads SHOW REPLICA STATUS (IO and SQL threads, Seconds_Behind_Source); PostgreSQL uses pg_is_in_recovery() and the replay timestamp. Stopped replication, or lag past your threshold, raises an alert on your channels — the basis of the Database Slave monitoring preset.

For inspecting or fixing data, the AI Administrator carries a run_sql tool. Ask it in plain language — "why are these orders showing the wrong total?", "delete the duplicate users older than the originals" — and it runs SQL against the local server and shows you the result as a table, much like MAMP's Claude integration. Because statements can modify data, run_sql requires changes enabled; read-only queries work the moment the assistant is on. It defaults to local root with no password and is local-only by design.

5.3Passworded and remote databases

The local-root shortcut stops exactly where the network begins. For a database that needs a password, or one on a remote or linked server, you never paste the password into a prompt or a tool. Instead you add it once to the AI Administrator's Script secrets (.env) bar as a named secret — DB_PASSWORD or MYSQL_PWD — and the assistant runs the mysql client through run_script, referencing the value as $DB_PASSWORD and running it over SSH against the named server. The real value stays on your Mac and is injected at run time; the cloud model sees the name, never the secret.

SecurityNever paste a database password into a chat box, a SQL tool field, or a script body. Add it to the .env vault and reference it as $NAME. The value is injected locally or over SSH at run time and is never sent to the AI. This is the same vault model used throughout FrontierStack — see Chapter 13.

5.4PostgreSQL

Open Postgres for projects that want advanced SQL, rich JSON, full-text search or GIS. The pane installs and runs PostgreSQL (default port 5432) and sits alongside MySQL with the same start/stop/status controls. Choose PostgreSQL when your application or framework expects it; otherwise MySQL/MariaDB remains the easy default. Both engines are first-class targets for the backup jobs and AI tools described later, and PostgreSQL is the foundation for several of the specialised stores below — pgvector for embeddings, TimescaleDB for time-series, and PostgREST for an instant REST API over a Postgres database.

5.5Supabase: local stack, hosted projects and Supabase MCP

The Supabase pane works on three levels. Locally, it drives the supabase CLI: choose a project folder, Start the whole stack in Docker (Postgres, Auth, Storage, Realtime, PostgREST, Edge Functions and Studio), copy its service URLs and keys, run migrations, open a SQL console, or register the local database as a Database Ops backup job. For hosted projects, save a Supabase personal access token (Account ▸ Access Tokens) in Supabase — connection. FrontierStack then shows each project's status and runs Supabase's security and performance advisors against it, at most every 30 minutes per project. List project refs to watch only those. Turn on Alert me when this needs attention to be told when a project is unhealthy or a security advisor reports an ERROR-level finding, such as a public table without row-level security.

AI Access (Supabase MCP) connects the AI Administrator to Supabase's official MCP server. The hosted target uses the same token. Enter a project ref to limit it to one project, leave Allow writes off to keep read-only mode (Supabase runs every query as a read-only Postgres user and hides tools that change anything), and tick only the tool groups you want. The local target is the stack's own /mcp endpoint, normally http://127.0.0.1:54321/mcp. Ask things like “which tables in my Supabase project have no RLS?” or “show the last hour of auth errors”. Reads run straight away; migrations, deploys and project changes need Allow changes and always show an approval card. Other MCP clients copies a ready-made config for Claude, Cursor and similar apps, and can add a read-only Supabase entry to MCP Servers.

SecurityA Supabase personal access token reaches every project in your account. It stays in the Keychain, is sent only to Supabase as a header, and is never shown to the AI; tools that return project API keys are refused. Scope the AI to one project and keep read-only mode for anything in production. Rows the AI reads from your tables are data, not instructions.

5.6Redis and other caches

Sessions, queues, rate limits and hot-path caching usually want an in-memory store rather than a relational table. FrontierStack runs the two standards from the Caching catalog: Redis (port 6379), the in-memory key-value store that also backs Redis Streams, and Memcached (port 11211) for a simple distributed cache. Install, start and monitor them like any other service. Most CMS and framework deployments pair Redis with MySQL or PostgreSQL; the Service Catalog (Chapter 6) lists every option.

5.7Vector and analytics databases

Two newer families of store get their own catalog categories. Vector databases hold embeddings for retrieval-augmented generation (RAG) and semantic search; they are how the AI stack (Chapter 15) gives a model access to your own documents. Analytics databases are columnar or time-series engines built for fast aggregation over large datasets rather than transactional reads and writes.

EngineKindPort
MySQL / MariaDBRelational3306
PostgreSQLRelational5432
RedisIn-memory cache / streams6379
MemcachedIn-memory cache11211
QdrantVector (RAG / embeddings)6333
ChromaVector (embeddings)8000
WeaviateVector (hybrid search)8080
MilvusVector (distributed)19530
pgvectorVector (Postgres extension)5432
ClickHouseColumnar OLAP analytics8123
InfluxDBTime-series8086
TimescaleDBTime-series (Postgres ext.)5432
Apache DruidReal-time OLAP8888

For purely in-process vector search there is also FAISS (a library, no port). Pick the engine your framework expects; the panes install and run each one through the same catalog machinery.

Why a vector database?
A vector database stores text as numeric embeddings so you can search by meaning rather than keyword. It is the memory behind RAG: the AI stack embeds your documents, stores the vectors here, and retrieves the most relevant passages to ground a model's answers. pgvector keeps that inside an existing PostgreSQL; Qdrant, Chroma, Weaviate and Milvus are dedicated stores for larger collections.

5.8Data pipelines & ETL

Moving and reshaping data between these stores is its own discipline. The Data Pipelines & ETL catalog category covers it at the overview level: Airbyte and Meltano for extract-load with hundreds of connectors, dbt for SQL-based transformation and modelling, and orchestrators such as Dagster, Prefect and Kestra for scheduling the work. These are full platforms; FrontierStack installs and runs them and surfaces their web UIs, but the pipeline logic lives in each tool. For programmatic data-pipeline DAGs there is also Apache Airflow in the Workflow Orchestration category.

5.9Backups: dumps, the overview pane, and CCC

A database with no tested backup is a future outage. FrontierStack approaches this from two directions. In Database Ops you define a verified dump schedule per server: name, engine (MySQL or PostgreSQL), host, port, user, database (blank = all) and a backup directory. Due jobs run automatically while the app is open, and Run Now triggers one immediately. Each run does more than dump — mysqldump runs with --single-transaction for a consistent InnoDB snapshot, then Verify checks gzip integrity and that the dump ends with its completion marker (catching truncated or half-written files), writes an .md5 sidecar, rotates to your keep count, and rsyncs the result offsite over key-based SSH.

The AI Administrator exposes the same operations as tools: db_dump dumps a database to a .sql file on the target (using mysqldump or pg_dump), and backup_now makes a timestamped tar.gz of configs, a site or a data folder. Both are mutating, so they require approval and changes enabled; for the DB password they reference a $NAME vault secret, never a pasted value.

The Backups overview pane rolls up every mechanism so staleness is obvious at a glance: Time Machine status, Carbon Copy Cloner tasks, app-managed Apache config snapshots, config version history in Git, and scheduled auto-exports. The Carbon Copy Cloner pane reads CCC's tasks and history through its ccc command-line tool and lets you Run a task on demand. Both Time Machine and CCC feed the Alerts engine — a backup that hasn't run within its threshold, or a failed CCC task, raises an alert on your channels (Chapter 11).

The app's own settings are covered as well. The sidebar's pins and hidden services, saved Setups and network Locations are kept in JSON files in the app's support folder rather than only in macOS preferences; every Git snapshot carries them together with a copy of the preferences, and an hourly shadow copy of the preferences means a wiped preferences file is put back automatically at the next launch. Restore App Settings… under Config version history restores them by hand from the latest snapshot.

5.10Restore — and restore safety

Backups exist to be restored, and restore is the dangerous half. The AI's restore tool extracts a .tar.gz archive or imports a .sql dump into a database. Because importing a dump overwrites the live database and extracting an archive overwrites files in place, restore is mutating and potentially destructive: it always requires explicit approval with changes enabled, and SQL imports reference the DB password as a $NAME vault secret.

WarningRestore is destructive. Importing a .sql dump replaces the current contents of the target database, and there is no automatic undo. Before any restore, take a fresh dump of the current state (db_dump or Run Now) so you can roll back, and confirm you are pointed at the right database and the right server — not production by mistake.

5.11Recovering a broken database

Sometimes a database is worse than down — it won't start, or a table is corrupt. FrontierStack gives the AI Administrator (Chapter 13) the same tools you would reach for by hand, behind the usual approval card. mysql_check_tables and pg_check_tables run mysqlcheck / pg_amcheck to find corrupt or crashed tables; with repair on they take a mysqldump/pg_dump backup first, then repair (--auto-repair / REINDEX), so a fix is reversible. mysql_service_control and pg_service_control start, stop, restart or check the server across systemd, launchd, Homebrew or service(8), local or over SSH.

For the hard cases there are guided skills — “Recover Broken MySQL” and “Recover Broken PostgreSQL” — that walk the whole runbook: read the error log, diagnose the fault, dump everything readable, rebuild into a fresh data directory, repair or recreate the damaged tables, and restart — always renaming the old data directory aside as a cold backup, never deleting it, and confirming before every destructive step. On a remote host, the fastest way in is the red Emergency button on the database's row in the server pane: it opens the assistant pre-loaded with the right recovery skill for that host.

WarningDatabase repair, restore and rebuild are irreversible enough that FrontierStack requires a high-end model to run them — a small or on-device model can read the log and diagnose, but the destructive steps are hard-gated to a frontier model (see Chapter 13). And the safety net is the backups above: a rebuild is only as good as the dump it reloads, so keep the scheduled dumps healthy.

5.12ORMs and app-native tooling: Drizzle and Convex

Finally, two tools meet your application where it defines its schema. The Drizzle ORM pane detects a Drizzle project (its tables, migrations and backend dialect) and runs drizzle-kit tasks for you — Generate SQL from your schema, Migrate, Push the schema directly, Pull (introspect) an existing database, and open Drizzle Studio to browse data. The Convex pane manages Convex, a reactive backend with a built-in database: run npx convex dev to watch and push functions, or stand up a self-hosted backend in Docker. Both need Node.js, which the panes will install via Homebrew if it is missing. These cover the application's own data layer; the dumps and backups above still protect whatever they write underneath.

6

Chapter 6

The Service Catalog

Every service FrontierStack can install, run and monitor — by category.

FrontierStack ships a catalog of 1817+ services across 114 categories. Every entry can be discovered, installed, started, configured and monitored from the app — and the AI Administrator can act on any of them. This chapter is the field guide: each category, what lives in it, and a one-line description of every service. Service descriptions are kept in English so they match the labels in the app.

Each service also has its own page on the website at frontierstack.app/services/ with ports, default web UI and the Homebrew formula.

6.1Overview

Local Health

built-in tool

Status Page

built-in tool

Alerts

built-in tool

Sites

built-in tool

Logs

built-in tool

Certificates

built-in tool

Tools

built-in tool

Scripts & Cron

built-in tool

Startup Items

built-in tool

Homebrew

built-in tool

Messaging Gateways

built-in tool

Notifications

built-in tool

Apple Services

built-in tool

Terminal Style

built-in tool

Setups

built-in tool

Paired Devices

built-in tool

Licences

built-in tool

Settings

built-in tool

6.2Setup & Migration

Migrate Setups

built-in tool

Apple Server Migration

built-in tool

Site Transfer

built-in tool

Install Wizard

built-in tool

6.3Locations & Places

Locations

built-in tool

Places

built-in tool

Device Discovery

built-in tool

Data Map

built-in tool

NAVER Maps API (네이버 지도)

Naver map, geocoding & directions APIs (via NAVER Cloud) (web UI)

Kakao Maps & Local API (카카오맵 / 로컬)

Kakao map SDK + Local address / keyword search API (web UI)

TMAP API (T map, TMAP Mobility / SK open API)

TMAP routing, geocoding & POI APIs (SK) (web UI)

VWorld (브이월드, 국토교통부 공간정보 오픈플랫폼)

Korean government spatial data & base maps (MOLIT) (web UI)

Juso road-name address API (도로명주소 API, 행정안전부)

Official Korean road-name address search API (web UI)

6.4Fleet & Remote

Remote Tools

built-in tool

Fleet Run

built-in tool

Remote KVM

built-in tool

GL.iNet KVM

built-in tool

Git Server

built-in tool

Remote Control & Lock

built-in tool

Server Clone

built-in tool

Headless Setup

built-in tool

Print Production

built-in tool

Screens

Polished VNC client for Mac & iOS (Edovia)

Cockpit

Browser console for Linux servers and Raspberry Pi (port 9090, web UI)

Windows Admin Center

Browser-based management for Windows Server fleets (port 443, web UI)

PiKVM

Open-source KVM-over-IP (Raspberry Pi) (port 443, web UI)

JetKVM

Compact, low-cost KVM-over-IP device (port 80, web UI)

TinyPilot

KVM-over-IP appliance (web UI) (port 443, web UI)

NanoKVM

Sipeed open KVM-over-IP (RISC-V) (port 80, web UI)

GL.iNet Comet (GL-RM1)

Compact KVM-over-IP with a browser console (port 80, web UI)

GL.iNet Comet Pro (GL-RM10)

KVM-over-IP with a built-in smart power plug (port 80, web UI)

Raritan Dominion KX

Enterprise KVM-over-IP switch (web UI) (port 443, web UI)

ATEN KVM over IP

KVM-over-IP switches & dongles (web UI) (port 443, web UI)

Jump Desktop

Fast, secure remote desktop (RDP/VNC/Fluid)

RustDesk

Open-source remote desktop with optional self-host relay (port 21115, web UI)

MeshCentral

Self-hosted web RMM and remote control (port 443, web UI)

Apache Guacamole

Clientless RDP, VNC and SSH gateway (port 8080, web UI)

Windows Remote Desktop

RDP access to Windows machines (port 3389)

WinRM / PowerShell Remoting

Remote command channel for Windows servers (port 5986)

Tactical RMM

Open-source RMM for Windows-focused fleets (port 443, web UI)

AnyDesk

Cross-platform remote desktop

ServerBuddy

Native Mac console for Linux servers

ITmanager.net

Mobile and desktop server administration service (web UI)

CloudRay

Hosted Bash automation, scheduling and fleet execution (web UI)

CtrlOps

Local-first AI, SSH and Linux server management

Level RMM

Browser RMM with peer-to-peer remote access (web UI)

6.5Networking

Traffic

built-in tool

Router & Network

built-in tool

Power over Ethernet

built-in tool

Mellanox Networking

built-in tool

UniFi

built-in tool

SFTP

built-in tool

WebDAV

built-in tool

Time Capsule

built-in tool

Internet Health

built-in tool

Service Scan

built-in tool

Wi-Fi Analyser

built-in tool

BIND 9 (named)

Authoritative/recursive DNS server (port 53)

netboot.xyz

Network-boot OS installers via PXE/iPXE (port 3000, web UI)

mosh

Roaming, lag-tolerant remote shell (SSH bootstrap + UDP)

SSH3

SSH over QUIC/HTTP3 — faster handshakes, hidden behind a secret URL

Zeroconf / Bonjour

Zero-configuration service discovery (mDNS/DNS-SD) (port 5353)

6.6VPN

VPN

built-in tool

ZeroTier Controller

built-in tool

Tailnet

built-in tool

ZeroTier

Zero Trust SD-WAN / virtual networks — agent + API

NetBird

Open-source Zero Trust networking (self-hostable)

Twingate

Zero Trust remote access (VPN replacement)

CloudConnexa

OpenVPN's cloud-delivered VPN / ZTNA (formerly OpenVPN Cloud) (web UI)

Netmaker

Fast WireGuard mesh networks (self-hosted)

WireGuard

Modern, fast VPN — host your own, or the mesh base layer (port 51820)

OpenVPN

The classic open-source SSL/TLS VPN (port 1194)

Intego Privacy Protection (VPN)

Intego's commercial VPN — a Private Internet Access-based client for Mac

Proton VPN

Privacy VPN (WireGuard/OpenVPN, Secure Core, kill switch)

Headscale

Self-hosted Tailscale control server (open-source) (port 8080, brew: headscale)

Nebula

Lightweight overlay mesh (Slack/Defined Networking)

OpenZiti

Zero-trust overlay fabric with SDKs (self-hosted)

Firezone

WireGuard-based zero-trust access gateway

tinc

Classic self-routing mesh VPN (open-source)

n2n

Peer-to-peer layer-2 VPN over a supernode (ntop)

innernet

WireGuard mesh with CIDR-based access (tonari)

strongSwan

IKEv2/IPsec VPN server (port 500)

wg-easy

WireGuard VPN with a simple web UI (port 51821, web UI)

TP-Link LightLink VPN

TP-Link remote-access VPN — managed via the Navi Desktop app

Tailscale

WireGuard mesh VPN (brew: tailscale)

Tunnelblick

Free OpenVPN client for macOS

6.7Routers & Firewalls

macOS Firewall

built-in tool

OPNsense

Open-source firewall/router OS (REST API) (port 443, web UI)

pfSense

FreeBSD firewall/router OS (REST via package) (port 443, web UI)

PoE Switch (RFC 3621)

Managed PoE switch — port power, budget & cycling over SNMP (port 161, web UI)

MikroTik (RouterOS)

RouterOS devices — REST API (v7+) (port 443, web UI)

UniFi

Ubiquiti Cloud Gateway / Dream Machine + Network controller (port 443, web UI)

UniFi OS Server

Self-hosted UniFi OS — run the full stack on your own Mac or Linux box (port 11443, web UI)

NVIDIA Spectrum (Onyx)

Mellanox/NVIDIA Spectrum Ethernet switches on Onyx — ports, power, fans, temperature (port 443, web UI)

NVIDIA Cumulus Linux

Spectrum switches on Cumulus Linux 5.x — NVUE REST API (port 8765)

NVIDIA Quantum InfiniBand (MLNX-OS)

Quantum / SwitchX InfiniBand switches — ports, subnet manager, hardware (port 443, web UI)

NVIDIA UFM

Unified Fabric Manager — InfiniBand fabric alarms and switch health (port 443, web UI)

NVIDIA BlueField DPU

BlueField-2/3 DPUs — BMC health, power, temperatures, firmware (port 443)

NVIDIA ConnectX NICs

Mellanox/NVIDIA ConnectX adapters in Linux servers — link, firmware, health (port 22)

Peplink

SD-WAN routers with multi-WAN failover/bonding (port 443, web UI)

Cradlepoint

Cellular/5G edge routers (NCOS + NetCloud) (port 443, web UI)

OpenWrt

Open-source router firmware (LuCI / ubus) (port 80, web UI)

Firewalla

Home/SMB security router (cloud MSP API)

IPFire

Hardened open-source Linux firewall (web UI) (port 444, web UI)

VyOS

Linux network OS — unified CLI + HTTPS API (port 443, web UI)

Untangle / Arista NG Firewall

Debian network gateway — web admin (commercial) (port 443, web UI)

Sophos Firewall

Next-gen firewall appliance — web UI + API (commercial) (port 4444, web UI)

FortiGate

Fortinet next-gen firewall — REST API (commercial) (port 443, web UI)

Palo Alto Networks

PAN-OS next-gen firewall — XML/REST API (commercial) (port 443, web UI)

Cisco Secure Firewall

Cisco NGFW (Firepower/ASA) — FMC/FDM API (commercial) (port 443, web UI)

WatchGuard Firebox

Fireware firewall appliance — web UI + Cloud API (commercial) (port 8080, web UI)

UFW (Uncomplicated Firewall)

Easy iptables/nftables host firewall for Linux servers (manage over SSH)

6.8Web Servers

Apache

built-in tool

Nginx

built-in tool

Vercel

built-in tool

Railway

built-in tool

Vite

built-in tool

Localhost

built-in tool

Caddy

Automatic-HTTPS web server / reverse proxy (port 80, brew: caddy)

Laravel Herd

One-click PHP dev environment (Mac app) (port 80)

Apache Tomcat

Java servlet/JSP application server (port 8080, web UI, brew: tomcat)

Puma

Threaded Rack/HTTP server — the default app server for Rails (port 3000)

Microsoft IIS

Windows web server and application platform (port 80, web UI)

OpenLiteSpeed

High-performance web server with web admin UI (port 7080, web UI)

Angular CLI

Scaffold, serve & build Angular apps (port 4200, web UI)

6.9DNS

Dynamic DNS

built-in tool

DNS

built-in tool

Domain Registrars

built-in tool

AdGuard Home

Network-wide ad/tracker-blocking DNS (self-hosted) (port 3000, web UI)

Pi-hole

Network-wide ad/tracker-blocking DNS sinkhole (port 80, web UI)

Nebula Sync

Sync configuration across Pi-hole instances

Kea DHCP

ISC's modern DHCPv4/DHCPv6 server (REST + DB back-ends) (port 8000)

ISC DHCP

Classic ISC dhcpd (EOL — migrate to Kea)

Dnsmasq

Lightweight DNS forwarder + DHCP + TFTP (port 53, brew: dnsmasq)

udhcpd (BusyBox)

Tiny DHCP server (BusyBox / embedded)

DNSimple

Managed DNS + domain registrar — live zone/record management (web UI)

Infoblox NIOS (DDI)

Enterprise DNS / DHCP / IPAM appliance (DDI) (port 443, web UI)

Windows Server DHCP

DHCP Server role on Windows Server

NHN Cloud DNS Plus

NHN Cloud anycast authoritative DNS + GSLB (web UI)

DNSEver (디엔에스에버)

Korean managed, free and dynamic DNS hosting (web UI)

DNSZi (DNS지기)

Free Korean DNS hosting (nsN.dnszi.com) (web UI)

6.10Runtimes

Runtime Health

built-in tool

PHP

built-in tool

Python

built-in tool

Node.js

built-in tool

React

built-in tool

Java

built-in tool

Go

built-in tool

Rust

built-in tool

Ruby

built-in tool

Perl

built-in tool

.NET

built-in tool

Supabase Edge Functions

Deno serverless functions on the edge (port 54321)

code-server

VS Code in the browser (self-hosted) (port 8080, web UI, brew: code-server)

Next.js

React framework served by a Node process (SSR/SSG) (port 3000)

SvelteKit (Svelte)

Svelte app framework served by a Node process (SSR/SSG) (port 3000)

Nuxt (Vue)

Vue framework served by a Node process (SSR/SSG) (port 3000)

Astro

Content-first framework — zero JS by default; popular headless-WordPress front end (port 4321)

Solid (SolidJS)

Fine-grained reactive UI framework — SolidStart serves it as a Node process (port 3000)

Tailwind CSS

Utility-first CSS — standalone build CLI (no Node)

.NET (ASP.NET Core)

Run ASP.NET Core & Blazor apps (Kestrel) (port 5000)

Wasmtime

Bytecode Alliance WebAssembly runtime (WASI)

Wasmer

WebAssembly runtime with a package registry

WasmEdge

Lightweight WASM runtime for cloud/edge & AI (CNCF)

wasmCloud

Distributed WebAssembly platform (CNCF) (port 4222, web UI)

Fermyon Spin

Serverless WebAssembly apps & HTTP microservices (port 3000)

6.11Databases

Database Health

built-in tool

MySQL

built-in tool

MySQL Clusters

built-in tool

Postgres

built-in tool

Database Ops

built-in tool

Cloud SQL

built-in tool

Drizzle ORM

built-in tool

Prisma

built-in tool

Airtable

built-in tool

Convex

built-in tool

Supabase

built-in tool

MongoDB

Document (NoSQL) database (port 27017, brew: mongodb-community)

Microsoft SQL Server

Microsoft relational database for Windows and Linux (port 1433)

Oracle Database

Enterprise relational database (port 1521, web UI)

CockroachDB

Distributed SQL database (port 26257, web UI)

Apache Cassandra

Distributed wide-column database (port 9042, brew: cassandra)

ScyllaDB

High-performance Cassandra-compatible database (port 9042)

Neo4j

Graph database with Cypher query language (port 7474, web UI, brew: neo4j)

Apache CouchDB

Document database with HTTP API and sync (port 5984, web UI, brew: couchdb)

Couchbase Server

Distributed document, key-value and search database (port 8091, web UI)

PlanetScale

Hosted MySQL with database branching (cloud API) (port 3306)

Neon

Serverless Postgres — autoscaling & branching (cloud API) (port 5432)

Turso

Distributed SQLite (libSQL) at the edge (cloud API) (port 8080)

PostgREST

Instant REST API over a PostgreSQL database (port 3000)

PocketBase

Open-source backend in one file (SQLite + auth + realtime) (port 8090, web UI)

Firebase

Google's backend-as-a-service — Firestore, Auth, Storage, Functions (cloud) (port 4000, web UI)

Patroni

HA PostgreSQL — automatic failover (port 8008, web UI)

6.12Vector Databases

Vector Databases

built-in tool

Qdrant

Fast vector DB for embeddings & RAG (self-hosted) (port 6333, web UI)

Chroma

Developer-friendly embedding database (self-hosted) (port 8000)

Weaviate

Vector DB with built-in vectorizers & hybrid search (self-hosted) (port 8080)

Milvus

Scalable, distributed vector database (self-hosted) (port 19530)

pgvector

Vector search inside PostgreSQL (extension) (port 5432)

FAISS

Fast in-process vector similarity search (library)

6.13Analytics Databases

InfluxDB

Time-series database for metrics and IoT (port 8086, web UI, brew: influxdb)

DuckDB

In-process OLAP database — the SQLite of analytics

ClickHouse

Columnar OLAP database for fast analytics (port 8123)

Apache Druid

Real-time analytics database (OLAP) (port 8888, web UI)

TimescaleDB

Time-series database (PostgreSQL extension) (port 5432)

6.14Data Pipelines & ETL

Airbyte

Open-source ELT with 300+ connectors (self-hosted / cloud) (port 8000, web UI)

Meltano

Open-source ELT built on Singer taps & targets (CLI) (port 5000, web UI)

dbt

SQL-based data transformation & modeling (self-hosted / cloud) (port 8080, web UI)

Dagster

Asset-oriented data orchestrator (self-hosted / cloud) (port 3000, web UI)

Prefect

Modern Python workflow orchestration (self-hosted / cloud) (port 4200, web UI)

Kestra

Event-driven orchestration & scheduling, YAML flows (self-hosted) (port 8080, web UI)

Redpanda Connect (Benthos)

Declarative stream-processing & connectors (self-hosted CLI) (port 4195)

NATS JetStream Pipelines

Persistent streams & consumers for event pipelines (self-hosted) (port 8222, brew: nats-server)

6.15Caching

Redis

In-memory key-value store (port 6379, brew: redis)

Memcached

Distributed memory cache (port 11211, brew: memcached)

Elasticsearch

Search & analytics engine (Elastic) (port 9200, web UI, brew: elasticsearch-full)

Meilisearch

Fast, typo-tolerant search engine (port 7700, web UI, brew: meilisearch)

OpenSearch

Search & analytics engine (port 9200, web UI, brew: opensearch)

Photon

Self-hosted OpenStreetMap geocoder (search-as-you-type) (port 2322)

6.17Backup

Backups

built-in tool

Time Machine

built-in tool

Carbon Copy Cloner

built-in tool

Synology Active Backup for Business

Centralized backup for PCs, servers, VMs & SaaS (Synology) (port 5001, web UI)

Databasus

Self-hosted database backup & point-in-time recovery (web UI)

Restic

Fast, encrypted, deduplicated backups

rclone

Sync & mount 70+ cloud storages

Dropbox (Backup Target)

Use Dropbox as an encrypted off-site backup destination (restic / rclone)

Veeam Backup & Replication

Enterprise VM, server and cloud backup (port 9419, web UI)

Veeam Backup for Microsoft 365

Exchange, SharePoint, OneDrive and Teams backup (live job health) (port 4443)

Veeam Service Provider Console

Multi-site / MSP Veeam management (live job health) (port 1280, web UI)

BorgBackup

Deduplicating encrypted backups over SSH

Kopia

Encrypted snapshots to cloud or local storage (port 51515, web UI)

Duplicati

Web UI backups to cloud storage (port 8200, web UI)

6.18Storage & NAS

iCloud+

built-in tool

Xsan

built-in tool

Supabase Storage

S3-compatible object storage from Supabase (port 54321, web UI)

Nextcloud

Files, sync, office & app platform (port 80, web UI)

Syncthing

Peer-to-peer continuous file sync (port 8384, web UI, brew: syncthing)

TrueNAS

ZFS NAS OS — pools, snapshots, replication (self-hosted) (port 443, web UI)

UrBackup

Client/server network backup — file + image backups to your NAS (self-hosted) (port 55414, web UI)

ZimaOS / CasaOS

Personal-cloud NAS OS for ZimaCube / ZimaBoard (self-hosted) (port 80, web UI)

Synology DSM

Synology NAS appliance (DSM) (port 5001, web UI)

QNAP QTS

QNAP NAS appliance (QTS/QuTS hero) (port 8080, web UI)

UGREEN NAS

UGREEN NASync / UGOS Pro appliance health, storage, containers, services and logs through a linked remote helper (port 443, web UI)

Beelink NAS

Beelink ME mini / ME Pro NAS hardware (Windows, TrueNAS, Unraid, OMV, Proxmox)

Minisforum NAS

Minisforum N5 / N5 Air / N5 Pro / N5 Max NAS hardware (MinisCloud OS, TrueNAS, Unraid, Proxmox)

Ceph

Distributed object/block/file storage cluster (self-hosted) (port 8443, web UI)

GlusterFS

Scale-out network filesystem (self-hosted)

iSCSI (SAN)

Block storage over TCP/IP — initiator & target (port 3260) (port 3260)

NVMe / NVMe-oF

NVMe SSDs & NVMe-over-Fabrics targets (TCP/RDMA/FC) (port 4420)

Fibre Channel (SAN)

FC SAN fabric — HBA ports, WWNs, multipath

RDMA / RoCE / iWARP

Remote Direct Memory Access fabrics — RoCE & iWARP

InfiniBand Fabric

InfiniBand HCA/fabric — ports, SM, port-error counters

NVIDIA NVLink

GPU-to-GPU interconnect — per-link state & bandwidth

NVIDIA NVSwitch

NVLink switch fabric — Fabric Manager service

Liqid (Composable)

Composable PCIe/CXL fabric — pool & attach GPUs/NVMe (web UI)

GigaIO FabreX

PCIe/CXL memory fabric — composable GPU pooling (web UI)

WEKA

Parallel filesystem for AI/HPC (GPUDirect) (port 14000, web UI)

ownCloud

Self-hosted file sync & share (port 80, web UI)

Seafile

File sync & share with client-side encryption (self-hosted) (port 8000, web UI)

Resilio Sync

P2P file sync (BitTorrent-based) (port 8888, web UI)

Dropbox

Cloud file sync & share (app + API) (web UI)

Samba

SMB file sharing (+ Time Machine) (port 445, brew: samba)

Netatalk

AFP file sharing for legacy Macs and Xserve estates (port 548)

File Browser

Web file manager for a directory (port 8080, web UI)

Filestash

Web file manager for S3/SFTP/FTP/WebDAV/… (port 8334, web UI)

Unraid

NAS/server OS — storage array, VMs & Docker (port 80, web UI)

Box

Secure content, collaboration and governed agent workflows (SaaS) (web UI)

6.19Object Storage & S3-Compatible

MinIO

S3-compatible object storage (port 9000, web UI, brew: minio)

SeaweedFS

Fast distributed object/file store (self-hosted) (port 8888, web UI)

Garage

Lightweight self-hosted S3 object store (Deuxfleurs) (port 3900)

Ceph RGW (RADOS Gateway)

S3/Swift object gateway on a Ceph cluster (self-hosted) (port 7480)

OpenStack Swift

Highly-available object store (OpenStack, self-hosted) (port 8080)

Cloudflare R2

S3-compatible object storage with zero egress fees (cloud) (web UI)

Backblaze B2

Low-cost cloud object storage, S3-compatible (cloud) (web UI)

Wasabi

Hot cloud object storage, S3-compatible, no egress fees (cloud) (web UI)

RustFS

High-performance S3-compatible object storage (Rust) (port 9000, web UI)

6.20Mail

Mail Server

built-in tool

Message Delivery

built-in tool

Proton

Encrypted mail, VPN, drive & passwords (cloud) (port 1025, web UI)

HEY

37signals hosted email & calendar (Imbox, Screener, Paper Trail) (web UI)

Rspamd

Fast spam-filtering system (self-hosted) (port 11334, web UI)

Apache SpamAssassin

Rule-based spam classifier (self-hosted) (port 783)

MailScanner

Email security framework / gateway (self-hosted)

Proxmox Mail Gateway

Anti-spam/AV email gateway appliance (self-hosted) (port 8006, web UI)

mailcow

Dockerized full mail-server suite (self-hosted) (port 443, web UI)

Modoboa

Mail hosting & management platform (self-hosted) (port 443, web UI)

OpenDKIM

DKIM signing & verification milter (self-hosted) (port 8891)

OpenDMARC

DMARC policy filter & reporting (self-hosted) (port 8893)

Postfix

SMTP mail transfer agent (port 25)

Dovecot

IMAP/POP3 mail delivery server (port 143)

Stalwart Mail Server

All-in-one secure mail server (SMTP/IMAP/JMAP) (port 8080, web UI)

Maddy Mail Server

Composable single-binary mail server (SMTP/IMAP)

Inbox Zero

Open-source AI email assistant (self-hosted) (port 3000, web UI)

Hiworks (하이웍스, Gabia)

Gabia groupware — mail, approvals, SMS, HR (web UI)

Mailplug (메일플러그)

Korean business email hosting (web UI)

6.21Mailing Lists

Mailing Lists

built-in tool

Mailchimp

Hosted email marketing & audiences (cloud) (web UI)

Brevo

Email/SMS marketing + transactional (cloud) (web UI)

Loops

Email for SaaS — marketing, loops & transactional (cloud) (web UI)

MailerLite

Simple newsletter & subscriber lists (cloud) (web UI)

Klaviyo

E-commerce email/SMS & segmentation (cloud) (web UI)

Campaign Monitor

Designer-friendly email campaigns (cloud) (web UI)

Mailgun

Developer transactional email + lists (cloud) (web UI)

SendGrid

Twilio's email API & marketing lists (cloud) (web UI)

Amazon SES

AWS low-cost bulk/transactional email (cloud) (web UI)

Postmark

Fast, reliable transactional email (cloud) (web UI)

Resend

Developer-first transactional email API (cloud) (web UI)

MailPace

Fast, privacy-friendly transactional email (cloud) (web UI)

Nylas

Email/calendar/contacts API platform (cloud) (web UI)

Listmonk

Self-hosted high-performance newsletter manager (port 9000, web UI)

Mautic

Self-hosted marketing automation (port 80, web UI)

Mailtrain

Self-hosted Node.js newsletter app (port 3000, web UI)

Postal

Self-hosted full mail/delivery platform (port 5000, web UI)

NHN Cloud Notification — Email

NHN Cloud transactional email (web UI)

Stibee (스티비)

Korean email newsletter platform (web UI)

6.22Email Deliverability & Reputation

Email Delivery

built-in tool

DMARC Reports

built-in tool

DMARC Aggregate Reporting

Collect & parse DMARC RUA reports (self-hosted: parsedmarc)

BIMI

Brand logo in the inbox via DNS + VMC (standard)

MTA-STS & TLS-RPT

Enforce SMTP TLS and get TLS failure reports (standard)

GlockApps

Inbox-placement & spam-filter testing (cloud) (web UI)

MXToolbox

DNS, blacklist & email health lookups (cloud) (web UI)

Google Postmaster Tools

Gmail sender reputation & spam-rate data (cloud) (web UI)

Mailhardener

All-in-one email-security monitoring & reporting (cloud) (web UI)

EasyDMARC

DMARC management & deliverability platform (cloud) (web UI)

dmarcian

DMARC reporting & deployment platform (cloud) (web UI)

Suped

DMARC, SPF and DKIM monitoring with a free plan (cloud) (web UI)

6.23Message Queues & Streaming

Queue Operations

built-in tool

Supabase Realtime

Postgres change streams over WebSockets (port 54321, web UI)

NATS

High-performance messaging + JetStream (self-hosted) (port 4222, brew: nats-server)

Apache Kafka

Distributed event streaming (self-hosted) (port 9092, brew: kafka)

AKHQ

Web administration and observability console for Kafka (port 8080, web UI)

Apache ZooKeeper

Distributed coordination, quorum and leader election (port 2181, brew: zookeeper)

Redpanda

Kafka-compatible streaming, no JVM/ZooKeeper (port 9092)

Apache Pulsar

Distributed pub-sub & queuing with tiered storage (port 6650)

Apache RocketMQ

Low-latency distributed messaging (ordered, transactional) (port 10911)

Redis Streams

Lightweight log/stream with consumer groups (Redis) (port 6379, brew: redis)

Celery

Distributed task queue for Python (workers + broker) (web UI)

RabbitMQ

AMQP message broker with queue monitoring and optional MQTT (port 5672, web UI, brew: rabbitmq)

6.24Push Services

APNs

built-in tool

ntfy

Self-hostable pub-sub push (HTTP) (port 80, web UI, brew: ntfy)

Gotify

Self-hosted push server + Android app (port 80, web UI)

OneSignal

Hosted multi-channel push (cloud) (web UI)

Firebase (FCM)

Google's cross-platform push (cloud) (web UI)

Airship

Enterprise customer-engagement push (cloud) (web UI)

Matrix Notifications

Push via the Matrix chat protocol (web UI)

Synapse

Self-hosted Matrix homeserver (port 8008, brew: matrix-synapse)

Element

Flagship Matrix chat client

UnifiedPush

Open push standard (Google-free) (web UI)

PushDeer

Open-source, no-app-fuss push (web UI)

Pushover

Simple paid push to iOS/Android/desktop (web UI)

Apprise

One CLI/library → 80+ push services

NHN Cloud Notification — Push

NHN Cloud mobile push notifications (web UI)

6.25Chat & Collaboration

Discord

Community chat & voice (cloud) (web UI)

Slack

Team chat & workflows (cloud) (web UI)

Buzz

Group chat for humans + AI agents (Block; cloud or self-hosted) (web UI)

Matrix (Synapse + Element)

Open, federated chat — self-hosted (Docker) (port 8008, web UI)

Mattermost

Open-source Slack alternative (self-hosted) (port 8065, web UI)

Rocket.Chat

Open-source team chat platform (self-hosted) (port 3000, web UI)

Zulip

Threaded team chat (self-hosted or cloud) (port 80, web UI)

Ergo (IRCd)

Modern single-binary IRC server (IRCv3, built-in services) (port 6667)

InspIRCd

Modular C++ IRC server (self-hosted) (port 6667)

UnrealIRCd

Popular full-featured IRC server (self-hosted) (port 6667)

Solanum (IRCd)

The IRCd that runs Libera.Chat (charybdis fork) (port 6667)

ZNC (IRC bouncer)

IRC bouncer — stay connected, replay history (port 6697, web UI)

The Lounge

Self-hosted web IRC client (always-on) (port 9000, web UI)

KiwiIRC

Web IRC client + gateway (self-hosted) (port 7778, web UI)

Atheme (IRC services)

NickServ/ChanServ services for TS6 IRCds

Anope (IRC services)

IRC services (NickServ/ChanServ) for many IRCds

Libera.Chat

Public IRC network (FOSS communities) — connect, not self-host (port 6697)

Open OSCAR Server

Self-hostable AIM/ICQ (OSCAR) server — run your own AIM (port 5190)

AIM OSCAR Server

Alternative OSCAR server — make your own AIM chat network (port 5190)

Telegram

Cloud messaging with a powerful Bot API (cloud) (web UI)

TeamSpeak

Low-latency voice server (self-hosted) (port 9987)

Mumble

Open-source low-latency voice (self-hosted) (port 64738)

Jitsi Meet

Open-source video conferencing (self-hosted) (port 8443, web UI)

SimpleX Chat

Private messenger with no user IDs (self-hostable relays)

Session

Onion-routed private messenger (no phone number)

Prosody

Lightweight XMPP (Messages) server (port 5222, brew: prosody)

Sendbird

Chat, voice & video APIs for apps (Korean-founded) (web UI)

NAVER WORKS / LINE WORKS (네이버웍스)

Business messenger & groupware (LINE WORKS in Japan) (web UI)

NHN Dooray! (두레이)

NHN collaboration — projects, mail, messenger (web UI)

JANDI (잔디)

Korean team messenger (incoming webhooks) (web UI)

Flow (플로우)

Korean project & team collaboration (web UI)

Swit (스윗)

Korean-founded chat + task collaboration (web UI)

KakaoWork (카카오워크)

Kakao business messenger with bot API (web UI)

6.26SMS & iMessage Gateways

Gammu (gammu-smsd)

Send/receive SMS via a GSM modem (self-hosted)

Kannel

Open-source SMS/WAP gateway (self-hosted) (port 13013)

ModemManager

Linux modem daemon — SMS via mmcli (self-hosted)

SMS Gateway for Android

Turn an Android phone into an SMS HTTP API (self-hosted) (web UI)

SMSSync

Android SMS↔webhook relay (self-hosted)

Android + Tasker

DIY SMS gateway via Tasker automation (self-hosted)

Home Assistant SMS

SMS notify/receive in Home Assistant (Gammu)

AirMessage

Self-hosted iMessage bridge — server on this Mac (port 1359)

BlueBubbles

Self-hosted iMessage bridge — server on this Mac (web UI)

Aligo (알리고)

Korean SMS / LMS / MMS + KakaoTalk sending API (web UI)

NHN Cloud Notification — SMS

NHN Cloud SMS / LMS sending (web UI)

Bizppurio (비즈뿌리오)

Daou Tech business SMS & KakaoTalk API (web UI)

Ppurio (뿌리오)

Daou Tech SMS / KakaoTalk sending (web UI)

Munjanara (문자나라)

Legacy Korean SMS sending (plain-HTTP API) (web UI)

SureM (슈어엠)

Korean SMS & KakaoTalk sending (SureM) (web UI)

Solapi (솔라피, CoolSMS)

Korean SMS / LMS / MMS + KakaoTalk sending API (web UI)

6.27Business Messaging

KakaoTalk AlimTalk

Kakao business notification templates — Korea (cloud) (web UI)

LINE Official Account

Customer messaging & loyalty on LINE (web UI)

WhatsApp Business Platform

WhatsApp business messaging — templates, catalogues (live) (web UI)

WeChat Official Account

WeChat business account — China (broadcasts, menus, mini-programs) (web UI)

Zalo Official Account

Zalo business account — Vietnam (broadcasts & chat) (web UI)

KakaoTalk Channel

Kakao business channel — Korea (friend broadcasts & chat) (web UI)

Viber Business Messages

Branded business messages on Viber (web UI)

Facebook Messenger

Messenger business messaging (Meta) (web UI)

Instagram Messaging

Instagram DM API for business (Meta) (web UI)

Apple Messages for Business

Store↔customer chat inside iMessage (web UI)

RCS Business Messaging

Branded rich business messaging (SMS successor) (web UI)

Attentive

SMS & email marketing for retail/DTC (web UI)

Postscript

SMS marketing for Shopify stores (web UI)

Omnisend

Email & SMS marketing automation (e-commerce) (web UI)

SimpleTexting

Business SMS/MMS marketing & two-way texting (web UI)

ManyChat

Chat marketing bots — Instagram/Messenger/WhatsApp (live) (web UI)

Respond.io

Omnichannel customer-conversation inbox (web UI)

Gupshup

Conversational messaging API (WhatsApp & more) (web UI)

WATI

WhatsApp Business team inbox & broadcasts (web UI)

Charles

Conversational commerce on WhatsApp (web UI)

Trengo

Multichannel team inbox for customer chat (web UI)

Intercom

Customer messaging & proactive marketing (live) (web UI)

Gorgias

E-commerce helpdesk with chat & proactive messages (web UI)

NHN Cloud Notification — KakaoTalk Bizmessage

NHN Cloud KakaoTalk AlimTalk / FriendTalk (web UI)

BizM (비즈엠)

KakaoTalk AlimTalk / FriendTalk sending (BizM) (web UI)

Lunasoft / Luna M (루나소프트)

KakaoTalk business messaging (Luna M) (web UI)

BizGo by Infobank (비즈고 / 인포뱅크 OMNI)

Infobank SMS, AlimTalk, RCS & Naver TalkTalk API (web UI)

6.28Calendars

Calendar Discovery

built-in tool

Calendar Health

built-in tool

Event Server Monitoring

built-in tool

ICS Feeds

built-in tool

Radicale

Lightweight CalDAV/CardDAV server (port 5232, web UI)

Baïkal

PHP CalDAV/CardDAV server (SabreDAV) (port 80, web UI)

Nextcloud Calendar

Calendar app on a Nextcloud server (web UI)

DAViCal

PHP/PostgreSQL CalDAV server (port 80, web UI)

SOGo

Groupware (CalDAV/CardDAV/ActiveSync) (port 20000, web UI)

Apple Calendar Server

Migrate the old macOS Server CalDAV (port 8443)

Google Calendar

Hosted calendar (CalDAV / API) (web UI)

Outlook Calendar

Microsoft 365 calendar (Graph API) (web UI)

Calendly

Hosted scheduling / booking links (web UI)

Cal.com

Open-source scheduling (self-hostable) (web UI)

6.29Identity & Accounts

Accounts

built-in tool

Open Directory

Apple's built-in LDAP / Kerberos directory (port 389)

Dropbox Business

Team management & audit-log APIs for Dropbox Business (cloud) (web UI)

Keycloak

Open-source identity & access management (SSO) (port 8080, web UI)

FreeIPA

Open-source identity management (LDAP/Kerberos, self-hosted) (port 443, web UI)

Authentik

Self-hosted identity provider (Docker) (port 9000, web UI)

Okta

Workforce identity & SSO — live API health (web UI)

Microsoft Entra ID

Azure AD — cloud identity & SSO (live tenant health) (web UI)

Google Workspace

Google's identity & productivity suite (Admin SDK) (web UI)

Active Directory

On-premises AD DS — domain controller health (live) (port 389)

AD FS

Active Directory Federation Services (on-prem SSO)

Authenticate.com

Identity verification & KYC API (cloud) (web UI)

Univention Corporate Server

Open IAM, SSO, directory and application platform (port 443, web UI)

6.30Customer Identity

WorkOS

B2B auth — SSO, Directory Sync, AuthKit (live) (web UI)

Auth0

Hosted authentication platform (Okta) (web UI)

Clerk

Hosted auth & user management for web apps (cloud) (web UI)

Supabase Auth

Auth from the Supabase stack (cloud or local) (port 54321, web UI)

Better Auth

Framework-agnostic auth library for TypeScript apps

FusionAuth

Self-hostable CIAM / auth server (OAuth2/OIDC/SAML) (port 9011, web UI)

Ory Kratos

Headless identity & user management (self-hosted) (port 4433)

Ory Hydra

OAuth2 & OpenID Connect provider (self-hosted) (port 4444)

Zitadel

Self-hostable identity platform (OIDC/SAML, multi-tenant) (port 8080, web UI)

Authelia

SSO + 2FA auth gateway for your services (port 9091, web UI)

NAVER Login (네이버 로그인)

Sign in with Naver (OAuth 2.0) (web UI)

Kakao Login (카카오 로그인)

Sign in with Kakao (OAuth 2.0) (web UI)

6.31Decentralized Identity

Hyperledger Aries (ACA-Py)

Issue/verify Verifiable Credentials over DIDComm (self-hosted)

walt.id

Open-source SSI stack — issuer, verifier & identity wallet (web UI)

Veramo

JS/TS framework for DIDs & Verifiable Credentials

6.32Version Control

Git

built-in tool

Gitea

Lightweight self-hosted Git service (port 3000, web UI, brew: gitea)

Forgejo

Community fork of Gitea (Codeberg) (port 3000, web UI, brew: forgejo)

GitHub

Live account, repository, PR/review/issue, notification, API quota and recent release-asset download dashboard (cloud) (web UI)

Cursor Origin (Early Beta)

Cursor's Git forge — live repositories and pull requests (cloud, Early Beta) (web UI)

GitLab

Full DevOps platform — GitLab.com, Dedicated or self-managed (Linux, Docker, Kubernetes, GET) (port 443, web UI)

GitHub Enterprise

Self-hosted / managed GitHub for organizations (port 443, web UI)

Bitbucket

Atlassian Git hosting — Cloud or self-hosted (Data Center) (port 443, web UI)

Codeberg

Free community Git hosting (Forgejo, nonprofit) (port 443, web UI)

SourceHut

Lightweight, email-driven Git suite (cloud or self-hosted) (port 443, web UI)

AWS CodeCommit

Managed private Git repositories on AWS (API) (port 443, web UI)

Pierre

Fast code review & collaboration on Git (cloud) (web UI)

Graphite

Stacked-PR code review on top of GitHub (cloud + CLI) (web UI)

Phabricator / Phorge

Self-hosted code review & repos (now maintained as Phorge) (port 443, web UI)

SourceForge

Open-source project hosting & downloads (cloud) (port 443, web UI)

Google Code (archive)

Defunct — read-only archive for migrating old projects (web UI)

Subversion (SVN)

Apache Subversion — centralized version control (self-hosted) (port 3690)

Jujutsu (jj)

Git-compatible VCS with a simpler, more powerful model

gh-dash

Terminal dashboard for GitHub PRs & issues (gh extension)

code.storage

Code hosting / storage platform (cloud) — see code.storage (web UI)

Entire

Code collaboration platform (cloud) — see entire.io (web UI)

Gitea Actions Runner

CI runner for Gitea/Forgejo Actions

Webhook (git-deploy)

Push-to-deploy via webhooks (port 9000, brew: webhook)

6.33CI/CD

Woodpecker CI

Lightweight container-native CI (port 8000, web UI)

GitHub Actions

CI/CD in GitHub — live build & deploy monitor (cloud) (web UI)

CodeRabbit

AI code reviewer for pull requests (cloud + CLI/IDE) (web UI)

GitLab CI/CD

Pipelines built into GitLab — GitLab.com, Dedicated or self-managed (web UI)

CircleCI

Cloud CI/CD with fast parallelism (cloud) (web UI)

Depot

Remote build acceleration — Docker & GitHub Actions runners (cloud) (web UI)

Bitbucket Pipelines

CI/CD built into Bitbucket Cloud (cloud) (web UI)

Travis CI

Hosted CI for open source & teams (cloud) (web UI)

Buildkite

Hybrid CI — your agents, their dashboard (cloud) (web UI)

Jenkins

The classic self-hosted automation server (port 8080, web UI, brew: jenkins-lts)

Drone CI

Container-native CI server (self-hosted) (port 80, web UI)

Concourse

Pipeline-centric CI with reproducible builds (self-hosted) (port 8080, web UI)

TeamCity

JetBrains CI/CD server (self-hosted or cloud) (port 8111, web UI)

GoCD

Open-source CI/CD with value-stream pipelines (self-hosted) (port 8153, web UI)

Argo CD

GitOps continuous delivery for Kubernetes (self-hosted) (port 8080, web UI)

Flux CD

GitOps toolkit for Kubernetes (self-hosted)

Spinnaker

Multi-cloud continuous delivery (self-hosted) (port 9000, web UI)

Azure DevOps

Azure Pipelines, Repos, Boards & Artifacts (cloud) (web UI)

Buildkite Agent

Self-hosted runner for Buildkite pipelines

Jenkins Agent

Build node that connects to a Jenkins controller

GitHub Actions Runner

Self-hosted runner for GitHub Actions

Blacksmith

Managed high-performance CI runners for GitHub Actions (cloud) (web UI)

GitLab Runner

Self-hosted runner for GitLab CI/CD (works on this Mac) (brew: gitlab-runner)

6.34Build & Compile

Build & Render Farm

built-in tool

Workbox

Google's service-worker libraries for PWAs

Vite PWA Plugin

Zero-config PWA for Vite (vite-plugin-pwa)

Next.js PWA

PWA/service-worker support for Next.js

Nuxt PWA Module

PWA module for Nuxt (@vite-pwa/nuxt)

Xcode Build / Xcode Cloud

Apple's build system (xcodebuild) + Xcode Cloud CI

Bazel

Fast, scalable multi-language build system (Google)

Tuist

Xcode project generation & build optimization

Buck2

Meta's fast, hermetic multi-language build system

CMake

Cross-platform build-system generator (C/C++)

Ninja

Small, very fast build backend

Meson

Fast, user-friendly build system (Ninja backend)

Gradle

JVM/Android build automation with build cache

Apache Maven

Java build & dependency management

distcc

Distribute C/C++ compiles across machines

Icecream (icecc)

Distributed compiler with central scheduler

Bazel Remote Execution

Run Bazel actions on a remote farm (RBE)

BuildGrid

Open-source Remote Execution API server (self-hosted)

Incredibuild

Commercial distributed build acceleration

ccache

Compiler cache for C/C++ rebuilds

sccache

Shared compiler cache (C/C++/Rust) with cloud backends

Bazel Remote Cache

Shared HTTP/gRPC cache for Bazel (self-hosted) (port 8080)

Tuist Cache

Binary caching for Xcode builds (Tuist)

6.35Internal Developer Portals

Backstage

Spotify's open-source developer portal framework (self-hosted) (port 7007, web UI)

Port

No-code internal developer portal (cloud) (web UI)

Cortex

Service catalogue with scorecards & maturity (cloud) (web UI)

OpsLevel

Service maturity & ownership portal (cloud) (web UI)

Humanitec

Platform orchestrator for internal platforms (cloud + agent) (web UI)

Score

Open workload spec for portable deployments (CLI)

Roadie

Managed (hosted) Backstage (cloud) (web UI)

Kakao Developers (카카오 디벨로퍼스)

Kakao app keys for Login, Maps, Local & messaging APIs (web UI)

6.36Infrastructure as Code

Terraform

HashiCorp's declarative infrastructure as code (CLI)

OpenTofu

Open-source, community fork of Terraform (CLI)

Pulumi

Infrastructure as code in real languages (CLI / cloud)

Ansible

Agentless configuration management & automation (CLI)

Chef

Policy-as-code configuration management (Progress Chef)

Puppet

Declarative configuration management at scale (Perforce)

Salt

Event-driven remote execution & config management (CLI)

Packer

Build identical machine images for any platform (CLI)

AWS CloudFormation

Native AWS infrastructure as code (templates / CLI) (web UI)

AWS CDK

Define AWS infra in code, synth to CloudFormation (CLI)

AttuneOps

Reusable multi-step SSH and WinRM automation blueprints (web UI)

6.37API Testing & Synthetic Monitoring

Postman

API platform — build, test, mock & monitor (app / cloud) (web UI)

Bruno

Open-source, offline, git-friendly API client (app / CLI)

Insomnia

API client for REST, GraphQL & gRPC (app)

Grafana k6

Developer-centric load & performance testing (CLI)

Artillery

Load testing & smoke tests for APIs and services (CLI)

Checkly

Monitoring-as-code — API checks & browser synthetics (cloud + CLI) (web UI)

Changedetection.io

Website change detection & notifications (port 5000, web UI)

6.38Proxies & Load Balancers

Reverse Proxy

built-in tool

Debug Share

built-in tool

ProxySQL

High-performance MySQL proxy (port 6033, brew: proxysql)

MySQL Router

Routing for MySQL InnoDB Cluster (port 6446)

Nginx Proxy Manager

Web-UI reverse proxy (Docker) (port 81, web UI)

keepalived

VRRP virtual IP failover + LVS load balancing

6.39Proxy Gateways

HAProxy

TCP/HTTP load balancer & proxy (brew: haproxy)

Traefik

Container-native reverse proxy & LB (port 8080, web UI, brew: traefik)

Squid

Caching forward proxy (HTTP/HTTPS/FTP) (port 3128, brew: squid)

3proxy

Tiny multi-protocol proxy (HTTP/SOCKS) (port 3128)

Tinyproxy

Lightweight HTTP/HTTPS forward proxy (port 8888, brew: tinyproxy)

6.40CDN & Edge

Cloudflare

built-in tool

Akamai

Enterprise CDN, security & edge compute (cloud) (web UI)

Fastly

Real-time CDN with VCL/Compute edge (cloud) (web UI)

Imperva

WAF-first CDN & DDoS protection (cloud) (web UI)

Amazon CloudFront

AWS CDN tied to S3/EC2 origins (cloud) (web UI)

Google Cloud CDN

GCP CDN on global load balancing (cloud) (web UI)

Azure Front Door

Microsoft's global entry point: CDN + WAF + LB (cloud) (web UI)

NHN Cloud CDN

NHN Cloud content delivery network (web UI)

NAVER Cloud Global Edge (CDN)

NAVER Cloud CDN / edge (successor to CDN+) (web UI)

CDNetworks (씨디네트웍스)

Korean-founded global CDN & web security (web UI)

6.41Hosting

here.now

built-in tool

Hostinger

built-in tool

DigitalOcean

built-in tool

Vultr

built-in tool

Linode (Akamai)

built-in tool

Hetzner

built-in tool

Sakura Cloud

built-in tool

ConoHa

built-in tool

Cloudways

built-in tool

SiteGround

built-in tool

WP Engine

built-in tool

Kinsta

built-in tool

Pressable

built-in tool

Contabo

built-in tool

Cloud Servers

built-in tool

Abacus SuperComputer

Always-on Ubuntu VM from Abacus.AI (2 vCPU / 8 GB, SSH + root) (web UI)

Google Cloud CLI

Install gcloud, sign in and work with Google Cloud from here

Azure CLI

Install az, sign in and work with Microsoft Azure from here

Fly.io

Deploy apps as microVMs on Fly's global edge (cloud CLI)

Coolify

Self-hosted PaaS (Heroku/Netlify/Vercel alt.) (port 8000, web UI)

Dokploy

Open-source deployment platform (PaaS) (port 3000, web UI)

CapRover

Self-hosted PaaS on Docker Swarm (port 3000, web UI)

Kamal

Deploy containers to your own servers over SSH (37signals)

Dokku

Minimal self-hosted PaaS (git push deploy)

V2 Cloud

Managed cloud desktops, servers and isolated AI workspaces (web UI)

Zenlayer

Edge cloud compute and global networking (web UI)

cPanel & WHM

Commercial web-hosting server control panel (port 2087, web UI)

NAVER Cloud Platform (네이버 클라우드)

Naver's public cloud — servers, Global DNS, Object Storage (Korea) (web UI)

NHN Cloud (ex-TOAST)

NHN's public cloud (ex-TOAST) — OpenStack IaaS + app services (web UI)

KT Cloud (kt cloud, ex-ucloud biz)

KT's public cloud (ex-ucloud biz) (web UI)

KakaoCloud (카카오클라우드, ex-KIC)

Kakao Enterprise public cloud — VMs, Kubernetes, DNS, storage (web UI)

Samsung Cloud Platform (SCP, Samsung SDS)

Samsung SDS enterprise & public-sector cloud (web UI)

Gabia Cloud (가비아 클라우드 / g클라우드)

Gabia's IaaS cloud (CSAP public-sector zone) (web UI)

LG U+ Cloud (U+ 클라우드)

LG U+ enterprise IDC & cloud (web UI)

iwinv (아이윈브, Smileserv)

Budget Korean cloud, VPS & web hosting with an HMAC-signed API (web UI)

Cafe24 Hosting (카페24 호스팅)

Mass-market Korean web, WordPress & domain hosting (web UI)

Dothome (닷홈)

Free and low-cost Korean shared web hosting (web UI)

6.42AWS Control

S3 Buckets

built-in tool

EC2 Instances

built-in tool

Lightsail

built-in tool

CloudFront/CDN

built-in tool

Route 53 DNS

built-in tool

RDS Databases

built-in tool

DynamoDB

built-in tool

CloudWatch Logs

built-in tool

SNS Topics

built-in tool

Billing Alerts

built-in tool

IAM Key Warnings

built-in tool

6.43AI / LLMs

AI Administrator

built-in tool

AI Models

built-in tool

Spend & Billing

built-in tool

Ollama

built-in tool

LM Studio

built-in tool

Skill Manager

built-in tool

Open WebUI

built-in tool

RAG Manager

built-in tool

Firecrawl

built-in tool

Crawl4AI

built-in tool

Apify

built-in tool

Playwright

built-in tool

Browserbase

built-in tool

Vane (Perplexica)

Self-hosted AI answer engine — the open-source Perplexity alternative (port 3000, web UI)

MLX

Apple-silicon model serving — the MLX-LM CLI server, the oMLX inference server, or Inco AI's Splash engine (port 8080)

TurboFieldfare

Gemma 4 26B-A4B on Apple Silicon in ~2 GB of RAM (port 8080)

Cerebras

Very fast hosted inference on wafer-scale hardware (web UI)

MLX (Apple)

Apple's ML framework for Apple Silicon

vLLM

High-throughput LLM inference server (OpenAI-compatible) (port 8000)

llama.cpp Server

Lightweight local LLM server (OpenAI-compatible) (port 8080)

Mojo (Modular MAX)

Modular's AI language + MAX inference server (OpenAI-compatible) (port 8000)

LocalAI

Self-hosted, OpenAI-compatible inference server (port 8080, web UI)

Jan

Private, offline AI desktop app (OpenAI-compatible) (port 1337)

PrivateGPT

Ask questions of your documents, 100% offline (RAG) (port 8001, web UI)

IBM watsonx.ai

IBM's enterprise AI platform — Granite + third-party models (cloud/on-prem) (web UI)

Mem0

Memory layer for AI agents — self-hosted (Docker) or cloud (port 8888, web UI)

CrewAI (open source)

Multi-agent crews — Python framework + CLI (local)

Open Computer

Virtual OS for AI agents — QEMU VM per agent (Mintplex Labs) (web UI)

LiteLLM

Proxy/gateway for 100+ LLM APIs (OpenAI-compatible) (port 4000, web UI)

Tetrate Agent Router

Hosted LLM router — one OpenAI-compatible API (cloud) (web UI)

AnythingLLM

All-in-one self-hosted RAG chat app (port 3001, web UI)

Hugging Face

Model hub, Inference API & local tooling (web UI)

ChatLLM Teams

Abacus.AI's multi-model team chat & agent workspace (cloud) (web UI)

LibreChat

Self-hosted multi-provider AI chat UI (port 3080, web UI)

NotebookLM

Google's source-grounded research notebook (cloud) (web UI)

Open Notebook

Open-source, self-hosted NotebookLM alternative (port 8502, web UI)

OpenCode

Open-source AI coding agent (terminal)

Dyad

Local open-source AI app builder (desktop)

Papago Translation (NAVER Cloud)

Naver Papago machine translation (NAVER Cloud) (web UI)

CLOVA OCR (NAVER Cloud)

NAVER CLOVA OCR — general, template & document OCR (web UI)

FriendliAI (프렌들리AI)

Seoul-founded LLM inference cloud (hosts LG EXAONE) (web UI)

CLOVA Studio (HyperCLOVA X)

Naver HyperCLOVA X LLM API (OpenAI-compatible) (web UI)

Upstage (Solar)

Korean Solar LLMs + document AI (OpenAI-compatible) (web UI)

6.44AI Clusters

Exo Cluster

built-in tool

GPU Fabric

built-in tool

Petals

BitTorrent-style distributed inference of big models

Distributed Llama

Tensor-parallel Llama across cheap nodes (root + workers) (port 9998)

Slurm

HPC workload manager / job scheduler (port 6817)

Ray

Distributed compute for AI (training/serving/tuning) (port 8265, web UI)

Apache Spark

Distributed big-data processing engine (port 8080, web UI)

Dask

Parallel computing for Python (scales pandas/NumPy) (port 8787, web UI)

JupyterLab

Interactive notebooks for data & AI (Python) (port 8888, web UI)

Run:ai

GPU orchestration & fractional GPUs on Kubernetes (NVIDIA) (web UI)

NVIDIA Base Command Manager

GPU/HPC cluster provisioning & management (ex-Bright) (port 8081, web UI)

6.45Agent Platforms

Agent Operations

built-in tool

Runtimes

built-in tool

Activity

built-in tool

Routing & Integrations

built-in tool

Work

built-in tool

OpenClaw

built-in tool

Hermes

built-in tool

Odysseus

built-in tool

DeerFlow

built-in tool

CoWork OS

built-in tool

OpenAI Codex Runtime

built-in tool

Amp

built-in tool

DeepSeek Harness (Alpha)

built-in tool

Claude Code CLI

built-in tool

Gemini CLI

built-in tool

Factory Droid

built-in tool

OpenCode

built-in tool

Goose

built-in tool

LangGraph Platform

built-in tool

CrewAI Enterprise

built-in tool

Microsoft AutoGen

built-in tool

Genspark

built-in tool

Agent Zero

built-in tool

NVIDIA NemoClaw

built-in tool

OpenHuman

built-in tool

Apple Intelligence

built-in tool

Sandcastle

Orchestrate sandboxed coding agents (isolated containers)

SuperAGI

Open-source autonomous-agent framework (self-hosted) (port 3000, web UI)

OpenHands (OpenDevin)

Open-source autonomous AI software engineer (self-hosted) (port 3000, web UI)

E2B

Secure cloud sandboxes for AI agents (spin up / clone / kill) (web UI)

Browserbase

Headless browser infrastructure for AI agents (cloud sessions) (web UI)

Manus

Autonomous general AI agent (cloud API) (web UI)

Devin

Cognition's AI software engineer (cloud API) (web UI)

GitHub Copilot

AI pair programmer — live org seat/usage monitor (web UI)

OpenAI Operator

OpenAI's browser-using agent (cloud) (web UI)

Hyperagent

Airtable's fleet-of-agents platform (cloud) (web UI)

Herdr

Agent multiplexer — tmux for AI coding agents (terminal)

ChatGPT Work Sites

OpenAI's work agent + published Sites/web apps (alpha) (web UI)

Lakebed

Agent-native runtime for full-stack TypeScript capsules (alpha) (port 3000, web UI)

6.46FinOps & Cloud Cost

Infracost

Cost estimates for Terraform, in CI (self-hosted CLI / cloud)

OpenCost

CNCF open-source Kubernetes cost monitoring (self-hosted) (port 9003, web UI)

Kubecost

Kubernetes cost visibility & optimization (self-hosted / cloud) (port 9090, web UI)

CloudZero

Cloud cost intelligence & unit economics (cloud) (web UI)

Vantage

Multi-cloud cost reporting & optimization (cloud) (web UI)

Finout

No-agent FinOps platform with unified cost (cloud) (web UI)

CloudHealth

Multi-cloud cost & governance (VMware/Broadcom, cloud) (web UI)

AWS Cost Explorer

Native AWS cost analysis & forecasting (API) (web UI)

GCP Cloud Billing

Google Cloud billing reports, budgets & BigQuery export (API) (web UI)

Azure Cost Management

Native Azure (and AWS) cost analysis & budgets (API) (web UI)

6.47Containers

Containers

built-in tool

Kubernetes Clusters

built-in tool

Docker

built-in tool

OrbStack

built-in tool

Vagrant

built-in tool

Kamal

built-in tool

Proxmox VE

Open-source virtualization — KVM VMs + LXC containers (port 8006, web UI)

VMware vSphere

Enterprise virtualization — ESXi hypervisor + vCenter (port 443, web UI)

Microsoft Hyper-V

Windows Server hypervisor (Type-1)

XCP-ng

Open-source Xen hypervisor (XenServer alternative) (port 443, web UI)

Nutanix

HCI platform — AHV hypervisor + Prism management (port 9440, web UI)

Scale Computing HyperCore

SC//HyperCore HCI appliance (HC3) — REST API on :443 (port 443, web UI)

VergeOS

Verge.io — integrated virtualization, storage and networking (port 443, web UI)

HPE Morpheus

Hybrid-cloud management & orchestration (REST API) (port 443, web UI)

Platform9

Managed Kubernetes / private cloud (SaaS control plane) (port 443, web UI)

Azure Local

Azure Stack HCI successor — monitored via Azure ARM, no local API (web UI)

OpenShift Virtualization

Run VMs alongside containers on OpenShift (KubeVirt) (web UI)

OpenStack

Open-source private-cloud IaaS platform (web UI)

VMware vMotion

Live-migrate running VMs between ESXi hosts

Proxmox VE Live Migration

Live-migrate KVM VMs across Proxmox cluster nodes

Hyper-V Live Migration

Move running Hyper-V VMs between hosts with no downtime

Watchtower

Auto-update running Docker containers

Podman

Daemonless, Docker-compatible containers

Apple Container

Apple's native `container` tool — Linux containers in per-container VMs

Lima

Linux virtual machines (container machines) on macOS

Colima

Container runtimes on macOS via Lima (Docker/containerd/k8s)

OrbStack

Fast Docker & Linux machines for macOS

Kubernetes

The container orchestrator (kubectl) (port 6443)

Helm

The Kubernetes package manager (charts)

Dev Containers (VS Code)

Reproducible dev environments in a container

K3s

Lightweight certified Kubernetes (self-hosted) (port 6443)

minikube

Local single-node Kubernetes for development

kind

Kubernetes IN Docker — disposable clusters

k3d

k3s in Docker — lightweight multi-node clusters

k0s

Zero-friction single-binary Kubernetes (port 6443)

MicroK8s

Canonical's low-ops Kubernetes (snap) (port 16443)

RKE2

Rancher's security-focused Kubernetes (Gov-grade) (port 6443)

Talos Linux

API-managed immutable OS purpose-built for Kubernetes (port 50000)

kubeadm

The official cluster bootstrapper (vanilla K8s) (port 6443)

OpenShift / OKD

Red Hat's enterprise Kubernetes platform (port 6443, web UI)

Rancher Desktop

Desktop Kubernetes + container runtime for Mac

nerdctl

Docker-compatible CLI for containerd

Docker Swarm

Docker-native clustering (docker swarm / stack) (port 2377)

Portainer

Web UI for Docker & Kubernetes (self-hosted) (port 9443, web UI)

Rancher

Multi-cluster Kubernetes management (self-hosted) (port 443, web UI)

Nomad

HashiCorp workload orchestrator (self-hosted) (port 4646, web UI)

6.48Service Mesh (Kubernetes)

Istio

Envoy-based service mesh for Kubernetes

Linkerd

Lightweight, fast CNCF service mesh

Consul Connect

HashiCorp Consul service mesh & discovery (port 8500, web UI)

Cilium Service Mesh

eBPF-based, sidecarless service mesh & CNI

Kuma

Universal service mesh (Kong, CNCF) (port 5681, web UI)

Gloo Mesh

Istio-based multi-cluster service mesh (solo.io)

NGINX Service Mesh

Lightweight service mesh on NGINX/NGINX Plus (F5)

AWS App Mesh

Managed Envoy service mesh on AWS (ECS/EKS/EC2)

Kong Gateway

Cloud-native API gateway on Envoy/Nginx (self-hosted / cloud) (port 8001)

Tyk

Open-source API gateway & management (self-hosted / cloud) (port 8080, web UI)

Apache APISIX

Dynamic, high-performance API gateway (self-hosted) (port 9180, web UI)

Envoy Gateway

Gateway API management plane for Envoy Proxy (self-hosted)

6.49Apps & CMS

WordPress

built-in tool

WordPress Sites

built-in tool

RevenueCat

built-in tool

Drupal

built-in tool

Joomla

built-in tool

Statamic

built-in tool

Grav

built-in tool

Kirby

built-in tool

Craft CMS

built-in tool

ClassicPress

WordPress fork without the block editor (web UI)

Backdrop CMS

Drupal 7 fork for small-to-medium sites (web UI)

Bedrock (Roots)

Composer-managed WordPress boilerplate

Trellis (Roots)

Ansible server provisioning for WordPress

WordPress Playground

WordPress running in WebAssembly — no server needed (port 9400, web UI)

Ghost

Modern publishing & newsletter platform (port 2368, web UI)

Webflow

Visual website builder & hosted CMS (cloud) (web UI)

Framer

Design-first website builder with hosted CMS (cloud) (web UI)

STUDIO

Japanese no-code website builder with hosting and CMS (cloud) (web UI)

imweb (아임웹)

Korean website & online-store builder with hosting (cloud) (web UI)

Instatic

Self-hosted visual CMS with an AI page editor (open-source) (port 3001, web UI)

inblog

Korean SEO-focused blog builder with a REST API (web UI)

Oopy (우피)

Turns Notion pages into hosted websites (Korea) (web UI)

6.50Knowledge & Memory

Knowledge Folder

built-in tool

Knowledge Notes

built-in tool

GraphRAG

Graph-based retrieval-augmented generation (Microsoft)

Graphify

Turn a codebase into a queryable knowledge graph (AI coding-assistant skill)

Khoj

Self-hosted AI second brain — chat with your notes, docs and the web (port 42110, web UI)

Logseq

Local-first outliner & PKM (Markdown/Org)

Notion

All-in-one workspace — docs, wikis, databases (cloud)

DokuWiki

Flat-file PHP wiki — the closest macOS Server “Wiki” replacement (port 80, web UI)

MediaWiki

The wiki engine behind Wikipedia (PHP/MySQL) (port 80, web UI)

Wiki.js

Modern self-hosted wiki (Node.js) (port 3000, web UI)

BookStack

Self-hosted docs/wiki organised as books (PHP) (port 6875, web UI)

Outline

Self-hosted team knowledge base (real-time) (port 3000, web UI)

Trilium Notes

Hierarchical personal notes (self-hosted server + app) (port 8080, web UI)

Zotero

Reference & research manager (app + API)

Readwise

Highlights sync & read-later (cloud API)

Memos

Lightweight, privacy-first notes/memo hub (port 5230, web UI)

Linkding

Minimal, fast self-hosted bookmark manager (port 9090, web UI)

Karakeep

AI bookmark/read-it-later (formerly Hoarder) (port 3000, web UI)

Wallabag

Self-hosted read-it-later (Pocket alternative) (port 80, web UI)

Docmost

Open-source collaborative wiki & docs (Confluence/Notion alt.) (port 3000, web UI)

AFFiNE

Docs + whiteboard + database (Notion/Miro alt.) (port 3010, web UI)

AppFlowy

Open-source Notion alternative (docs/boards/DBs) (web UI)

Joplin Server

Sync server for Joplin notes (E2EE) (port 22300, web UI)

Shiori

Simple self-hosted bookmark manager (Go) (port 8080, web UI)

SurfSense

Self-hosted NotebookLM/Perplexity alternative (port 3000, web UI)

6.51E-Commerce

Store Health

built-in tool

Sales Channels

built-in tool

Square

built-in tool

WooCommerce

WordPress e-commerce plugin (PHP) (web UI)

Adobe Commerce (Magento)

Enterprise PHP commerce platform (port 80, web UI)

Shopware

Symfony-based commerce platform (PHP) (port 80, web UI)

Saleor

GraphQL-first headless commerce (Python) (port 8000, web UI)

Medusa

Node.js headless commerce engine (port 9000, web UI)

Vendure

Node.js/GraphQL headless commerce (port 3000, web UI)

Stripe

Payments & checkout API (cloud) (web UI)

PayPal

Online payments & checkout (cloud) (web UI)

DOKU

Indonesian payment gateway (cards, e-wallets, VA, QRIS) (web UI)

Mollie

European payments (iDEAL, cards, SEPA) (cloud) (web UI)

Paddle

Merchant-of-record for software sales (cloud) (web UI)

Lemon Squeezy

Digital-products storefront & MoR (legacy — moving to Stripe) (web UI)

Braintree

PayPal's card/wallet gateway (GraphQL API) (cloud) (web UI)

PAY.JP

Japanese card payments API (cloud) (web UI)

KOMOJU

Japanese multi-method payments (konbini, cards, wallets) (web UI)

Adyen

Enterprise payments platform (webhook/report-driven) (web UI)

Wise

Multi-currency business account & payouts (cloud) (web UI)

GMO Payment Gateway

Japan's largest PSP (per-order API; no list API) (web UI)

Shopify

Hosted commerce platform & channel (cloud) (web UI)

Amazon

Amazon marketplace selling channel (cloud) (web UI)

FedEx

Shipping rates, labels & tracking (cloud) (web UI)

UPS

Shipping rates, labels & tracking (cloud) (web UI)

DHL

Shipping rates, labels & tracking (cloud) (web UI)

eBay Seller Hub

eBay marketplace selling channel (cloud) (web UI)

Etsy

Handmade/vintage & POD marketplace (cloud) (web UI)

Walmart Marketplace

Walmart marketplace selling channel (cloud) (web UI)

Sixshop (식스샵)

Korean online-store builder (no public API) (web UI)

NHN Commerce godomall (고도몰)

NHN Commerce hosted e-commerce builder (고도몰) (web UI)

KakaoPay (카카오페이)

KakaoPay online & subscription payments (web UI)

Naver Pay (네이버페이)

Naver Pay merchant payments & settlement API (web UI)

NicePay (나이스페이)

NicePay PG — cards, transfers, virtual accounts (web UI)

NHN KCP (NHN한국사이버결제)

NHN KCP payment gateway (web UI)

KG Inicis (KG이니시스)

KG Inicis payment gateway (INIAPI) (web UI)

Bootpay (부트페이)

Bootpay PG aggregator + commerce API (web UI)

Payple (페이플)

Payple card & bank billing PG (web UI)

Hecto Financial (헥토파이낸셜, ex-Settlebank)

Hecto Financial (ex-Settlebank) payment gateway (web UI)

Steppay (스텝페이)

Korean subscription & recurring-billing platform (web UI)

PayApp (페이앱)

PayApp small-merchant payment links (web UI)

KICC EasyPay (한국정보통신 이지페이)

KICC EasyPay online payment gateway (web UI)

Danal (다날)

Danal payments (cards, mobile billing) (web UI)

Smartro (스마트로)

Smartro payment gateway (no public key API) (web UI)

KG Mobilians (KG모빌리언스)

KG Mobilians mobile-phone billing (web UI)

Cafe24 (카페24)

Korea's largest shop builder — Admin API for orders & products (web UI)

Naver SmartStore Commerce API (네이버 커머스API)

Naver SmartStore seller API — orders, products, claims (web UI)

Coupang Wing (쿠팡 윙)

Coupang marketplace seller API — orders & shipments (web UI)

11st Open API (11번가)

11st marketplace seller API (web UI)

Gmarket / Auction ESM+ (지마켓·옥션)

Gmarket & Auction seller API (ESM Trading API) (web UI)

MakeShop (메이크샵)

Korean shop builder with an Open API (web UI)

NHN Commerce shopby (샵바이)

NHN Commerce headless commerce (shopby) (web UI)

Lotte ON (롯데온)

Lotte ON marketplace seller API (web UI)

SSG.COM Open API (SSG닷컴)

SSG.COM marketplace seller API (web UI)

Kakao Shopping / KakaoTalk Store (카카오톡 스토어)

KakaoTalk Store seller centre (web UI)

Toss Shopping (토스쇼핑)

Toss Shopping seller API (web UI)

Zigzag / Kakao Style (지그재그)

Zigzag / Kakao Style seller GraphQL API (web UI)

Toss Payments (토스페이먼츠)

Toss Payments — Korean payment gateway (web UI)

PortOne (포트원, ex-Iamport)

PortOne — one API across Korean payment gateways (web UI)

QR & Link Health

built-in tool

BL.INK

Enterprise link management (cloud) (web UI)

Bitly

Links, QR codes, analytics (cloud) (web UI)

Rebrandly

Branded short domains (cloud) (web UI)

Short.io

Teams, custom domains (cloud) (web UI)

Dub.co

Modern marketing links & QR (open-source core) (web UI)

QR Code Generator PRO

Dynamic QR codes (cloud) (web UI)

Beaconstac (Uniqode)

QR analytics & management (cloud) (web UI)

Flowcode

Marketing QR dashboards (cloud) (web UI)

Scanova

QR campaign management (cloud) (web UI)

QR TIGER

Dynamic QR management (cloud) (web UI)

GS1 Digital Link

Own your product-QR resolver (self-host or SaaS) (web UI)

6.53Student Information Systems

PowerSchool SIS

K-12 student information system (cloud) (web UI)

PowerSchool Attendance

Attendance tracking within PowerSchool (cloud) (web UI)

Blackbaud SIS

Independent/private-school SIS (cloud) (web UI)

FACTS SIS

Private/faith-based school SIS (cloud) (web UI)

Infinite Campus

K-12 SIS & state reporting (cloud) (web UI)

Veracross

All-in-one independent-school platform (cloud) (web UI)

openSIS

Open-source student information system (self-hosted) (web UI)

RosarioSIS

Open-source SIS (PHP/PostgreSQL, self-hosted) (web UI)

SchoolPass

Attendance, dismissal & safety (cloud) (web UI)

RFID/NFC Attendance

Tap-card attendance with RFID/NFC readers (self-hosted) (web UI)

6.54Learning Management

Canvas LMS

Instructure Canvas — courses, assignments, grading (web UI)

Blackboard Learn

Higher-ed LMS (cloud) (web UI)

Schoology

K-12 LMS by PowerSchool (cloud) (web UI)

Google Classroom

Google's classroom & assignment tool (cloud) (web UI)

Moodle

Open-source LMS (self-hosted, PHP) (web UI)

Open edX

MOOC-scale open LMS (self-hosted) (web UI)

ILIAS

Open-source LMS (self-hosted, PHP) (web UI)

BigBlueButton

Open-source virtual classroom (self-hosted) (web UI)

Zoom

Video meetings & online classes (app)

Google Meet

Google's video meetings (cloud) (web UI)

ExamSoft

Secure exam delivery & analytics (cloud) (web UI)

ProctorU

Online exam proctoring (cloud) (web UI)

TAO Testing

Open-source assessment platform (self-hosted) (web UI)

6.55Digital Library

EBSCOhost

Research databases & e-journals (cloud) (web UI)

ProQuest

Dissertations, e-journals & databases (cloud) (web UI)

JSTOR

Academic journals & books archive (cloud) (web UI)

Koha

Open-source integrated library system (self-hosted) (web UI)

DSpace

Open-source institutional repository (self-hosted) (web UI)

Greenstone

Open-source digital-library builder (self-hosted) (web UI)

6.56Campus & School Ops

aSc Timetables

School timetable generator (desktop)

Mimosa Scheduling

Timetabling / scheduling software (desktop)

FET Timetabling

Open-source automatic timetabling (self-hosted/desktop)

Slate Admissions

Admissions & enrolment CRM (cloud) (web UI)

OpenApply

Admissions & enrolment for K-12 (cloud) (web UI)

Finalsite Enrolment

School websites & enrolment (cloud) (web UI)

FACTS Tuition Management

Tuition billing & payment plans (cloud) (web UI)

Flywire Education Payments

Cross-border tuition payments (cloud) (web UI)

StarRez

Student housing & residential life (cloud) (web UI)

eRezLife

Residence life & housing management (cloud) (web UI)

Ellucian Banner

Higher-ed ERP / student system (cloud or self-hosted) (web UI)

Workday Student

Cloud ERP for higher education (cloud) (web UI)

ParentSquare

School-home communication (cloud) (web UI)

Remind

Teacher-family messaging (cloud) (web UI)

Asset Panda

Asset & device tracking (cloud) (web UI)

Incident IQ

K-12 IT helpdesk & asset management (cloud) (web UI)

ClassLink

Education SSO & rostering (cloud) (web UI)

6.57Sourcing & Suppliers

AliExpress

Global supplier marketplace for drop-shipping (cloud) (web UI)

Alibaba

B2B wholesale sourcing (cloud) (web UI)

CJdropshipping

Sourcing + warehousing + fulfilment (cloud) (web UI)

Spocket

US/EU-supplier drop-ship marketplace (cloud) (web UI)

Zendrop

Drop-ship sourcing & auto-fulfillment (cloud) (web UI)

SaleHoo

Vetted supplier directory (cloud) (web UI)

DSers

AliExpress order automation (official) (cloud) (web UI)

Printful

Print-on-demand & fulfilment (cloud) (web UI)

Printify

Print-on-demand marketplace (cloud) (web UI)

Gelato

Global/local print-on-demand network (cloud) (web UI)

Gooten

Print-on-demand fulfilment platform (cloud) (web UI)

6.59Shipping & Fulfilment

Drop-shipping Health

built-in tool

AfterShip

Universal shipment tracking across 1,000+ carriers (cloud) (web UI)

ShipStation

Multi-channel order & label management (cloud) (web UI)

Easyship

Global shipping rates, duties & labels (cloud) (web UI)

Shippo

Multi-carrier rates, labels & tracking API (cloud) (web UI)

Pirate Ship

Free, discounted USPS/UPS labels (cloud) (web UI)

6.60Inventory Sync

SkuVault

Warehouse & inventory management (cloud) (web UI)

Cin7

Inventory & order management (cloud) (web UI)

Zoho Inventory

Multi-channel inventory & order management (cloud) (web UI)

Katana Cloud Inventory

Manufacturing & inventory control (cloud) (web UI)

zaiko Robot

Japanese multi-store stock sync — Rakuten, Yahoo!, Amazon, carts, POS (cloud) (web UI)

Sabangnet (사방넷)

Korean multi-marketplace order & product hub (web UI)

PlayAuto (플레이오토)

Korean multi-marketplace order management (OMS) (web UI)

6.61Profit Analytics

Triple Whale

E-commerce profit & attribution dashboard (cloud) (web UI)

Lifetimely

P&L and LTV analytics for Shopify (cloud) (web UI)

BeProfit

Profit & expense tracking dashboard (cloud) (web UI)

6.62Mesh Networking

RNS Nodes

built-in tool

Reticulum

Cryptography-based mesh networking stack (any medium)

Nomad Network (NomadNet)

Resilient comms over Reticulum (pages, files, messaging)

Sideband

LXMF messaging app over Reticulum (desktop/mobile)

Meshtastic

LoRa mesh radio for text & location (off-grid)

RNode LoRa Devices

Open LoRa radio interface for Reticulum (flash & configure)

Yggdrasil

Self-arranging encrypted IPv6 mesh (experimental)

cjdns / Hyperboria

Encrypted IPv6 mesh routing (source-routed)

B.A.T.M.A.N.-adv

Layer-2 community Wi-Fi mesh routing (Linux)

OLSR (olsrd)

Optimized Link State Routing for MANETs

Babel (babeld)

Robust distance-vector mesh routing protocol

Briar

P2P messaging over Tor, Wi-Fi & Bluetooth

AREDN

Amateur-radio high-speed mesh (ham licence)

qaul

Internet-independent P2P mesh messaging app

Serval Mesh

Off-grid mesh comms (Serval Project)

Ratspeak

Private, account-free mesh messaging (Reticulum-based)

6.63Anonymity Networks

Tor

Onion-routing anonymity network (client/relay/bridge/onion service) (port 9050, brew: tor)

I2P

Garlic-routed network — router, tunnels, eepsites, messaging (port 7070, web UI)

6.64Secrets & Vaults

Vault Links

built-in tool

Bitwarden

Password manager — cloud or official self-host (web UI)

Vaultwarden

Self-hosted Bitwarden-compatible server (Docker) (port 8222, web UI)

HashiCorp Vault

Secrets, PKI & dynamic credentials (self-hosted) (port 8200, web UI)

Step CA

Your own private certificate authority (self-hosted) (port 8443)

Let's Encrypt

Free TLS certificates via ACME — health & renewal monitor

Infisical

Open-source secrets for app configs (cloud or self-hosted) (port 8080, web UI)

Doppler

Hosted secrets & config manager (cloud) (web UI)

1Password SCIM Bridge

Automated 1Password user provisioning (self-hosted bridge) (port 3002)

1Password

Password manager with developer secrets API (cloud) (web UI)

Keeper Security

Password manager & Secrets Manager (cloud API) (web UI)

6.65Monitoring

Unified Health History

HTTP/HTTPS, TCP, Ping, SIP, local processes, remote helpers and service APIs feed the same one-minute health board, response-time history, rolling uptime and transition log

Network-aware checks

Scope local targets to a saved network identity (router MAC, subnet and Wi-Fi identity); they pause outside that network without requesting the Mac's or phone's location

Private mobile widgets

Overview, multi-server, multi-service and single-service focus widgets, plus Lock Screen overview widgets; only sanitized health names and states enter the App Group

Cloud API monitoring

GitHub account/repository/Actions health, API quota and release-asset downloads; Anthropic and GitHub Copilot account monitoring; broad SaaS API metrics and thresholds

Disk Health

built-in tool

Service Guardian

built-in tool

Grafana

Dashboards for any data source (self-hosted) (port 3000, web UI, brew: grafana)

Prometheus

Time-series metrics & alerting (self-hosted) (port 9090, web UI, brew: prometheus)

Alertmanager

Route and deduplicate Prometheus alerts (self-hosted) (port 9093, web UI)

Node Exporter

Unix host metrics for Prometheus (self-hosted) (port 9100, web UI, brew: node_exporter)

Windows Exporter

Windows host metrics for Prometheus (remote) (port 9182, web UI)

Zabbix

Enterprise monitoring — agents, SNMP, triggers (self-hosted) (port 8080, web UI)

Nagios Core

The classic check-based monitor (self-hosted) (port 80, web UI)

Checkmk

Auto-discovering IT monitoring (self-hosted) (port 8080, web UI)

Paessler PRTG

Network, server and infrastructure monitoring (Windows or hosted) (port 443, web UI)

Healthchecks.io

Cron & heartbeat monitoring (cloud or self-hosted) (web UI)

Datadog

Hosted metrics, logs, traces and synthetics (SaaS) (web UI)

AppSignal

Application errors, performance, uptime and deploys (SaaS) (web UI)

New Relic

Hosted APM, infrastructure and logs (SaaS) (web UI)

Sentry

Error tracking and performance monitoring (web UI)

Honeycomb

Observability for high-cardinality events and traces (web UI)

Dynatrace

Enterprise observability and AIOps platform (web UI)

Matomo

Full-featured self-hosted web analytics (port 80, web UI)

Plausible

Lightweight, privacy-first analytics (port 8000, web UI)

Umami

Simple, privacy-focused analytics (Node) (port 3000, web UI)

GoAccess

Real-time access-log analyser (CLI/HTML)

Netdata

Real-time system metrics dashboard (port 19999, web UI, brew: netdata)

Uptime Kuma

Self-hosted uptime monitor (port 3001, web UI)

Scrutiny

S.M.A.R.T. drive health dashboard (port 8080, web UI)

Glances

Cross-platform system monitor (web/API) (port 61208, web UI)

Beszel

Lightweight server monitoring hub + agents (port 8090, web UI)

Speedtest Tracker

Scheduled internet speed tests + history (port 80, web UI)

UptimeRobot

Cloud uptime/SSL monitoring with status pages (web UI)

NUT (Network UPS Tools)

UPS monitoring server (upsd) for many devices (port 3493)

Homepage

Self-hosted services dashboard (gethomepage.dev) (port 3000, web UI)

PeaNUT

Modern web dashboard for NUT UPS servers (port 8080, web UI)

NinjaOne

Endpoint monitoring, patching and automation (SaaS RMM) (web UI)

Atera

RMM, patching, ticketing and automation (SaaS) (web UI)

Site24x7

Infrastructure, application, network and experience monitoring (SaaS) (web UI)

ManageEngine Applications Manager

Application, server, VM and capacity monitoring (port 8443, web UI)

ManageEngine OpManager Nexus

Unified network, server and IT operations management (port 8060, web UI)

Pulseway

Mobile-first RMM, patching and endpoint automation (web UI)

FirstWave NMIS

Open network fault, performance and configuration monitoring (port 8042, web UI)

N-able N-central

Unified endpoint management, RMM and patching (port 443, web UI)

Netreo

Full-stack infrastructure and business-service observability (port 443, web UI)

Pandora FMS

Infrastructure, application, log and synthetic monitoring (port 80, web UI)

Atatus

APM, logs, infrastructure and real-user monitoring (SaaS) (web UI)

Infraon IMS

Unified infrastructure, network and configuration monitoring (port 443, web UI)

Naverisk RMM & PSA

Cross-platform RMM, service desk and PSA (web UI)

Server Density

Hosted server, service and container monitoring (web UI)

WhaTap (와탭)

Korean SaaS APM, server, Kubernetes & DB monitoring (web UI)

JENNIFER APM (제니퍼, JenniferSoft)

Self-hosted Korean APM (JenniferSoft) (web UI)

Scouter (open-source APM)

Korean-origin open-source APM (web UI)

6.66Security Tools

Security

built-in tool

Security Audit

built-in tool

EDR Fleet

built-in tool

Fail2ban

Bans IPs after suspicious activity (intrusion prevention) (brew: fail2ban)

Suricata

High-performance IDS/IPS engine (self-hosted)

Snort

The classic network IDS (self-hosted)

CrowdSec

Behavioural detection + IP blocking (crowd-sourced) (port 8080, brew: crowdsec)

OSSEC

Host-based IDS: log, file-integrity & rootkit monitoring

LuLu

Free open-source outbound firewall (macOS app)

Burp Suite

Web app security testing — intercepting proxy & scanner (macOS app) (port 8080)

Vibe Proxy

AI-assisted web security testing & intercepting proxy

Yakit

Open-source web security testing platform & MITM (macOS app)

Strix

AI-assisted penetration testing from the local CLI

Fuzzilli

Coverage-guided JavaScript engine fuzzer (reviewed local binaries)

OWASP ZAP

Open-source web-app security scanner (DAST) — spider, active scan, proxy (port 8080)

Intego NetBarrier

Intego's two-way Mac firewall (NetBarrier X9 / Intego ONE)

Little Snitch

Commercial network monitor & firewall (macOS app)

Murus

GUI front-end for the macOS pf firewall (app)

Radio Silence

Lightweight macOS outbound firewall (app)

Vallum

Per-app outbound firewall & throttle (app)

Hands Off!

Per-app network + disk access control (app)

NetBarrier

Two-way macOS firewall (Intego, app)

ClamAV

Open-source antivirus engine (self-hosted) (brew: clamav)

YARA

Pattern-matching engine for file classification (self-hosted)

AbuseIPDB

Crowd-sourced IP reputation / blocklist (cloud API) (web UI)

Phishing Catcher

Catch phishing domains from CT logs (self-hosted)

URLhaus

Malicious-URL feed & lookup API (cloud · abuse.ch) (web UI)

OpenPhish

Live phishing-URL feed (cloud) (web UI)

MISP

Threat-intelligence sharing platform (self-hosted) (port 443, web UI)

CAPE Sandbox

Sandbox w/ config extraction (self-hosted) (port 8000, web UI)

Cuckoo Sandbox

Automated sample-analysis sandbox (self-hosted) (port 8090, web UI)

YARA-X

YARA rewritten in Rust — faster CLI scanner (self-hosted)

Volatility 3

Memory-forensics framework (self-hosted)

capa

Detect capabilities in executables (self-hosted)

oletools

Analyse malicious Office docs / OLE (self-hosted)

radare2

Reverse-engineering framework / disassembler (self-hosted)

binwalk

Firmware / embedded-file carving & analysis (self-hosted)

Nuclei

Template-based vulnerability scanner (self-hosted CLI)

OpenCTI

Cyber threat-intelligence platform (self-hosted) (port 8080, web UI)

TheHive

Security incident-response platform (self-hosted) (port 9000, web UI)

Cortex

Observable analysers & responders engine (self-hosted) (port 9001, web UI)

IntelOwl

OSINT / threat-intel analysis platform (self-hosted) (port 443, web UI)

AlienVault OTX

Open Threat Exchange IOC feed (cloud) (web UI)

GRR Rapid Response

Remote live-forensics / IR framework (self-hosted) (port 8000, web UI)

OpenEDR

Open-source endpoint detection & response (self-hosted) (web UI)

Santa

macOS binary allowlisting / blocklisting (self-hosted)

KnockKnock

Reveal persistently installed Mac software (self-hosted)

BlockBlock

Monitor & block persistence in real time (self-hosted)

ThreatLocker

Zero Trust app allowlisting & endpoint control (agent + cloud portal)

OPSWAT MetaDefender

Multi-engine file scanning & file CDR (self-hosted / API) (port 8008, web UI)

osquery

Query your endpoint like a database (agent)

Fleet

Self-hosted osquery fleet manager (web UI + API) (port 8080, web UI)

Velociraptor

Endpoint visibility & DFIR hunting (self-hosted) (port 8889, web UI)

Zeek

Network security monitor / traffic analysis (self-hosted)

OpenVAS / Greenbone

Vulnerability scanning (self-hosted) (port 9392, web UI)

CrowdStrike Falcon

Cloud-native EDR/XDR (macOS sensor + API)

SentinelOne

Autonomous EDR/XDR (macOS agent + API)

Microsoft Defender for Endpoint

Microsoft EDR for macOS (agent + Graph API)

Sophos Central

Endpoint protection / MDR (macOS agent + API)

Bitdefender GravityZone

Endpoint protection / EDR (macOS agent + API)

Huntress

Managed EDR/MDR for SMB & MSPs (agent + API)

Jamf Protect

Mac-native endpoint security (agent + API)

LimaCharlie

API-first SecOps cloud / EDR (agent + API)

Airlock Digital

Application allowlisting & execution control (agent + API)

Admin By Request

Endpoint privilege management / just-in-time admin (agent + API)

CyberArk EPM

Endpoint Privilege Manager (agent + API)

BeyondTrust EPM

Endpoint Privilege Management for Mac (agent + API)

AutoElevate (CyberFOX)

MSP privilege elevation & local-admin control (agent + API)

VirusTotal

Multi-engine file/URL reputation (API)

Cloudmersive

Virus-scan & content-protection API (cloud / self-host)

Hybrid Analysis

Sandbox (Falcon Sandbox) — API

Kolide

Device trust & posture (osquery-based agent + API)

AdGuard

Ad/tracker blocker app + AdGuard DNS & VPN (commercial)

CyberChef

The cyber-Swiss-army-knife for data (web UI)

Cloudbric WAF+ (Penta Security, 펜타시큐리티)

Penta Security cloud WAF, DDoS & bot protection (web UI)

6.67SIEM & Security Data

SIEM Overview

built-in tool

Wazuh

Open-source SIEM & XDR (self-hosted) (port 443, web UI)

Security Onion

NSM + SIEM + IDS Linux distro (self-hosted) (port 443, web UI)

Graylog

Centralized log management (self-hosted) (port 9000, web UI)

Splunk

Enterprise log search, SIEM and observability (port 8000, web UI)

Elastic Security

Elastic SIEM, XDR and cloud-security analytics (hybrid) (port 5601, web UI)

Microsoft Sentinel

Cloud-native SIEM and SOAR on Microsoft Azure (web UI)

Google Security Operations

Google SecOps SIEM and SOAR (formerly Chronicle) (web UI)

IBM QRadar SIEM

Enterprise SIEM for events, flows and offenses (hybrid) (port 443, web UI)

Sumo Logic Cloud SIEM

Cloud SIEM, detections and security analytics (web UI)

Rapid7 InsightIDR

Cloud SIEM with user behavior and incident detection (web UI)

LogRhythm SIEM

Enterprise SIEM, analytics and response platform (port 443, web UI)

Devo

Cloud-native security analytics and SIEM (web UI)

FortiSIEM

Fortinet SIEM for infrastructure and security events (port 443, web UI)

OpenText ArcSight

Enterprise SIEM and security operations platform (port 8443, web UI)

VirtualMetric DataStream

Security-data pipeline for collection, normalization and routing (port 443, web UI)

Cribl Stream

Vendor-neutral telemetry pipeline and security-data router (port 9000, web UI)

Logstash

ELK's ingest & transform pipeline (self-hosted) (port 9600, brew: logstash-full)

Vector

High-performance logs, metrics and security-data pipeline (port 8686, brew: vector)

Fluent Bit

Lightweight telemetry collector and forwarder (port 2020, brew: fluent-bit)

Fluentd

Plugin-rich log collector and routing layer (port 24224)

NXLog

Cross-platform Windows and Linux log collection

syslog-ng

Flexible syslog collection, filtering and forwarding (brew: syslog-ng)

OpenTelemetry Collector

Vendor-neutral telemetry collector and processor

6.68Secrets Scanning & Supply Chain Security

Snyk

Developer security — code, deps, containers & IaC (cloud + CLI) (web UI)

Dependabot

Automated dependency-update & security PRs (GitHub) (web UI)

Renovate

Automated dependency updates, any platform (self-hosted / app)

Trivy

All-in-one vuln, secret, IaC & SBOM scanner (self-hosted CLI)

Grype

Fast vulnerability scanner for images & SBOMs (self-hosted CLI)

Syft

Generate SBOMs from images & filesystems (self-hosted CLI)

Cosign

Sign & verify container images and artifacts (self-hosted CLI)

Sigstore

Keyless signing ecosystem — Cosign, Fulcio, Rekor (self-hosted / public)

Chainguard

Minimal, low/zero-CVE container images (cloud + chainctl) (web UI)

Socket

Proactive dependency / supply-chain attack detection (cloud + CLI) (web UI)

GitGuardian

Secrets detection across code & CI (cloud + ggshield CLI) (web UI)

Gitleaks

Open-source secrets scanner for git repos (self-hosted CLI)

TruffleHog

Find & VERIFY leaked secrets across code, git history, cloud & CI (self-hosted CLI)

OSV-Scanner

Dependency vulnerability scanner backed by OSV.dev (self-hosted CLI)

Lynis

Host security auditing & hardening for Unix/Linux/macOS (self-hosted CLI)

Semgrep Supply Chain

SAST + reachable-dependency (SCA) scanning (self-hosted CLI / cloud)

6.69Policy, Compliance & Governance

Vanta

Automated compliance — SOC 2, ISO 27001, HIPAA, GDPR (cloud) (web UI)

Drata

Continuous compliance automation & audit readiness (cloud) (web UI)

Secureframe

Compliance automation across 40+ frameworks (cloud) (web UI)

Sprinto

Compliance automation for fast-moving teams (cloud) (web UI)

Thoropass

Compliance + audit in one (formerly Laika, cloud) (web UI)

Hyperproof

Compliance operations & evidence management (cloud) (web UI)

OneTrust

Privacy, GRC & data governance suite (cloud) (web UI)

LogicGate Risk Cloud

No-code GRC & risk workflow platform (cloud) (web UI)

AuditBoard

Connected risk, audit & compliance platform (cloud) (web UI)

Eramba

Open-source GRC platform (self-hosted) (port 443, web UI)

SimpleRisk

Open-source risk management (self-hosted) (port 443, web UI)

OpenGRC

Open-source governance, risk & compliance (self-hosted) (port 8080, web UI)

OpenControl

Compliance-as-code documentation toolkit (self-hosted CLI)

Open Policy Agent (OPA)

General-purpose policy engine, Rego (self-hosted CLI) (port 8181)

Conftest

Test config files against OPA/Rego policies (CLI)

OPA Gatekeeper

OPA policy admission controller for Kubernetes (self-hosted)

Kyverno

Kubernetes-native policy engine, no new language (self-hosted)

HashiCorp Sentinel

Policy as code for the HashiCorp stack (CLI)

Checkov

Static policy scanning for IaC (self-hosted CLI)

Prowler

Open-source multi-cloud security & compliance scanner (CLI)

Scout Suite

Multi-cloud security-auditing tool (CLI)

CloudQuery

Cloud asset inventory as SQL (self-hosted CLI)

Steampipe

Query cloud APIs with SQL + compliance mods (CLI)

Cloud Custodian

Rules engine for cloud governance & remediation (CLI)

AWS Config

Native AWS resource configuration & compliance (API) (web UI)

AWS Security Hub

Aggregated AWS security findings & standards (API) (web UI)

OpenFGA

Open-source fine-grained authorization (Zanzibar-style, self-hosted) (port 8080)

Authzed / SpiceDB

Zanzibar-style permissions database (self-hosted / cloud) (port 50051)

Permify

Open-source fine-grained authorization service (self-hosted) (port 3476)

Aserto / Topaz

Authorization built on OPA + Zanzibar (self-hosted / cloud) (port 8383)

immudb

Immutable, cryptographically-verifiable database / audit log (self-hosted) (port 3322)

Securiti

Data privacy, security & governance platform (cloud) (web UI)

BigID

Data discovery, privacy & governance at scale (cloud) (web UI)

DataGrail

Privacy platform — DSR & data mapping automation (cloud) (web UI)

Transcend

Privacy & data-rights automation, incl. AI governance (cloud) (web UI)

MineOS

Data-governance & privacy operations platform (cloud) (web UI)

Osano

Consent management & privacy compliance (cloud) (web UI)

OpenMetadata

Open-source metadata, catalogue & lineage platform (self-hosted) (port 8585, web UI)

DataHub

Open-source metadata platform & data catalogue (self-hosted) (port 9002, web UI)

Amundsen

Open-source data discovery & metadata engine (self-hosted) (port 5000, web UI)

Apache Atlas

Metadata & governance for the Hadoop/data ecosystem (self-hosted) (port 21000, web UI)

Microsoft Purview

Data governance, compliance, retention & eDiscovery (cloud) (web UI)

Google Vault

Retention, legal hold & eDiscovery for Google Workspace (cloud) (web UI)

Smarsh

Communications capture, archiving & supervision (cloud) (web UI)

Logikcull

Self-service eDiscovery & legal hold (cloud, Reveal) (web UI)

Everlaw

Cloud litigation & eDiscovery platform (cloud) (web UI)

6.70MDM & Device Management

Apple Business Manager

built-in tool

Kandji

Apple MDM + endpoint security & compliance (agent + API)

Mosyle

Apple MDM + endpoint security (agent + API)

Jamf Pro

Apple MDM — device management & compliance (agent + API)

Microsoft Intune

Cross-platform MDM/MAM in Microsoft 365 (cloud + Graph API)

Addigy

Cloud Apple MDM for MSPs & IT teams (agent + API)

SimpleMDM

Straightforward Apple MDM with a clean REST API (cloud)

JumpCloud

Cloud directory + cross-platform MDM & SSO (agent + API)

Fleet (Apple MDM)

Open-source MDM + osquery for cross-platform device ops (self-hosted) (port 8080, web UI)

Munki

Open-source macOS software deployment (self-hosted)

MicroMDM

Open-source, self-hosted Apple MDM server — the Profile Manager replacement (port 8080)

NanoMDM

Minimal, scalable open-source Apple MDM server (port 9000)

AutoPkg

Automated macOS software packaging (CLI)

baramundi Management Suite

Modular UEM, patching, inventory and endpoint automation (port 443, web UI)

6.71Logging & Observability

Kibana

ELK's search & dashboard UI (self-hosted) (port 5601, web UI, brew: kibana-full)

Loki

Grafana's log store — like Prometheus, for logs (self-hosted) (port 3100, brew: loki)

Elastic Cloud

Hosted Elasticsearch, Kibana and observability (web UI)

Dozzle

Live Docker container log viewer (port 8080, web UI)

6.72Incident Management & On-Call

PagerDuty

On-call scheduling & incident response (cloud API) (web UI)

Opsgenie

Alerting & on-call by Atlassian (cloud API) (web UI)

incident.io

Slack-native incident response & on-call (cloud API) (web UI)

Rootly

Slack-native incident management (cloud API) (web UI)

6.73Status Pages

Statuspage

Atlassian's hosted status pages (cloud API) (web UI)

Better Stack

Uptime monitoring, incidents & status pages (cloud API) (web UI)

Gatus

Automated health checks + status page (port 8080, web UI)

6.74Mining

Mining Rigs

built-in tool

Braiins OS+

Open ASIC firmware (Antminer) — autotuning + API (port 4028, web UI)

Hive OS

Cloud mining fleet OS & dashboard (web UI)

Awesome Miner

Windows-based mining management for large fleets (web UI)

LuxOS / Foreman

ASIC firmware (LuxOS) & Foreman fleet management (port 4028, web UI)

6.75ML Workbench

MLflow

ML experiment tracking & model registry (self-hosted) (port 5000, web UI)

pandas

The standard Python DataFrame library

Polars

Fast multicore DataFrame library (Rust core)

scikit-learn

Classic machine-learning library for Python

XGBoost

Gradient-boosted decision trees (high-accuracy tabular ML)

PyTorch

Deep-learning framework (GPU/MPS accelerated)

Kaggle

Datasets, notebooks & competitions (CLI)

Kubeflow

ML toolkit & pipelines on Kubernetes (web UI)

ClearML

Experiment tracking, orchestration & MLOps (self-hostable) (port 8080, web UI)

Weights & Biases (Local)

Self-hosted experiment tracking & dashboards (port 8080, web UI)

DVC Studio

Data/model version control + experiment dashboard (web UI)

6.76AI Governance & Safety

Langfuse

Open-source LLM observability & tracing (self-hosted / cloud) (port 3000, web UI)

Helicone

LLM observability & gateway — logs, costs, caching (self-hosted / cloud) (web UI)

Arize Phoenix

Open-source LLM tracing & evaluation (self-hosted) (port 6006, web UI)

OpenLLMetry

OpenTelemetry instrumentation for LLM apps (SDK)

Promptfoo

Prompt/RAG testing, evals & LLM red-teaming (self-hosted CLI)

Ragas

Evaluation framework for RAG pipelines (Python)

Guardrails AI

Input/output validation guardrails for LLMs (Python)

NeMo Guardrails

Programmable guardrails for LLM conversations (NVIDIA, Python)

Lakera Guard

Real-time GenAI security — prompt-injection firewall (cloud / self-host) (web UI)

Protect AI

AI/ML security — model scanning & ML supply chain (cloud + OSS) (web UI)

garak

LLM vulnerability scanner / red-teaming (self-hosted CLI)

TruLens

Evaluation & tracking for LLM apps — feedback functions (Python) (web UI)

WhyLabs

AI observability & data/LLM monitoring (cloud + whylogs) (web UI)

Fiddler AI

AI observability & model monitoring with explainability (cloud) (web UI)

Credo AI

AI governance, risk & compliance platform (cloud) (web UI)

Holistic AI

AI governance, risk & audit platform (cloud + OSS) (web UI)

6.77GPU Infrastructure

NVIDIA DCGM

NVIDIA Data Center GPU Manager — telemetry & health (port 5555)

DCGM Exporter

Export NVIDIA GPU metrics to Prometheus (port 9400)

Backend.AI (Lablup, 래블업)

Lablup's GPU / AI-infrastructure orchestration platform (web UI)

6.78Speech AI

Handy

Free local push-to-talk speech-to-text (Whisper)

Wispr Flow

AI voice dictation that types into any app

Voicebox

Open-source local voice-to-text for macOS

Scriberr

Self-hosted audio transcription app (WhisperX) with speaker diarization (port 8080, web UI)

Whisper

OpenAI's speech-to-text model (Python)

Whisper.cpp

Fast C/C++ Whisper inference (CPU/Metal)

Faster Whisper

CTranslate2 Whisper — up to 4× faster

Coqui TTS

Open-source text-to-speech & voice cloning (port 5002, web UI)

Piper TTS

Fast, local neural text-to-speech

VibeVoice

Microsoft's long-form, multi-speaker TTS

Kokoro TTS

Small, fast, high-quality open-weight TTS (82M)

Meetily

Local AI meeting notetaker (desktop app)

CLOVA Speech (NAVER Cloud)

NAVER CLOVA long-form speech recognition (web UI)

CLOVA Voice / CLOVA Dubbing TTS (NAVER Cloud)

NAVER CLOVA Voice premium Korean/English TTS (web UI)

6.79Image & Video AI

ComfyUI

Node-graph Stable Diffusion / video workflows (port 8188, web UI)

AUTOMATIC1111 WebUI

Stable Diffusion web UI (txt2img/img2img) (port 7860, web UI)

Tesseract OCR

Open-source OCR engine — images/PDF scans to text (CLI)

InvokeAI

Pro Stable Diffusion studio (Unified Canvas) (port 9090, web UI)

Fooocus

Simplest Stable Diffusion — type a prompt, get art (port 7865, web UI)

AutoShorts

Local video → 9:16 short-clip finder (desktop)

Opus Clip

AI viral-clip generator (cloud SaaS + API) (web UI)

Twelve Labs (트웰브랩스)

Korean-founded video-understanding AI (Marengo, Pegasus) (web UI)

6.80MCP

MCP Servers

built-in tool

Fleet Skill

built-in tool

MCP Server

built-in tool

6.81Self-Hosted Apps

PhotoPrism

AI-powered photo library (port 2342, web UI)

ResourceSpace

Open-source digital asset management (self-hosted) (port 80, web UI)

Pimcore

Open-source PIM / DAM / CMS platform (self-hosted) (port 80, web UI)

Paperless-ngx

Scan, OCR & archive documents (port 8000, web UI)

Paperless-AI

AI auto-tagging & chat for Paperless-ngx (port 3000, web UI)

FreshRSS

Self-hosted RSS reader (PHP) (port 80, web UI)

Miniflux

Minimalist RSS reader (Go) (port 8080, web UI, brew: miniflux)

Mixpost

Self-hosted social media scheduling (port 80, web UI)

Mealie

Self-hosted recipe manager & meal planner (port 9000, web UI)

Tandoor

Recipe manager & meal planner (port 8080, web UI)

Grocy

Groceries & household ERP (port 80, web UI)

Dashy

Feature-rich homelab dashboard (port 4000, web UI)

Heimdall

Simple application start page (port 80, web UI)

Homer

Static, fast services dashboard (YAML) (port 8080, web UI)

6.82Web3

The Graph

built-in tool

Foundry

Fast Solidity toolkit (forge/cast/anvil) (port 8545)

Anvil

Local Ethereum testnet (Foundry) (port 8545)

Solidity

Smart-contract compiler (solc)

Hardhat

Ethereum dev environment (Node.js) (port 8545)

Ganache

Personal Ethereum blockchain (dev) (port 8545)

IPFS

Distributed file system (Kubo) (port 5001, web UI, brew: ipfs)

Ceramic

Decentralized data network (ComposeDB) (port 7007)

6.83Crypto

Bitcoin Core

Full Bitcoin node (bitcoind) (port 8332)

Ethereum Node

go-ethereum (geth) execution node (port 8545)

BTCPay Server

Self-hosted Bitcoin payment processor (port 23000, web UI)

XMRig

Monero (RandomX) CPU/GPU miner

6.84RPC Services

Alchemy

built-in tool

Infura

built-in tool

6.85Tools

Apache Tika

Content detection & text/metadata extraction (port 9998)

Gotenberg

Stateless API to convert documents to PDF (port 3000)

LanguageTool

Self-hosted grammar & style checker (offline Grammarly alternative) (port 8081)

LibreTranslate

Self-hosted machine-translation API (offline DeepL/Google Translate alternative) (port 5000, web UI)

SearXNG

Private metasearch engine (self-hosted) (port 8080, web UI)

Stirling-PDF

Self-hosted PDF toolbox (merge/split/OCR…) (port 8080, web UI)

IT-Tools

Handy developer/IT utilities in one page (port 80, web UI)

Excalidraw

Virtual hand-drawn whiteboard (port 80, web UI)

Penpot

Open-source design & prototyping (Figma alt.) (port 9001, web UI)

Whoogle Search

Private, ad-free Google results proxy (port 5000, web UI)

HTML Anything

Agentic HTML editor driven by your local AI CLI (port 3000, web UI)

Harper

Offline, Rust grammar checker (LanguageTool alt.)

Public Data Portal (공공데이터포털, data.go.kr)

Korean government open-data portal (one service key) (web UI)

NTS Business Registration Status API (국세청 사업자등록 상태조회)

NTS check: is a Korean business number active or closed (web UI)

6.86Home Automation

Apple Home

built-in tool

Power Control

built-in tool

Nori / SuperNori AI

AI family hub display + proactive family AI agent (cloud + device) (web UI)

Home Assistant

Open-source home automation hub (port 8123, web UI)

Music Assistant

Self-hosted music library + multi-room player server (Home Assistant companion) (port 8095, web UI)

Eve

Eve Energy smart plugs and Eve sensors (HomeKit / Matter) via Home Assistant

Node-RED

Flow-based automation wiring (port 1880, web UI, brew: node-red)

Homebridge

Bridge non-HomeKit devices to Apple Home (port 8581, web UI)

ESPHome

Firmware for ESP IoT devices (Home Assistant) (port 6052, web UI)

openHAB

Vendor-neutral automation platform (port 8080, web UI)

6.87Cameras

motionEye

Web frontend for motion (DIY NVR) (port 8765, web UI)

RTSP Cameras

Any RTSP-streaming IP camera (port 554)

ONVIF Cameras

Standards-based camera discovery & control (port 80, web UI)

go2rtc

Camera stream restreamer (RTSP/WebRTC/HLS) (port 1984, web UI)

Tapo Cameras

TP-Link Tapo Wi-Fi cameras (RTSP/ONVIF) (port 554)

Frigate

NVR with real-time object detection (port 5000, web UI)

Scrypted

High-performance camera hub (port 11080, web UI)

Shinobi

Open-source video management (CCTV) (port 8080, web UI)

ZoneMinder

Full-featured CCTV / video surveillance (port 8095, web UI)

Agent DVR

Cross-platform NVR with AI detection (self-hosted) (port 8090, web UI)

Blue Iris

Powerful Windows NVR (run on a Windows host) (port 81, web UI)

6.88IoT

SwitchBot

built-in tool

Zigbee

built-in tool

Zigbee2MQTT

Bridge Zigbee devices to MQTT (no vendor hub) (port 8080, web UI)

SMLIGHT SLZB (SLZB-OS)

Network Zigbee/Thread coordinators — SLZB-06, SLZB-07, SLZB-MR series, Ultima (port 80, web UI)

Z-Wave (Z-Wave JS UI)

Control Z-Wave devices via MQTT + web UI (port 8091, web UI)

Matter

Commission & control Matter devices (port 5580)

Thread

Low-power mesh for Matter devices

OpenThread Border Router

Run your own Thread border router (self-hosted)

Bluetooth (BLE)

BLE sensors & trackers

Bluetooth Beacons

iBeacon / Eddystone proximity beacons (BLE)

TP-Link Kasa & Tapo

Kasa & Tapo plugs/bulbs/strips + the kasa CLI

Amazon Alexa

Voice assistant ecosystem

Google Home

Google Home / Nest ecosystem

HomePod

Apple smart speaker & Home hub (AirPlay 2 / Matter / Thread)

Apple HomeView

Apple smart-home display & Thread border router (AirPlay 2)

6.89MQTT Brokers

MQTT Message Bus

built-in tool

Sidekiq

Background jobs for Ruby (threaded workers on Redis)

Mosquitto

Eclipse MQTT broker (port 1883, brew: mosquitto)

EMQX

Scalable, clustered MQTT broker (port 1883, web UI, brew: emqx)

HiveMQ

Enterprise MQTT broker (Java) (port 1883, web UI)

6.90POS Systems

Toast POS

Restaurant POS platform (cloud) (web UI)

Lightspeed

Retail & hospitality POS (cloud) (web UI)

Floranext

All-in-one florist software — POS, e-commerce & orders (cloud) (web UI)

Toss Place (토스플레이스)

Toss Place POS — store orders & payments API (web UI)

6.91CRM & Loyalty

Salesforce

The enterprise CRM (cloud) (web UI)

HubSpot

CRM + marketing/sales hubs (cloud) (web UI)

Zoho CRM

Affordable full-suite CRM (cloud) (web UI)

SuiteCRM

Self-hosted open-source CRM (PHP) (port 80, web UI)

EspoCRM

Lightweight self-hosted CRM (PHP) (port 80, web UI)

Odoo CRM

CRM inside the open-source ERP (Python) (port 8069, web UI)

Pipedrive

Sales-pipeline-first CRM (cloud) (web UI)

Square Loyalty

Points & rewards on Square (cloud) (web UI)

Loyalzoo

Digital loyalty for independents (cloud) (web UI)

Thanx

Guest engagement & loyalty for restaurants (web UI)

Punchh

Enterprise restaurant loyalty (PAR, cloud) (web UI)

VoucherVault

Self-hosted vouchers, gift cards & loyalty (port 8000, web UI)

6.92Helpdesk & Ticketing

Zammad

Open-source helpdesk & ticketing (self-hosted) (port 8080, web UI)

osTicket

Classic open-source support ticket system (PHP/MySQL) (port 80, web UI)

Freshdesk

Cloud helpdesk / customer support (API) (web UI)

Channel Talk (채널톡 / Channel.io)

Korean customer chat, CRM & helpdesk (web UI)

Happytalk (해피톡)

Korean chat-based customer support (web UI)

6.93IT Assets

GLPI

Asset inventory & ITSM with CMDB (PHP/MySQL) (port 80, web UI)

Snipe-IT

Open-source IT asset management (PHP/MySQL) (port 80, web UI)

AssetTiger

Cloud asset tracking with barcodes (API) (web UI)

Lansweeper

IT asset discovery & inventory (cloud/on-prem API) (web UI)

Workwize

Global IT equipment lifecycle & logistics (cloud API) (web UI)

6.94Project Management

Jira

Issue tracking & agile project management (cloud API) (web UI)

Linear

Fast issue tracking for product teams (cloud, GraphQL API) (web UI)

Taiga

Open-source agile project management (self-hosted) (port 80, web UI)

OpenProject

Open-source PM with Gantt & roadmaps (self-hosted) (port 80, web UI)

Plane

Open-source Jira alternative (self-hosted) (port 80, web UI)

Leantime

Open-source PM for non-project managers (PHP/MySQL) (port 80, web UI)

Basecamp

Project management & team collaboration (cloud API) (web UI)

monday.com

Work OS — boards, projects & workflows (cloud API) (web UI)

Vikunja

Self-hosted to-do / task manager (port 3456, web UI)

Planka

Realtime kanban board (Trello alternative) (port 1337, web UI)

Kimai

Self-hosted time tracking (port 8001, web UI)

Rize

AI time tracker (cloud, GraphQL API) — backend uptime, plan & AI-credit cost (web UI)

Focalboard

Self-hosted project boards (Trello/Notion alt.) (port 8000, web UI)

6.95PMS

Channel Manager

built-in tool

SuiteOp

built-in tool

SympleHost

AI property management for short-term rentals (cloud) (web UI)

Breezeway

Property operations & services for STRs (cloud) (web UI)

Operto

Smart-lock & guest-experience automation for STRs (cloud) (web UI)

PriceLabs

Dynamic pricing & revenue management for STRs (cloud) (web UI)

Beyond

Dynamic pricing, insights & direct booking for STRs (cloud) (web UI)

Wheelhouse

Dynamic pricing & market analytics for STRs (cloud) (web UI)

AirDNA

Short-term-rental market data & analytics (cloud) (web UI)

RankBreeze

Airbnb listing optimization & rank tracking (cloud) (web UI)

Truvi

Direct-booking website builder for STRs (cloud) (web UI)

Hostaway

Short-term-rental PMS & channel manager (cloud API) (web UI)

Guesty

STR property-management platform (Open API) (web UI)

OwnerRez

Vacation-rental PMS for owners & small managers (v2 API) (web UI)

Lodgify

Direct-booking website builder + channel manager (web UI)

Uplisting

STR PMS / channel manager (invite-only API) (web UI)

Streamline VRS

Enterprise vacation-rental management (partner-gated API) (web UI)

RemoteLock

Cloud access control for smart locks (REST API) (web UI)

Minut

Noise & occupancy sensors for rentals (Enterprise API) (web UI)

NoiseAware

Noise monitoring for rentals (partner-provisioned API) (web UI)

Hospitable

Guest-messaging automation & STR management (cloud) (web UI)

Hostfully

STR property-management platform & digital guidebooks (cloud) (web UI)

Boostly

SMS marketing & direct-booking growth for STRs (cloud) (web UI)

Cloudbeds

Hotel PMS, booking engine & channel manager (cloud) (web UI)

Beds24

PMS & channel manager with a deep API (cloud) (web UI)

AirHost

Japanese STR PMS & channel manager (cloud) (web UI)

HappyGuest

Digital guest directory & concierge for hospitality (cloud) (web UI)

Alexa Smart Properties

Managed Alexa for hotels & senior living (cloud) (web UI)

QloApps

Open-source hotel reservation system (port 80, web UI)

HotelDruid

Hotel/B&B management & bookings (port 80, web UI)

OpenHotel PMS

Open property-management system (web UI)

BookStack

Wiki/docs for SOPs & property info (port 80, web UI)

Easy!Appointments

Open-source appointment scheduling (port 80, web UI)

Turno

Vacation-rental cleaning & turnover scheduling (cloud) (web UI)

Rentals (Laravel)

Custom Laravel vacation-rental app (port 80, web UI)

6.96Meeting Rooms & Desk Booking

Skedda

Desk & space booking (cloud API) (web UI)

Robin

Room scheduling & desk booking (cloud API) (web UI)

Envoy Workplace

Workplace, visitor & desk management (cloud API) (web UI)

YAROOMS

Meeting room & desk booking (cloud API) (web UI)

OfficeSpace

Space management & desk/room booking (cloud API) (web UI)

Condeco (Eptura)

Enterprise room & desk booking (cloud API) (web UI)

DeskFlex

Desk & room reservation system (cloud API) (web UI)

Matrix Booking

Room, desk & resource booking (cloud API) (web UI)

6.97Coworking & Shared Spaces

OfficeRnD

Coworking & flex-space management (cloud API) (web UI)

Nexudus

Coworking management & white-label platform (cloud API) (web UI)

Optix

App-first coworking management (cloud API) (web UI)

Cobot

Coworking space management (cloud API) (web UI)

6.98Facilities & Maintenance

IBM Maximo

Enterprise asset management & CMMS (cloud/self-managed API) (web UI)

FMX

Facilities management & maintenance (cloud API) (web UI)

Archibus

IWMS — facilities, real estate & assets (API) (web UI)

6.99Accounting & ERP

Money Forward Cloud

Japanese cloud accounting & back office (cloud) (web UI)

freee

Japanese cloud accounting & HR (cloud) (web UI)

Xero

Cloud accounting for small business (cloud) (web UI)

ERPNext

Open-source ERP — accounting, inventory, HR (self-hosted) (port 8080, web UI)

Odoo

Open-source ERP suite — self-hosted (Python + PostgreSQL) (port 8069, web UI)

QuickBooks

Intuit cloud accounting (cloud) (web UI)

Plaid

Bank account linking & financial data (cloud API)

Expensify

Expense & receipt management (cloud API) (web UI)

Firefly III

Self-hosted personal finance manager (port 8080, web UI)

Actual Budget

Fast local-first envelope budgeting (port 5006, web UI)

Ghostfolio

Open-source wealth/investment tracker (port 3333, web UI)

Invoice Ninja

Self-hosted invoicing & payments (port 80, web UI)

Maybe

Open-source personal finance / net worth (port 3000, web UI)

Popbill (팝빌)

E-tax invoices, cash receipts, fax & messaging API (web UI)

Barobill (바로빌)

E-tax invoices, Hometax & bank data (SOAP API) (web UI)

Sendbill (센드빌)

Korean e-tax invoice API (web UI)

Bolta (볼타)

E-tax invoice SaaS with a REST API (web UI)

CODEF (코드에프)

Korean financial & public-data aggregation API (web UI)

Hyphen API Market (하이픈)

Korean financial & public-document data API market (web UI)

Douzone Bizon (더존) — Amaranth 10 / WEHAGO / Smart A

Korean ERP & groupware (Amaranth, WEHAGO) (web UI)

6.100E-Signature

Docusign eSignature

The market-leading e-signature platform (cloud API) (web UI)

Adobe Acrobat Sign

Adobe's e-signature service (cloud API) (web UI)

Dropbox Sign

E-signature API, formerly HelloSign (cloud) (web UI)

PandaDoc

Proposals, quotes & contracts with e-signature (cloud API) (web UI)

SignNow

Business e-signature from airSlate (cloud API) (web UI)

Zoho Sign

E-signature in the Zoho suite (cloud API) (web UI)

BoldSign

E-signature API from Syncfusion (cloud) (web UI)

SignWell

Simple e-signature with a straightforward API (cloud) (web UI)

Yousign

European eIDAS e-signature, simple to qualified (cloud API) (web UI)

Skribble

Swiss/EU qualified e-signatures — eIDAS & ZertES (cloud API) (web UI)

GMO Sign (GMOサイン)

Japanese e-contracts from GMO GlobalSign (cloud API) (web UI)

CloudSign (クラウドサイン)

Japanese e-contract service from Bengo4.com (cloud API) (web UI)

freee Sign (freeeサイン)

Japanese e-contracts from freee, ex-NINJA SIGN (cloud) (web UI)

Modusign (모두싸인)

Korean e-signature & e-contract platform (cloud API) (web UI)

eformsign (이폼사인)

Korean e-forms & e-contracts from Forcs (cloud API) (web UI)

DocuSeal

Open-source document signing (self-hosted or cloud) (port 3060, web UI)

Documenso

Open-source DocuSign alternative (self-hosted or cloud) (port 3000, web UI)

OpenSign

Open-source e-signature (self-hosted or cloud) (web UI)

6.101Healthcare

OpenEMR

Open-source EHR & practice management (PHP/MySQL) (port 80, web UI)

OpenMRS

Open-source medical record platform (Java) (port 8080, web UI)

GNU Health

Hospital & health information system (Python/Tryton) (port 8000, web UI)

LibreHealth

Open-source EHR / toolkit (PHP/MySQL) (port 80, web UI)

Orthanc

Lightweight DICOM server / PACS (REST API) (port 8042, web UI)

OpenDolphin

Open-source EHR / electronic karte (Japan) (port 8080, web UI)

ORCA

Japan Medical Association receipt/billing system (port 8000, web UI)

6.102Automation & Workflows

Automatio.ai

AI no-code web automation & scraping (cloud) (web UI)

Zite

AI app & workflow builder (cloud) (web UI)

AppSheet

Google no-code app builder from a spreadsheet/DB (cloud) (web UI)

Make (Integromat)

Visual scenario automation + AI agents — 3,000+ apps (cloud) (web UI)

Zapier

Cloud iPaaS — connect 7,000+ apps (cloud) (web UI)

n8n

Source-available workflow automation (self-hosted) (port 5678, web UI)

Pipedream

Developer-first workflow automation (cloud) (web UI)

Power Automate

Microsoft cloud + desktop automation (cloud) (web UI)

Activepieces

Open-source no-code automation (self-hosted) (port 8080, web UI)

Windmill

Scripts → workflows & internal apps (self-hosted) (port 8000, web UI)

Huginn

Self-hosted agents that watch & act (self-hosted) (port 3000, web UI)

Flowise

Drag-and-drop LLM app builder (self-hosted) (port 3000, web UI)

Langflow

Visual builder for LLM/agent flows (self-hosted) (port 7860, web UI)

Dify

Open-source LLMOps / AI app platform (self-hosted) (port 80, web UI)

Elgato Stream Deck

Hardware macro keypad with LCD keys

Touch Portal

Turn a phone/tablet into a macro deck (no extra hardware)

Bitfocus Companion

Open-source control surface for larger automation workflows (port 8000, web UI)

X-keys

Programmable keypads for NOCs & operations

Matric

Phone macro deck with live metric tiles

QMK / VIA

Open keyboard firmware + live key remapping

6.103Workflow Orchestration

Temporal

Durable execution platform for reliable workflows (port 8233, web UI)

Restate

Durable execution for resilient services (single binary) (port 9070, web UI)

Apache Airflow

Programmatic data-pipeline orchestration (DAGs) (port 8080, web UI)

6.104HRIS Integration

Unified.to (HRIS API)

Unified API across HRIS providers (web UI)

Apideck (HRIS API)

Unified HRIS API & integration platform (web UI)

Truto

Unified API for HRIS & more (cloud) (web UI)

Bindbee

Unified HRIS / employment API (cloud) (web UI)

flex (플렉스)

Korean all-in-one HR (people, attendance, payroll) (web UI)

Shiftee (시프티)

Korean shift scheduling & attendance (web UI)

Saramin (사람인)

Korean job-postings API (Saramin) (web UI)

Wanted (원티드)

Korean recruiting platform API (Wanted) (web UI)

6.105VoIP & Telephony

Asterisk

The open-source PBX engine (self-hosted) (port 5060, brew: asterisk)

FreePBX

Web GUI distro on Asterisk (self-hosted, Linux) (port 80, web UI)

FreeSWITCH

Carrier-grade softswitch (self-hosted) (port 5060)

FusionPBX

Multi-tenant web GUI on FreeSWITCH (self-hosted) (port 443, web UI)

Issabel PBX

Unified-communications distro on Asterisk (self-hosted) (port 443, web UI)

Kamailio

High-performance SIP server/proxy (self-hosted) (port 5060)

OpenSIPS

SIP proxy/router for large platforms (self-hosted) (port 5060)

PBXact

Sangoma's commercial PBX (appliance/cloud) (port 80, web UI)

Plivo

Voice & SMS API platform (cloud) (web UI)

Telnyx

Carrier-grade voice, SIP trunking & numbers (cloud) (web UI)

Bird (MessageBird)

Omnichannel CPaaS — SMS, voice, WhatsApp (cloud) (web UI)

Sinch

Global SMS, voice & verification CPaaS (cloud) (web UI)

Twilio Voice

Programmable voice calls & TwiML (cloud) (web UI)

VitalPBX

Modern Asterisk-based PBX distro (self-hosted) (port 443, web UI)

Vonage APIs

Voice, SMS & video APIs (cloud, ex-Nexmo) (web UI)

Wazo Platform

API-first open telecom platform (self-hosted) (port 443, web UI)

Yate

Flexible telephony engine — SIP/H.323/SS7 (self-hosted) (port 5060)

3CX

Commercial software PBX (self-hosted or hosted) (port 443, web UI)

6.106Contact Centre & IVR

Twilio Studio

Drag-and-drop IVR & call-flow builder (cloud) (web UI)

Twilio Flex

Programmable contact centre (cloud) (web UI)

Amazon Connect

AWS cloud contact centre (cloud) (web UI)

Genesys Cloud

Enterprise CX platform — Architect IVR (cloud) (web UI)

Five9

CCaaS with strong outbound dialing (cloud) (web UI)

Talkdesk

AI-forward cloud contact centre (cloud) (web UI)

RingCentral Contact Center

CCaaS on the RingCentral platform (cloud) (web UI)

8x8 Contact Center

UCaaS + CCaaS in one platform (cloud) (web UI)

Vonage Contact Center

Salesforce-centric contact centre (cloud) (web UI)

Dialpad Ai Contact Center

AI-native contact centre & real-time coaching (cloud) (web UI)

Aircall

Lightweight cloud call centre for teams (cloud) (web UI)

CloudTalk

Cloud calling for support & sales (cloud) (web UI)

GoTo Connect

Phone system + contact centre (cloud) (web UI)

Zoom Contact Center

Omnichannel CC on the Zoom platform (cloud) (web UI)

Freshdesk Contact Center

Freshworks phone channel (ex-Freshcaller, cloud) (web UI)

Zendesk Talk

Voice channel inside Zendesk Support (cloud) (web UI)

Intermedia Contact Center

CCaaS bundled with Intermedia Unite (cloud) (web UI)

6.107SEO & Marketing

Analytics

built-in tool

IndexNow Manager

built-in tool

Cloudflare Analytics

Privacy-first web & edge analytics (cloud) (web UI)

Ahrefs

Backlinks, keywords & rank tracking (cloud) (web UI)

Google Search Console

Search performance, indexing & sitemaps (cloud) (web UI)

Google Analytics

GA4 web & app analytics (cloud) (web UI)

PageSpeed Insights / CrUX

Core Web Vitals & Lighthouse scores per URL (cloud) (web UI)

Plausible Analytics

Privacy-first, self-hostable web analytics (port 8000, web UI)

Umami

Simple, self-hosted, privacy-focused analytics (port 3000, web UI)

Matomo

Full GA-style analytics, self-hosted (web UI)

GoatCounter

Minimal, open-source web analytics (port 8081, web UI)

PostHog

Self-hostable product analytics suite (port 8000, web UI)

Bing Webmaster Tools

Bing search performance & URL submission (cloud) (web UI)

Yandex Webmaster

Yandex search performance & indexing (cloud) (web UI)

Semrush

Keywords, competitors & site audit (cloud) (web UI)

Moz

Domain Authority & backlinks (cloud) (web UI)

Majestic

Backlink index — Trust & Citation Flow (cloud) (web UI)

DataForSEO

SERP, keyword & backlink data API (cloud) (web UI)

SerpApi

Real-time SERP scraping API (cloud) (web UI)

Yahoo! JAPAN Ads & Search

Japan's #2 search/ads ecosystem (cloud) (web UI)

Ptengine

Analytics + heatmaps, popular in Japan (web UI)

KARTE

Real-time user/CX analytics (PLAID, JP) (web UI)

AdEbis (アドエビス)

Ad attribution & marketing analytics (JP) (web UI)

Naver Search Advisor

Naver's Search Console (KR) — IndexNow partner (web UI)

Naver Analytics

Naver's free web analytics (KR) (web UI)

Beusable

Heatmap & UX analytics (KR) (web UI)

Airbridge

Mobile attribution & analytics (AB180, KR) (web UI)

adbrix

Mobile attribution & analytics (IGAWorks, KR) (web UI)

Google Lighthouse

Audit performance, PWA, SEO & accessibility

Shlink

Self-hosted URL shortener with REST API & analytics (port 8080, web UI)

YOURLS

Your Own URL Shortener (PHP) (port 80, web UI)

Kutt

Modern open-source URL shortener (port 3000, web UI)

Polr

Minimalist self-hosted link shortener (Laravel) (port 80, web UI)

Dub.co

Open-source link management for marketing teams (port 8888, web UI)

Nahpet

Self-hosted URL shortener with custom domains & analytics (port 3000, web UI)

Flink (URL Shortener)

Self-hosted shortener that keeps the path after the alias (port 8080, web UI)

Chhoto URL

Tiny, fast self-hosted URL shortener (Rust) (port 4567, web UI)

NAVER Search API (네이버 검색 API, Naver Developers)

Naver blog / news / shop / local search API (web UI)

Naver Search Ad (네이버 검색광고)

Naver keyword-ad account, bizmoney balance & stats API (web UI)

Kakao Moment (카카오모먼트)

Kakao display-ad platform API (web UI)

Kakao Keyword Ad (카카오 키워드광고)

Kakao / Daum keyword-ad API (web UI)

Mobon (모비온)

Korean retargeting ad network (web UI)

ACE Counter (에이스카운터)

Korean web analytics (ACE Counter) (web UI)

Daum Webmaster Tools (Daum 웹마스터도구)

Daum/Kakao site registration & search insights (web UI)

6.108Conversion Rate Optimization

Optimizely

Enterprise A/B testing & experimentation (cloud) (web UI)

VWO

A/B testing, heatmaps, surveys (cloud) (web UI)

AB Tasty

Personalization & experimentation (cloud) (web UI)

Statsig

Modern experimentation & feature flags (cloud, API) (web UI)

GrowthBook

Self-hosted A/B testing & feature flags (open-source) (port 3100, web UI)

Mixpanel

Product analytics & funnels (cloud) (web UI)

Amplitude

Product analytics & journeys (cloud) (web UI)

Hotjar

Heatmaps & session recording (cloud) (web UI)

Microsoft Clarity

Free heatmaps & session recording (cloud) (web UI)

FullStory

Digital experience & session replay (cloud) (web UI)

Lucky Orange

Heatmaps, recordings, live chat (cloud) (web UI)

Mouseflow

Session replay & heatmaps (cloud) (web UI)

Heap

Autocapture funnels & journeys (cloud) (web UI)

Contentsquare

Experience analytics & journeys (cloud) (web UI)

UserVoice

Product feedback & feature requests (cloud) (web UI)

Canny

Feature-request boards (cloud, API) (web UI)

Survicate

Website & in-product surveys (cloud) (web UI)

Qualtrics

Experience-management surveys (cloud) (web UI)

LaunchDarkly

Enterprise feature-flag management (cloud, API) (web UI)

Unleash

Self-hosted feature-flag management (open-source) (port 4242, web UI)

Hackle (핵클)

Korean A/B testing & feature flags (web UI)

Groobee (그루비)

Korean personalisation & on-site marketing (web UI)

6.109Social Media

Buffer

Social media scheduling & publishing (cloud API) (web UI)

Postiz

Open-source, self-hosted social media scheduler (port 4007, web UI)

Postly

AI-powered social media publishing platform (web UI)

Post Planner

Content discovery & social scheduling (web UI)

Postcron

Multi-platform social media scheduler (web UI)

Publer

Social media scheduling & analytics (web UI)

Hootsuite

Social media management suite (cloud API) (web UI)

Later

Visual social scheduling (Instagram-first, cloud API) (web UI)

Metricool

Social analytics, scheduling & ads (cloud API) (web UI)

SocialPilot

Social scheduling for teams & agencies (cloud API) (web UI)

Mastodon

Self-hosted federated microblogging (ActivityPub) (web UI)

strfry

Fast C++ Nostr relay (single binary, one-click Docker) (port 7777)

nostr-rs-relay

Rust Nostr relay on SQLite (one-click Docker) (port 8080)

Nostream

TypeScript Nostr relay — Postgres, paid relays (Docker Compose) (port 8008)

HAVEN

Personal Nostr relay suite + Blossom media (Docker Compose) (port 3355, web UI)

Blossom Server

Nostr media/blob server — images & files (one-click Docker) (port 3000, web UI)

Pixelfed

Federated photo sharing (Instagram alt.) (port 80, web UI)

Lemmy

Federated link aggregator (Reddit alt.) (port 8536, web UI)

Misskey

Federated microblogging (rich Mastodon alt.) (port 3000, web UI)

NAVER BAND (밴드)

Naver group community app (BAND) (web UI)

6.110Media Servers

MediaMTX

RTSP/RTMP/HLS/WebRTC/SRT media server (port 8554, brew: mediamtx)

SRS

Simple Realtime Server — RTMP/WebRTC/SRT (port 1935, web UI)

Owncast

Self-hosted live streaming + chat (port 8080, web UI)

Restreamer

Restream one input to many platforms (port 8080, web UI)

Icecast

Audio streaming server (net radio) (port 8000, web UI, brew: icecast)

AzuraCast

Complete self-hosted radio station (port 80, web UI)

Jellyfin

Free home media server (Plex alternative) (port 8096, web UI, brew: jellyfin)

Plex Media Server

Popular home media server (port 32400, web UI)

Emby

Media server with live TV/DVR (port 8096, web UI)

PeerTube

Federated, P2P video platform (ActivityPub) (port 9000, web UI)

Navidrome

Self-hosted music server (Subsonic-compatible) (port 4533, web UI)

Audiobookshelf

Self-hosted audiobook & podcast server (port 13378, web UI)

Tvheadend

TV streaming server & DVR (DVB/IPTV) (port 9981, web UI)

TSDuck

MPEG transport-stream toolkit (CLI)

Wowza Streaming Engine

Commercial streaming server (RTMP/SRT/HLS) (port 8088, web UI)

Immich

Self-hosted photo & video backup (Google Photos alt.) (port 2283, web UI)

Channels DVR Server

Whole-home DVR for live TV & streaming (self-hosted) (port 8089, web UI)

Jellyseerr

Media request manager (Jellyfin/Plex/Emby) (port 5055, web UI)

Bazarr

Automatic subtitles for Sonarr/Radarr (port 6767, web UI)

Tdarr

Distributed media transcoding/health automation (port 8265, web UI)

Komga

Comics & manga server (self-hosted) (port 25600, web UI)

Kavita

Fast ebook/comic/manga server (port 5000, web UI)

RomM

Self-hosted ROM manager & player (port 8080, web UI)

Overseerr

Media request manager for Plex (port 5055, web UI)

Ombi

Media request system (Plex/Emby/Jellyfin) (port 3579, web UI)

Airsonic-Advanced

Self-hosted music streaming (Subsonic API) (port 4040, web UI)

Calibre-Web

Web reader/manager for a Calibre ebook library (port 8083, web UI)

Tautulli

Plex monitoring, history & stats (port 8181, web UI)

6.111Download Automation

qBittorrent

Open-source BitTorrent client with Web UI (self-hosted) (port 8080, web UI)

Transmission

Lightweight BitTorrent client + daemon (self-hosted) (port 9091, web UI)

SABnzbd

Usenet (NZB) downloader with Web UI (self-hosted) (port 8080, web UI, brew: sabnzbd)

NZBGet

Lightweight, efficient Usenet downloader (self-hosted) (port 6789, web UI)

Sonarr

Automated TV series management (self-hosted) (port 8989, web UI)

Radarr

Automated movie management (self-hosted) (port 7878, web UI)

Lidarr

Automated music collection management (self-hosted) (port 8686, web UI)

Readarr

Automated book & audiobook management (self-hosted) (port 8787, web UI)

Prowlarr

Indexer manager for the *arr stack (port 9696, web UI)

Tube Archivist

Self-hosted YouTube archive (index + watch) (port 8000, web UI)

Pinchflat

Self-hosted YouTube media downloader/archiver (port 8945, web UI)

6.112AV & Stage

Show Network

built-in tool

Generators

built-in tool

AV Feeds

built-in tool

Dante (Audinate)

Audio-over-IP networking (AoIP)

Q-SYS

QSC's AV processing & control platform (port 1710, web UI)

QLC+

Open-source DMX lighting control (port 9999, web UI)

grandMA3

MA Lighting console / onPC show control

grandMA2

MA Lighting grandMA2 console / onPC

Depence²

Real-time 3D previz & show control (Syncronorm)

PixMob

Crowd LED wearables for stadium light shows

Xylobands

RF-controlled LED wristbands for events

OBS Studio

Live production, streaming & recording (port 4455)

NDI

Video-over-IP for production (NDI) (port 5959)

Resolume Arena / Avenue

VJ / media-server software (port 8080, web UI)

MadMapper

Projection mapping & LED control

Liquidsoap

Scriptable radio/audio stream engine

MPV

Scriptable media player (CLI)

Kodi

Media centre with JSON-RPC remote (port 8080, web UI)

VLC

Player with HTTP/telnet remote interfaces (port 8080, web UI)

Yodeck

Cloud digital signage (Pi players) (web UI)

Screenly / Anthias

Digital signage — cloud or open source (port 80, web UI)

Google Cast / YouTube Cast

Chromecast casting & control (port 8009)

ArKaos GrandVJ / XT

Live VJ mixing & video mapping

ArKaos MediaMaster (ChamSys)

Stage media server for lighting desks

Syphon

GPU frame sharing between Mac apps

SRT (tools)

Secure Reliable Transport for live video (port 9710)

WebRTC (WHIP/WHEP)

Sub-second video in any browser (port 8889)

AirServer

Turn this Mac into an AirPlay/Cast/Miracast receiver

Reflector

AirPlay/Cast screen receiver (Squirrels)

Chrome Remote Desktop

Free remote control of this Mac (web UI)

rekordbox

AlphaTheta (Pioneer DJ) library & performance software

PRO DJ LINK

Pioneer/AlphaTheta CDJ & DJM network (UDP 50000–50002)

Engine DJ (Denon StageLinQ)

Denon DJ / Engine DJ — StageLinQ network

Ableton Live / Link

DAW + Ableton Link tempo sync

Beat Link Trigger

Pro DJ Link → MIDI / OSC / Ableton Link bridge

ShowKontrol (TCNet)

TC Supply — TCNet timecode & DJ data for lighting/video

Spout

GPU texture sharing between Windows apps (Syphon's Windows twin)

QLab

Figure 53 — theatre & show playback (audio, video, lighting, OSC) (port 53000)

Millumin

Mac media server for theatre, dance & installations

VDMX

Vidvox — modular VJ software for macOS

disguise (d3)

Media server & show-control platform (designer / rx / gx)

PIXERA

AV Stumpfl media server

WATCHOUT

Dataton multi-display show control

Hippotizer

Green Hippo media servers

OLA (Open Lighting Architecture)

Open-source DMX/Art-Net/sACN/RDM server (olad) (port 9090, web UI)

sACNView

Free sACN (E1.31) monitor & test tool

ENTTEC DMX gateways

Ethernet → DMX nodes (ODE, Storm, DIN Ethergate, Octo)

Protokol

Hexler — OSC, MIDI & gamepad monitor

TouchOSC

Hexler — OSC/MIDI control surfaces

RTP-MIDI (Network MIDI)

MIDI over Ethernet/Wi-Fi (AppleMIDI)

WLED

ESP32/ESP8266 LED controller firmware (port 80, web UI)

Falcon Player (FPP)

Show player for pixel & SPI LED controllers (port 80, web UI)

Advatek PixLite

Art-Net/sACN → SPI pixel controllers

NovaStar / COEX

LED wall processors & receiving cards

Brompton Tessera

LED wall processors (SX40, S8, M2)

Colorlight

LED controllers & receiving cards

MADRIX 5

LED lighting control & pixel mapping

Lightjams

Real-time interactive DMX/LED lighting

Riverside.fm

Remote podcast & video recording studio (cloud) (web UI)

6.113Render Farm

AWS Deadline / Deadline 10

Render farm queue manager (VFX/3D)

OpenCue

Open-source render manager (self-hosted)

Qube!

Commercial render farm / job manager (PipelineFX)

6.114Tracking & Telematics

Traccar

Open-source GPS tracking server (self-hosted) (port 8082, web UI)

OwnTracks

Private self-hosted location tracking (MQTT/HTTP) (port 8083, web UI)

TeslaMate

Self-hosted Tesla data logger (Docker) (port 4000, web UI)

Samsara

Fleet telematics platform (cloud API) (web UI)

Geotab

Fleet telematics (MyGeotab API) (web UI)

Fleetio

Fleet maintenance management (cloud API) (web UI)

Onfleet

Last-mile delivery management (cloud API) (web UI)

Bouncie

Connected-car OBD tracker (cloud API) (web UI)

AutoPi

Programmable vehicle IoT dongle (cloud API) (web UI)

flespi

Telematics IoT gateway & MQTT broker (cloud API) (web UI)

7

Chapter 7

Sites, Domains & the Web

From the vhost on your Mac to the registrar, the DNS, the CDN and the search engines — one pane that tells you whether a domain is actually healthy, and a set of tools to fix it when it is not.

A working website is more than a running Apache. The domain has to resolve, the certificate has to be valid, the right machine has to answer, the CDN has to be in front of it, and the search engines have to know it exists. FrontierStack gathers all of that into the Sites pane and a small family of companion tools, so the whole chain — registrar, DNS, TLS, CDN, host, SEO — is visible and fixable from one window. This chapter covers the web above the stack; for the vhosts and certificates themselves see Chapter 4.

7.1The Sites pane and Domain Health

Open Sites from the sidebar. At the top sits the Domain Health section, a live dashboard that collects every hostname FrontierStack knows about: the local Apache and Nginx vhosts you have defined, the vhosts on linked servers, every Cloudflare zone on your token, and every domain in the registrar monitor. Each domain gets a row with a set of status badges; press Check on a row, or Check All in the header, and the app probes the domain end to end and colours the badges green or amber.

The point of the dashboard is to answer one question reliably: is this domain actually serving, and from where? Because the checks run against the public internet (a real DNS lookup, a real HTTP request, a real TLS handshake), they catch the failures a local config check never sees — a record that points at the wrong IP, an expired certificate, a Cloudflare zone stuck in "pending", a site that resolves but returns a 502.

CheckHow it is measuredWhat a problem looks like
DNSA real resolver lookup of the hostname (host/dig) and the IP it returns.No record, or an address that is not your server.
HTTPA live request that records the status code (curl -w %{http_code}).Anything outside 200–399 — a 404, a 502, a redirect loop.
SSL / TLSA TLS handshake reading the certificate end date (openssl s_client → x509 -enddate); the badge shows days remaining.Expired, expiring soon, or a name that does not match.
HTTP/3A teal badge when the server advertises HTTP/3 in its Alt-Svc header. Apache has no HTTP/3 of its own — the usual way to earn this badge on an Apache site is the HTTP/3 toggle in the domain's Cloudflare zone pane (browsers then speak QUIC to the edge while the origin stays h1/h2). Remember HTTP/3 rides on UDP 443: a TCP-only firewall makes browsers silently fall back to HTTP/2.No badge on a site you expected to serve h3 — the edge setting is off, or UDP 443 is blocked.
CloudflareZone status and plan from your token, shown as e.g. active · Pro.A zone "pending" because the nameservers were never switched at the registrar.
Serving hostDerived from the answering IP and the Server header."This Mac (Apache)" when you expected a remote box, or "Cloudflare" masking the origin.
screenshot to be added
Figure 7.1. The Domain Health dashboard at the top of the Sites pane, with DNS / HTTP / SSL badges and the serving host for each domain.Capture: capture: Sites pane scrolled to the top showing the Domain Health section with three or four domains, mixed green and amber badges, one showing "CF: active · Pro" and a serving-host label
NoteThe dashboard does not store your sites — it reads them. Local vhosts live in the Sites configuration, remote vhosts come from each linked server's Apache snapshot, and the rest come from Cloudflare and the registrar monitor. Add a site, link a server or paste a Cloudflare token and it simply appears here on the next check.

7.2Search Console, Analytics and Ahrefs on each site

Under its health badges, every Domain Health row has a short line with three chips: Search Console, GA4 and Ahrefs. Grey means the service isn't set up for that site, green means it is on and nothing is wrong, yellow means there is something worth a look, and orange means a problem that also raises an alert. Hover over a chip to see what was found, or click it to open that service's pane. This line doesn't copy the vendors' consoles. It answers two questions for each site: is the service on, and is there anything the owner should know?

The checks build up depending on what you have connected:

  • With no keys at all, FrontierStack reads the live home page, robots.txt and the domain's TXT records. It finds the Google Analytics and Tag Manager tags, the Ahrefs Web Analytics script, and the Google and Ahrefs verification tokens. It warns when the home page carries a noindex (in a meta tag or an X-Robots-Tag header), or when robots.txt shuts Googlebot, AhrefsBot or AhrefsSiteAudit out of the whole site. An old Universal Analytics (UA-) tag is pointed out too, because it no longer collects anything.
  • With Google signed in (the Search Console pane's Sign in with Google, or a service-account key), each site is matched to its Search Console property. FrontierStack then checks:
    • whether you are still verified for the property;
    • whether submitted sitemaps report errors;
    • what Google's URL Inspection says about the home page: whether it could be fetched, whether robots.txt or a noindex blocks it, and whether it is indexed;
    • whether search impressions have collapsed week on week.
    The same sign-in matches the site to its GA4 property, by the web stream's URL or by the measurement ID the page actually sends to. It warns when the property stops receiving data, or when the page sends to a different measurement ID from the one the property expects.
  • With a Cloudflare token, the zone's firewall events are read for Googlebot, AhrefsBot and AhrefsSiteAudit requests that a WAF, rate-limit or bot rule blocked in the last day, and the rule responsible is named. Only requests from Google's and Ahrefs' own networks count. When Cloudflare blocks an impostor that merely claims to be Googlebot, it is doing its job, so that isn't reported.

Everything is rechecked every six hours, and also whenever you press Check or Check All. Problems are sent to Alerts under the Search & Analytics group, one item per site and service, so a fixed problem sends a recovery. Ahrefs problems are only raised for sites where Ahrefs is actually in use, because blocking a crawler you don't use is a choice, not a fault.

NoteSome problems can't be detected this way. Google's Search Console API doesn't expose manual actions or security issues (a hacked-site warning, for example); Google sends those only by email. Ahrefs' own Site Audit crawl errors need Ahrefs' paid API (Lite plan or higher). The crawler checks above do catch the most common cause of those errors: a firewall or robots rule that turns Ahrefs away.

7.3ChatGPT Sites: monitor, use your domain, or self-host

The ChatGPT Sites section uses one shared registry everywhere it appears in FrontierStack. Paste a public name.openai.chatgpt.site URL and it joins Domain Health, SEO and Alerts like any other site. Mark a workspace- or owner-only Site private and outside probes pause, because its sign-in page is not an outage.

Import or Move offers two owner-authorised routes. Use my domain keeps the Site on ChatGPT: first add the domain in the Site's ChatGPT settings, then copy the exact DNS records ChatGPT supplies. FrontierStack validates that every record belongs to the selected Cloudflare zone and publishes it DNS-only; for another DNS provider, add the records there and use Save Domain. Both paths keep the original Sites address and the custom domain in the registry. Return to ChatGPT and refresh the domain status after DNS propagates.

Self-host starts from the Site's local project folder. FrontierStack reads .openai/hosting.json and package.json, identifies the framework and ready output folder, shows D1/R2 bindings and the names of example environment variables, and copies the reviewed web output into a managed Apache domain. The importer never runs package scripts, never reads secret values, skips links and source-control metadata, limits the copy to 50,000 files or 5 GB, and uses a staging folder so a failed replacement can be rolled back. Build the project first, then import dist, build, out, public, or another folder containing index.html.

WarningSelf-hosting the web output is not a complete hosted-data export. OpenAI's public Sites documentation does not describe an external export API for D1 data, R2 uploads, hosted secrets, analytics history or ChatGPT-only identity data. FrontierStack detects those dependencies and calls them out for a separate owner-controlled migration instead of silently leaving part of the application behind.

7.4Proving domain ownership

Vendors verify that a domain is yours by asking you to publish a DNS TXT record only its owner could create — the same proof-by-DNS idea as ACME's DNS-01 challenge, but every vendor has its own record format. The Verify button on a Domain Health row keeps those formats in one place: pick the service — Google (Search Console / Workspace), Microsoft 365, Meta, Apple Business Manager, Atlassian, OpenAI, Stripe, GitHub organizations, or a custom record — paste the token from the vendor's console, and FrontierStack publishes the TXT record straight into the domain's Cloudflare zone. If the domain isn't on your Cloudflare token, it hands you the exact record to add at your DNS host instead. A bare token is completed automatically (paste abc123 for Google and the record becomes google-site-verification=abc123).

The sheet also shows the verification records already published on the apex — a quick audit of who this domain is currently proven to — and Check DNS queries public DNS (1.1.1.1) for the new record, so you know the proof is visible before you press "Verify" on the vendor's side.

For certificates, the Let's Encrypt service pane (Security & Secrets category) is a standing health check on the other kind of domain proof: it watches the ACME API, Let's Encrypt's status page and a domain's live certificate, and — because ACME clients renew when 30 days remain — alerts when a certificate is overdue for renewal, catching broken certbot/acme.sh automation weeks before visitors ever see an expiry warning.

7.5Spam blocklists: domains, mail servers and your network's public IP

Receivers decide whether to accept mail partly by asking public blocklists. Blocklists on a Domain Health row (the same section appears on a Cloudflare zone's pane and in the Mail Server pane) looks the domain up on the domain lists — Spamhaus DBL, SURBL, URIBL — and its mail servers (MX hosts and single SPF addresses) on the IP lists — Spamhaus ZEN, SpamCop, Barracuda, PSBL, Mailspike. Each answer is decoded per list, so the result says why a listing exists, with a Look Up button for the list's removal page. The row then shows the last result.

ResultMeaningAlert
ListedSpam, phishing or malicious domains; SBL, CSS or XBL address; SpamCop, Barracuda, PSBL or Mailspike listingAlert (down) under Spam Blocklists
CautionSpamhaus PBL (an end-user range) or URIBL grey (bulk sender)Warning only
No answerThe list refused this Mac's resolver, even when asked at its own nameservers, or did not answerNever — the last real answer is kept

Regular check in the same section puts a domain on a schedule: Off, Daily, Weekly, Every 2 weeks or Monthly. Only a domain on a regular check raises Alerts. The lists rate-limit busy resolvers, so checks run one target at a time with a pause in between, never on the Alerts sweep, and the result is kept across launches. The Spam Blocklists section under Domain Health lists every watched domain with its rate and last result, and has a switch for the Alerts.

Network public IPs, in the same section, checks the public (WAN) address of every pinned router or firewall — the External IP set in its device details — on the IP lists, on a schedule of its own. A machine on guest Wi-Fi or the LAN that sends spam does it through that NAT address, and a listing there is often the first sign from outside, long before anyone inside notices.

WarningXBL, CSS or SBL on a network's public IP means something behind the router is infected or sending spam. Look for unknown devices and for outbound mail (TCP 25, 465, 587) from guest and LAN hosts, block outbound port 25 for everything except the mail server, then request removal. PBL is different: it is a normal policy listing for dynamic ranges and is not a sign of abuse.

The Mail Server Policy survey on a linked server's pane (see Chapter 10) runs the same lookups for that server's public address and the domains it receives mail for, and reports a listing as a failure, a caution entry as a warning, and an unanswered list as information. It reuses answers for six hours, so reopening the pane does not query the lists again.

7.6AI SEO and "Fix My Site"

Two of the badges on a domain row are not just diagnostics — they are buttons that hand the problem to the AI Administrator. Fix My Site takes a broken or misbehaving site and runs the assistant through a fixed playbook: reproduce the fault by curling the site locally with its Host header, read the relevant logs, check that Apache, PHP and the database are running, and then state the single most likely root cause with concrete next steps. With Allow changes off it only advises; with it on it may apply the reversible fixes (restart a service, correct a wrong value in a config file, repair the database). There is a WordPress-aware variant for the classic white screen, "Error establishing a database connection", broken permalinks and stuck maintenance mode.

The SEO action runs an on-device read-only audit: the assistant fetches the home page, robots.txt and the sitemap, scores the site out of 100 and writes a short report (titles, meta descriptions, headings, crawlability, structured data). The result opens in an SEO report sheet so you can read the findings and act on them.

TipThe AI SEO and Fix My Site actions reuse the one-shot, read-only harness, so they cost nothing extra to run and never touch your server unless you have explicitly turned changes on. Run the SEO audit before and after a content change to see the score move.

7.7One-click CMS installs (Apps & CMS)

WordPress gets a single pane that both installs new sites and runs the ones you already have — on this Mac or on any fleet server. That merge matters: the old installer pane could only ever write to This Mac, whereas everything here runs through WP-CLI on whichever host you pick, so a remote server is a first-class target for a new install. Install a new WordPress site, at the foot of the pane, downloads WordPress onto the selected host, writes wp-config.php, creates the database and completes setup with the administrator account you name. Nothing is copied up from your Mac, and an install already sitting at that path is refused rather than overwritten. Serving the new folder still needs a virtual host — create one in the Sites pane for a local site, or on the server's own web server. Installing a CMS is only the first day of its life, and the same pane covers the rest. Choose a host — This Mac or any fleet server — and scan for wp-config.php under the usual web roots, and every WordPress install on that machine appears with its core, plugin and theme versions and whatever is waiting to be updated. Update all exports the database before it touches anything, because a bad plugin update is recoverable and a lost database is not. Check integrity compares the core files against the checksums WordPress.org publishes, which is the quickest way to find a defaced or backdoored install; add a free WPScan token and the pane also checks your installed plugins and core against the vulnerability database, marking anything with no published fix. Multisite networks list their subsites. Each site also carries an Add a plugin list — a curated catalogue covering booking, commerce, mail delivery, backups, caching and security — which installs straight onto that site, local or remote, with an option to activate it once installed. The list is deliberately not a mirror of the WordPress.org directory: every entry either fails visibly when it breaks or produces something FrontierStack already monitors elsewhere, and each says what the app can tell you about it once it is running, so an install never implies monitoring that does not exist. Anything already on the site shows as installed rather than being offered twice, and a premium plugin with no WordPress.org slug links to its own page instead. On a host with no WordPress site yet — or without WP-CLI — the catalogue is still shown, greyed out and not selectable, so you can see what will be on offer instead of meeting an empty pane. The remaining jobs are the ones that otherwise mean an SSH session and a half-remembered command: resetting the password of a locked-out administrator, search-replace to move a site between domains (WP-CLI rewrites URLs buried in serialized PHP, where a plain SQL replace corrupts them — so always dry-run first), cloning a site to staging, and exporting or optimising the database. A clone copies the files, gives the copy its own database, rewrites the URLs inside it and sets it to discourage search engines, so staging can never write to production or outrank it. Everything runs through WP-CLI over SSH, and the pane offers to install WP-CLI on any host that lacks it. Pin a site and Alerts will tell you about pending updates, a failed integrity check or a new vulnerability.

Sites moved from GoDaddy. GoDaddy’s Managed WordPress puts a must-use system plugin and a Memcached object-cache.php into every site, and its older hosting adds a gd-config.php include to wp-config.php. None of them work anywhere else — a restored GoDaddy backup typically stops at a white screen or a database-connection error. The pane spots them on refresh and offers Remove GoDaddy Leftovers…: the files move to ~/frontierstack-godaddy-leftovers on the server with a copy of wp-config.php, the include is commented out, and after a database export into the same folder, links still on the temporary *.myftpupload.com address are pointed at the site’s own. It won’t run on GoDaddy’s own servers, where those files are the platform.

If your WordPress lives on managed hosting rather than your own machines, the hosting panes now list those sites too: WP Engine, Kinsta, Cloudways and Pressable each pull your installs through their API — environment, primary domain and status — and they roll up into Cloud Servers alongside your VPS instances, so one inventory covers everything you run. These are sites rather than machines, so they carry no power controls.

The Apps & CMS section installs the other self-hosted CMS onto your Apache/PHP/MySQL stack in a single flow, each with its own pane: Drupal, Joomla, Statamic, Grav, Kirby, Craft CMS and FreshRSS — plus Magento Open Source, which uses the same installer but is filed under E-Commerce. The installer downloads the app (or runs composer create-project for the Composer-based Statamic and Craft), extracts it into the document root, and — for the ones that need a database (Drupal, Joomla, Craft) — creates the database and user and writes the config where the app expects it. The flat-file CMS (Grav, Kirby, Statamic) need no database at all. It then opens the app's setup or admin page so you can create your account (/admin, /panel, /cp, /admin/install…), while FrontierStack wires the virtual host, PHP and trusted HTTPS around it. For the install folder you can pick a site Apache already manages — a menu prefills its domain, document root and port — or Choose… a new empty folder; a matching Apache vhost is created for a new folder, or updated when the domain is an existing site. If an install misbehaves, Fix My Site (AI) above debugs it.

FreshRSS is the exception that finishes the job. It is a self-hosted RSS and Atom reader, and unlike the CMS above it leaves you no setup wizard at all: name an account and password in the pane, and the installer downloads the release, creates the database, runs FreshRSS's own command-line installer to write its configuration and build the schema, creates that account, and registers a virtual host pointing at p/ — the subfolder FreshRSS actually serves from, with the rest of its code left outside the web root where it belongs. The browser then opens on the login screen of a working reader rather than on step one of an installation. Because its API is Google Reader-compatible, mobile clients such as Reeder and NetNewsWire can sync against it once you expose it, which makes it a natural companion to the HTTPS and remote-access work elsewhere in this book.

Magento Open Source also installs completely, for a different reason: Magento removed its browser installer, so the only way in is its command line. The pane gathers what bin/magento setup:install needs — an admin username, password, email and name, the store currency, and the address of a running OpenSearch (or Elasticsearch 8) server — and checks the slow-to-discover problems first: a PHP older than 8.2 or missing one of Magento's extensions, a search server that does not answer, and the MySQL version. Only then does it run composer create-project, from the keyless Mage-OS mirror by default or from Adobe's repo.magento.com with your Marketplace access keys, which are used for that one download and not stored. That download is several hundred packages and usually takes 5–15 minutes. The installer then creates the database, runs the setup with your account, makes the folders Magento writes to at runtime writable by the web server, and registers a virtual host that serves pub/. The admin lives at a random path such as /admin_k3x9qz/, which the log shows and the browser opens. Magento normally makes every admin set up two-factor sign-in through an emailed link; for a local test store that cannot send mail, a toggle turns this off (it starts off for .local and .test names). If setup fails after the download, fix the cause and press Install again: the pane resumes from the database step without downloading again. Finally, Magento does its indexing and email from cron, so run bin/magento cron:install in the install folder once the store is up.

The same pane installs the licensed Adobe Commerce (on-premises) edition: set Edition to Adobe Commerce and enter the Marketplace access keys of the account that holds the licence, since that edition downloads only from repo.magento.com. Its MySQL settings for Magento section reads three values from the chosen instance — log_bin_trust_function_creators, which must be on while binary logging is (MySQL 8’s default), or MySQL refuses the triggers Magento’s indexers create with error 1419; max_allowed_packet, at least 64 MB; and, if you tick it, an InnoDB buffer pool of 1 GB. Apply sets them at once with SET GLOBAL, then writes them under [mysqld] in the instance’s my.cnf, after saving a timestamped backup beside it, so a restart does not quietly undo them. Sizes are only ever raised, and a server on another host gets the lines to add rather than an edit. Install runs the same step. Once the store is installed, the pane also shows its live sales monitor. Adobe’s hosted editions — Adobe Commerce on Cloud Infrastructure, Adobe Commerce as a Cloud Service and Adobe Commerce Optimizer — are services in the catalog, each with a monitor of its own.

The pane is called Magento and has three tabs. This Mac is the installer described above. Stores manages every Magento store FrontierStack knows about, on this Mac or on any server in the fleet — Find Stores scans a server’s web roots. For each store it reports the version and whether a newer security patch exists, the deploy mode, whether the storefront answers, maintenance mode, whether cron is installed and when its last job finished, stale indexers, disabled caches, a default /admin/ path or missing two-factor sign-in on a server, and today’s exceptions, worst first. Its buttons flush the cache, reindex, switch indexer modes, toggle maintenance, change the deploy mode, run setup:upgrade safely behind the maintenance page, install cron, unlock an admin and tail the logs, always as the owner of the store’s files. Fix My Store (AI) passes the store to the AI Agent, which reads the same evidence through its ecommerce tool and proposes changes you approve one by one.

Host on a Server is the one-click route to a live store. Choose an Ubuntu 24.04+ or Debian 12+ server, a domain and the admin account, and FrontierStack works through eleven stages, showing each as it goes: check the server (memory, disk, nothing else on port 80); install Nginx, PHP-FPM, MySQL or MariaDB, Composer and Redis; install a loopback-only OpenSearch; create the database with Magento’s MySQL settings; create a magento user with its own PHP-FPM pool; download Magento with Composer; run setup:install; build the Nginx site from Magento’s own nginx.conf.sample; switch to production mode; install cron; and get a Let’s Encrypt certificate. Expect 20–40 minutes. It needs root on the server, and the passwords it generates travel in a private file that is deleted at the end. A failed stage stops the job with its reason; fix it and press Host Store again, and finished stages are skipped. The new store joins the Stores tab with alerts turned on.

7.8The Domain Registrar monitor

Sites tells you whether a domain works today; the Domain Registrars pane (in the DNS category) tells you whether it will keep working. Add a domain and FrontierStack watches three things on a schedule and raises an alert when any of them drifts:

  • Expiry — the registration end date, registrar and nameservers, pulled over RDAP (with a whois fallback). Works for any domain, whatever the registrar.
  • DNS — whether the domain still resolves (dig).
  • SSL — the certificate expiry, checked directly with openssl.

A renewal warning fires when the expiry is within your reminder window, already past, or when auto-renew is off. For supported registrars the pane can import your domain list and auto-renew status by API — GoDaddy, Porkbun, Gandi, Value Domain, Route 53 (via the AWS CLI) and Cloudflare (reusing the Cloudflare token — this one needs a user API token, as Cloudflare Registrar does not accept account-owned cfat_ tokens). Registrars without a usable list API (Namecheap, Squarespace, Onamae, Muumuu Domain) you add by hand; RDAP still monitors them.

WarningA lapsed domain is the one outage no restart fixes — once it expires it can be snapped up by someone else within hours. Set a comfortable reminder window (30–60 days) and wire the registrar alerts to a channel you actually read; this is the cheapest insurance in the whole app.

7.14.1Domain companies: registrar uptime

A Cloudflare zone tells you nothing about who holds the registration. FrontierStack looks each pinned zone up over RDAP and shows its registrar and live nameservers in a Domain Company section of the zone pane; in the Cloudflare pane each zone's line reads e.g. active · Pro · registered at GoDaddy. Every registrar and DNS host behind your domains — GoDaddy, Namecheap, Porkbun, Gandi, Squarespace, DNSimple, Route 53, Value Domain, Onamae, Name.com, Hover, Dynadot, IONOS, OVHcloud, Sakura and Cloudflare itself — is checked every five minutes on three signals:

  • Official status — the company's status page (Statuspage or Instatus JSON; AWS's Route 53 RSS), including each of its services — domains, DNS, email, hosting, SSL, website builder — where the page lists them.
  • Reachability — its website and API host answer.
  • Nameservers — for domains still delegated to it, its nameservers answer for them.

A yellow building icon next to a zone in the sidebar means its registrar or DNS host is degraded; red means down. Pin a company (from the zone pane, the zone's context menu or the Domain Companies list in Domain Registrars) and it gets its own sidebar row with a pulsing dot when down. A company going down raises a Domain company alert. Companies without a status page are judged on reachability alone, and when this Mac can reach none of them the check reports offline rather than a false outage.

7.14.2Moving a domain to Cloudflare

With a Cloudflare token set, two moves are one click where the registrar has an API:

  • DNS only — for a domain not yet on Cloudflare, Add to Cloudflare DNS… in Domain Registrars creates the zone, copies its current public records in and pins it. Review the records, then use Switch Nameservers in the zone's Domain Company section: FrontierStack sets Cloudflare's two nameservers at GoDaddy, Porkbun, Gandi, DNSimple or Route 53 and asks Cloudflare to re-check activation. For other registrars it shows the two nameservers to copy.
  • The registration — Transfer to Cloudflare… opens a checklist that reads the domain's live state: DNS active on Cloudflare, outside the 60-day lock, transfer lock off (with Unlock for GoDaddy, DNSimple and Route 53), and the authorization code (fetched from Route 53 or Gandi, emailed by DNSimple). The last step opens Cloudflare's transfer page, where you confirm and pay one year's renewal — Cloudflare has no API for starting a transfer.
WarningSwitching nameservers moves every DNS answer to Cloudflare. Any record missing from the zone — especially mail (MX) and verification TXT records — stops resolving once the change spreads. The switch button stays disabled while the zone has no records, and the confirmation shows how many it has.
Buying a domain
The same pane has a Register a new domain form. Type a name to check availability and price, then register through Porkbun or Namecheap — the buy step always previews first and only spends money when you confirm. The AI can do this too with the domain tool: check (read-only), suggest (finds available names from keywords or a business description) and register, the last gated behind an explicit confirmation. Without a Porkbun or Namecheap key, checks and suggestions use GoDaddy’s public search, which needs no key but gives no prices and can’t buy. Registration reuses your stored registrar credentials and a registrant-contact profile you fill in once.

7.9Cloudflare: zones, DNS, cache, tunnels and protection

The Cloudflare pane is where you paste an API token and choose which zones appear in the sidebar. Each zone you Pin to sidebar becomes its own pane with that zone's Cloudflare/DNS/HTTP/SSL health, DDoS and bot protection, WAF rules, Workers, CDN analytics, development mode and cache purging (everything, a list of URLs, or by prefix). Scope the token carefully: a read-only token lists zones, but DNS edits, certificate DNS-01 validation, Dev Mode, cache purge and zone creation each need their own permission, and creating a brand-new zone needs the account-level Zone · Zone · Edit permission. The Create Token… buttons open Cloudflare's token form with every permission the app uses already filled in (only that optional account-level zone-creation row must still be added by hand), a Test Token button probes the live API and lists exactly which of those abilities the token has or lacks (reads are exercised directly; writes are probed with deliberately-invalid requests, so nothing is changed), and a Dashboard button deep-links into the Cloudflare web console for the current zone.

When a pinned zone shows a warning or its HTTP check has stopped answering, the pane's Diagnose button finds out why instead of leaving you with a coloured dot. It probes each layer of the serving path in order — the zone's state at Cloudflare, the public nameservers, DNS resolution, HTTPS through the edge (decoding Cloudflare's 52x errors: 521 origin down, 522 timeout, 524 the app or its database hanging, 525/526 origin TLS), the origin server's ports 80 and 443 directly, and finally the machine FrontierStack knows serves the domain: the local web server if that is this Mac, or a linked server's on-host monitor service states (a stopped mysql surfaces right in the report). When the public path is broken it also sweeps the fleet: which linked servers are up, which binds the origin IP, and which already serves this domain's vhost — so a host that went offline and took the sites' front-door IP with it is named directly, together with the server that could take over. Each layer is shown pass/fail, ending with a plain-language conclusion — which layer broke and what to do about it.

Cloudflare turns up across the app: the AI's dns_record tool writes records into a zone you manage and updates existing ones in place — including flipping a subdomain between proxied (orange cloud) and DNS-only — issue_certificate can validate over Cloudflare DNS-01, and email_auth_dns can publish SPF/DMARC for you (see Chapter 13). The same account also powers Cloudflare DDNS and the Cloudflare Tunnel for exposing a local site — both covered in Chapter 9.

7.14.3When a site is under attack: Under Attack Mode

Every pinned zone's pane opens with an I'm Being Attacked button. It switches the zone to Cloudflare's Under Attack Mode (security level under_attack): every visitor gets a browser check of a few seconds before reaching the origin, which stops most request floods. You confirm before it turns on, because while it is on, anything that cannot run JavaScript — API clients, webhooks, mobile apps, uptime monitors — is blocked too. The same command sits on the zone's sidebar right-click menu (I'm Being Attacked…) and in the Cloudflare Zones mini palette, so you can reach it without hunting for the pane. A red shield in the sidebar and an ATTACK badge in the palette mark zones in the mode. Stand Down turns it off with no prompt and restores the security level the zone had before (or medium if the mode was switched on outside FrontierStack). The token needs Zone · Zone Settings · Edit; the AI Administrator can do the same with cloudflare_dev_mode action=under_attack.

WarningUnder Attack Mode blocks your own automation as well as the attacker's — payment webhooks, API clients and external uptime checks all fail while it is on. Stand down as soon as the flood is over.

7.14.4Email Routing and Email Service

The zone pane's Email section shows whether Email Routing is on and ready, its routing rules and catch-all, any destination address that is still unverified (mail forwarded there is dropped until it is confirmed), the last seven days of Email Service events with failures highlighted, and the zone's MX targets. It also warns when a mail hostname is orange-clouded: Cloudflare's proxy carries only web traffic, so SMTP and IMAP to a proxied host fail — set it to DNS-only. The Email Delivery monitor has a matching Cloudflare Email Service section listing every pinned zone, read with the same token. The token needs Zone · Email Routing Rules · Read (and Account · Email Routing Addresses · Read for destinations); the AI reads the same picture with cloudflare_dev_mode action=email_status.

7.14.5Core Web Vitals

The zone pane's Core Web Vitals section reports what real visitors experienced over the last seven days, from Cloudflare's free Web Analytics, with bots excluded:

MetricMeasuresGood
LCPLargest Contentful Paint — when the main content appears≤ 2.5 s
INPInteraction to Next Paint — how quickly the page responds to input≤ 200 ms
CLSCumulative Layout Shift — how much the layout jumps≤ 0.1
FCP · TTFBFirst paint and server response time, shown for context—

Each value is the 75th percentile, with the share of page loads that were "good" and a green, orange or red rating. Web Analytics must be on for the site, and the token needs Account · Account Analytics · Read — now pre-filled by the Create Token… buttons. AI: cloudflare_dev_mode action=web_vitals.

7.14.6Rate-limiting and WAF rules

The zone pane's Rules section lists the zone's rate-limiting and custom WAF rules, each with its action, its limits (for example "block, more than 20 requests / 10 s per IP") and its expression. The switch turns a rule off and on. Edit changes the name, expression, action and limits. The … menu offers Revert to Previous Version — FrontierStack keeps the version from before its last edit — and Delete Rule, which the app cannot undo. Changes are live on Cloudflare as soon as you apply them, and Cloudflare rejects an expression it cannot parse without changing anything.

Watch for the orange warning. A rule with no hostname condition applies to every hostname in the zone, not only your website. A rule that matches a URL path such as /djs/ also matches a media or image host whose paths contain the same segment, so a visitor loading one page can be blocked with error 1015 (HTTP 429) partway through its images — and a cached image does not help, because rate limits run before the cache. The editor offers one-click Exclude <host> buttons that wrap the expression as (http.host ne "host") and (…).

New Rule… creates a rate limit, a custom WAF rule, a cache rule (cache for a set time, or bypass the cache) or a redirect. It asks for a hostname, with an optional path prefix, instead of a bare path, so a new rule cannot silently cover every host; a hand-written expression gets the same warning. Managed WAF, URL rewrite and request/response header rules are listed when the zone has them. They can be switched on and off, renamed and deleted, but their parameters (cache TTL, redirect target, headers) are shown rather than edited — recreate the rule to change them.

Each kind needs its own token permission — Zone WAF, Cache Rules, Single Redirect or Transform Rules — Read to view and Edit to change; the pane names whichever is missing. Rules in Cloudflare opens the dashboard. AI: cloudflare_dev_mode action=rules lists the rules, action=rule_create adds one and action=rule_update changes one (each needs Allow changes and your confirmation). It can disable a rule but never delete one.

7.14.7Security events and Bot Fight Mode

The zone pane's Security Events section shows what Cloudflare blocked, challenged or logged on the zone in the last 24 hours, grouped by source (rate limiting, custom rule, managed rules, DDoS, browser integrity check…), rule and hostname. Custom and rate-limit rule ids are shown by name. An orange triangle means visitors were stopped on a hostname other than the main site — typically a media or image host caught by a rule meant for pages. Start here when images go missing or visitors report error 1015 or 429, then fix the rule under Rules.

Below the list, Bot Fight Mode shows and switches Cloudflare's free bot challenge. Turning it on asks first: it can block legitimate bots, feeds, webhooks and monitors, and on the free plan a rule cannot exempt them. Needs Zone · Analytics · Read. AI: action=security_events and action=bot_fight.

7.14.8Cache by hostname

The zone pane's Cache by Hostname section shows, for the last 24 hours, each hostname's requests and the share of cacheable requests served from Cloudflare's cache (HTML and API responses are left out), plus the top files that were not served from cache. A zone-wide hit rate hides an image host that never caches; this does not. A host well below 100% usually has no cache rule, an origin sending Set-Cookie or Cache-Control: no-store, or a rule blocking requests before they reach the cache. AI: action=cache_hosts.

7.14.9Workers

The account pane's Workers section lists every Worker with the routes that point at it, the last day's requests, errors and 99th-percentile CPU time, and a bar showing usage against the plan's published allowance — 10 million requests a month on Workers Paid, 100,000 a day on Free — turning orange at 70% and red at 90%. Needs Account · Workers Scripts · Read, Workers Routes · Read and Account Analytics · Read, all pre-filled by Create Token…. AI: action=workers.

7.14.10Plan and notifications

The account pane's Plan & Notifications section lists the account's subscriptions (plan, price, state, renewal date) and its notification policies, and warns when there are none — nothing would then tell you about an outage, an expiring certificate or Workers usage. It is read-only; Billing and Notifications open the dashboard. Needs Account · Billing · Read (pre-filled) and Account · Notifications · Read, which has no token-template shortcut and must be added by hand. AI: action=plan_usage.

7.14.11Turnstile widgets

Turnstile is Cloudflare's free CAPTCHA replacement for sign-up, login and contact forms. The Cloudflare pane's Turnstile section lists your widgets with a Copy Site Key button each. New Widget… asks for a name, up to ten hostnames and a mode (Managed, recommended; Non-interactive; Invisible). The new widget's secret is shown with Copy and Save Secret to Script Secrets, which stores it as $TURNSTILE_SECRET_<NAME> for your scripts. Each row's ⋯ menu reaches an existing widget's secret too: Copy Secret Key (the clipboard clears after 60 seconds), Save Secret to Script Secrets and Rotate Secret…. Rotating has Cloudflare issue a new secret while the old one keeps working for two hours, so put the new one on every server that verifies the widget before then; a copy already in Script Secrets is updated for you. The site key goes in the page; the secret stays on your server, which checks each visitor's token with Cloudflare's siteverify endpoint. Delete Widget… lives in the same menu.

NoteTurnstile refuses account-owned tokens (cfat_). It needs a user token with Account · Turnstile · Edit. Test Token now probes this and the other optional account-level permissions, tells a network failure or a Cloudflare 5xx apart from a bad token, and says which account a multi-account token acts on.

7.14.12Named tunnels: health, alerts and Access

Each named tunnel row (see Chapter 9) carries a status line: Cloudflare's view of its connectors — healthy, degraded, down or inactive — and, for a tunnel this Mac runs, whether the local port answers, since a healthy tunnel in front of a stopped service still fails. The bell opts that tunnel into an alert if it or its service goes down (Alerts group Network & Routing). Protect… puts a Cloudflare Access sign-in in front of the hostname: list email addresses and/or @domains, choose how long a sign-in lasts (one hour to 30 days), and visitors sign in with a one-time PIN sent to their email or through your identity provider. FrontierStack creates a reusable allow policy and a self-hosted Access application; a blue lock marks protected tunnels, and Remove Access takes it off. Access needs Zero Trust set up on the account once (the free plan covers 50 users) and Account · Access: Apps and Policies · Edit.

7.14.13AI access through Cloudflare MCP

The AI Access (Cloudflare MCP) section lets the AI Administrator use Cloudflare's official MCP server at mcp.cloudflare.com with the token you already saved — useful for products FrontierStack has no pane for (WAF rules, Workers, R2, KV, D1, Access). Turn on Let the AI Administrator use Cloudflare MCP and press Test Connection. Out of the box it is read-only: the AI can search Cloudflare's documentation and its full API specification. Allow API calls (execute), off by default, lets it run JavaScript against the live API; every run needs Allow changes and your approval. MCP clients connected to FrontierStack reach the same server through the hosted_mcp tool with provider=cloudflare (see the tools table in Chapter 13). Other MCP clients ▸ Copy Config gives a token-free entry for Claude, Cursor and similar apps, which sign in to Cloudflare themselves with OAuth.

SecurityThe token stays in this Mac's Keychain, is sent only to mcp.cloudflare.com as a header and is never shown to the AI; credential values in responses (tunnel tokens, Turnstile secrets) are redacted. With execute on, the AI can do anything the token allows — keep the token's permissions narrow.

7.14.14Cloudflare developer tools

The Cloudflare pane's Developer Tools section installs Cloudflare's own tooling from its agent-setup guide. Install adds the Cloudflare CLI (cf, beta) with npm in the in-app console, adding Node through Homebrew first if needed; Sign In… runs cf auth login and opens your browser to authorize your account (it does not use the saved API token). The Claude Code plugin row adds the cloudflare/skills marketplace and installs the cloudflare plugin, Cloudflare's skills plus its API, docs, bindings, builds and observability MCP servers. That installs third-party plugin code, so run /reload-plugins in Claude Code afterwards. It needs Claude Code on this Mac.

7.10Hosting providers

Not everything you run lives on a Mac. The Hosting category brings VPS and managed providers into the same window. VPS providers — DigitalOcean, Vultr, Linode, Hetzner, Sakura and others — expose their servers through an API token: paste it, and the pane lists each server with plan, location, status and IP, and lets you power one on, off or restart with a confirmation. Dashboard-style providers store their token and surface quick links to the control panel, docs and sign-up. Hostinger goes further: with an API token from hPanel ▸ Account ▸ API the pane lists and powers your VPSs, takes a VPS snapshot (Hostinger keeps one per VPS, so a new one replaces it), lists your domain portfolio with expiry dates and your hosting websites, and lets the AI Administrator read and set DNS records with dns_record (provider=hostinger). Its AI Access (Hostinger MCP) section connects the AI to Hostinger's official MCP server with the same token — read tools only, until you turn on Allow writes. Either way the credential lives in the Keychain, and the servers you can reach over SSH become part of your fleet (Chapter 8). ConoHa signs in with three values from its control panel’s API page — the API user, its password and the tenant ID — lists and powers your VPS 3.0 (or legacy 2.0) servers, and adds a DNS section for ConoHa DNS zones: add, edit and delete records here, or let the AI do it with dns_record (provider=conoha). ConoHa DNS is free for ConoHa customers and is the usual API-managed home for a domain registered at Onamae.com, which has no DNS API of its own. Tencent Cloud signs every request with an API key pair (SecretId and SecretKey from CAM ▸ API Keys; the SecretKey never leaves the Mac). It lists and powers your CVM and Lighthouse servers in every region, manages DNSPod records (or the AI does, with provider=dnspod), and shows your SSL certificates by expiry, COS storage buckets (flagging any an ACL leaves publicly readable), CDN and EdgeOne sites, and this month’s charges. Set the account’s site — international or China — because the two keep separate accounts. Domains registered at Tencent Cloud are imported in Domain Registrars like any other registrar’s, and new ones can be bought there: Tencent quotes its price, registers to a registrant profile on the account and pays from the balance, after a preview and a confirmation.

Xserver (エックスサーバー) takes one API key from the XServer account (API キー管理) — read-only is enough except for setting up SSH for a move — and covers its rental servers, XServer Business, Xserver Domain, Xserver VPS, Xserver VPS Cloud and Xserver for WordPress. The pane lists every contract with its plan and renewal date — VPS Cloud VPSs, DB servers, load balancers, NFS volumes and additional IPs included — and powers the VPSs and VPS Cloud resources, shows each rental server's disk and file use and any certificate that has expired or is about to, copies the contracts into Spend & Billing with Xserver's published 12-month list price, and imports Xserver Domain renewals into Domain Registrars; a live monitor raises an alert for a suspended contract, a renewal due with auto-renew off, a quota at 90%, an expired certificate or an expiring key. Move to This Mac… brings a rental server's sites home: FrontierStack reads the domains, document roots, databases and WordPress installs from the API, registers its own SSH key there, rsyncs each document root and copies each database — live with mysqldump, using the password from the site's wp-config.php, or from last night's automatic backup — into Homebrew MySQL. It rewrites the /home/xs… paths, gives each WordPress its own local MySQL user, adds the sites to Apache (on 127.0.0.1 until you choose to serve them publicly) and writes XSERVER-IMPORT.md with the DNS zones, cron jobs, mail accounts and the cut-over steps. Mail is not moved: Xserver exports neither mailboxes nor their passwords. Running the move needs a licence; the inventory does not.

7.11IndexNow: instant search-engine submission

When a page changes, you do not have to wait for a crawler to notice. IndexNow Manager (in SEO & Marketing) tells the participating engines — Bing, Yandex, Seznam, Naver and others — immediately. Pick one of your managed sites, press Install Key File, and FrontierStack writes the <key>.txt file into the site's document root so the engines can confirm you own the key; Verify checks it is being served. Then submit a single URL, fire off the pending queue, or feed it from a sitemap, and it can auto-submit on a schedule. Everything goes to api.indexnow.org, which fans out to all participating engines; the URL's host must match the selected site and its key.

NoteIndexNow covers the IndexNow-participating engines. Google does not use IndexNow — for Google, FrontierStack verifies the domain in Search Console and submits the sitemap through the gsc_verify_domain and index_site tools, hands-off when you are signed in to Google. The Index button on each Domain Health row drives both paths at once.

7.12OpenSEO and DataForSEO: your own SEO toolkit

OpenSEO (SEO & Marketing) is an open-source alternative to Semrush and Ahrefs — keyword research, rank tracking, competitor insights, backlinks, site audits and AI visibility — with an MCP server so your AI agent can use the same data. Its pane starts with one question: where does it run?

  • Hosted — app.openseo.so. Free to try, $10/month to support the project; SEO data is billed through OpenSEO credits (DataForSEO's price plus 28%), so you do not need your own DataForSEO account.
  • Docker on this Mac — Set Up & Start pulls ghcr.io/every-app/open-seo and starts it on http://localhost:3001. Your projects live in the open_seo_data volume, so Apply Settings & Restart (after changing a key or the port) and Update (latest image) keep them. OpenSEO's telemetry is off by default, and you can share your OpenRouter key to enable its SAM agent.
  • Self-hosted elsewhere — enter the URL of an existing instance, or press Deploy to Cloudflare…. FrontierStack clones the repository, writes an owner-only .env.selfhost with your DataForSEO key and the email addresses allowed through Cloudflare Access, and runs pnpm deploy:selfhost in the in-app console. The first run signs you in to Cloudflare; answer yes to customising the OAuth scopes and enable access:write. Paste the Worker URL it prints back into Instance URL.
SecurityDocker mode runs OpenSEO with its login turned off, which is why FrontierStack binds it to 127.0.0.1 only. Before other devices use it, put an authenticated proxy in front of it, or use the Cloudflare self-host, which sits behind Cloudflare Access. The DataForSEO key and OpenRouter key reach the container and the deploy only through the console's isolated environment. They never appear on a command line.

The live monitor reads the instance's /api/health endpoint, which lists the setup checks for the DataForSEO key, database, auth mode, AI and Search Console. Pin Alert me and a failing check raises an alert. If you paste an oseo_ API key, it is checked against the MCP endpoint, so a revoked key is flagged too. The AI agents section copies the MCP URL, a claude mcp add command and a Claude Desktop/Cursor config. The API-key variant reads $OPENSEO_API_KEY from your shell, so FrontierStack never puts the key on the clipboard.

DataForSEO is the data source behind OpenSEO, and it has its own live monitor, which the OpenSEO pane embeds. Enter the API login and password from app.dataforseo.com ▸ API Access (not your dashboard password), or leave the login empty and paste the longer Base64 credential. The monitor shows your prepaid balance, today's spend and API calls, and it can alert you when today's spend passes a threshold or the balance drops below a floor you set. Self-hosted OpenSEO installs take the same credential, so you enter it once.

7.13Site Clone: copying sites between machines

The Site Clone pane (Setup & Migration) copies a website — its files and its MySQL database — from where it is now to somewhere else, in four numbered steps. Pick where the site is now (This Mac, one of your pinned servers, or a hosting account reached over SFTP/FTPS) and where the copy goes (This Mac, a pinned server, A new server… or a hosting account). Find Sites & Databases lists the folders a server's web server serves and its databases, so you pick rather than type. A new server is linked over SSH when the clone starts; Pin it to the sidebar keeps it with your other servers afterwards. The database can be copied once, or kept in sync as a MySQL replica: FrontierStack creates a replication login on the source, loads a dump taken at a known binary-log position, and starts a replication channel on the copy that carries only that database. Check tests both ends first, without changing anything, and names whatever stops a replica (MySQL older than 8.0.23, binary logging off, a source that only listens on 127.0.0.1).

TipA replica is for reading. Make changes on the original — a write to the copy stops replication until it is fixed.

Two more tools move a site without a manual rsync dance. Copy Websites Between Apache handles the local case: when you have more than one Apache install on the Mac (say a Homebrew one and an old Server.app one), choose the source install, tick the sites you want, and FrontierStack copies their document roots and vhost definitions into the currently selected Apache. Sites with the same domain are overwritten, so it is also how you re-import after a migration.

To move a site to another machine, the AI's promote_site tool clones a local site to one named fleet host: it uploads the document root, writes the vhost (Apache or Nginx) on the far side, reloads the web server, and can add the Cloudflare A record pointing at the new host — the same steps as a manual fleet push, in one call.

7.14Provisioning a new web project

The pieces above combine into a single flow for standing up a project's infrastructure from nothing. The idea is a clean division of labour: your AI tool (over MCP) owns the code; FrontierStack owns the infrastructure. The built-in Provision Web Project skill walks the assistant through the recipe in order:

  1. Discover — inventory the target, its privilege access, installed Apache/Nginx and connected DNS provider; identify or install missing prerequisites before making a public change.
  2. Zone — cloudflare_zone_create makes the Cloudflare zone and returns the nameservers to set at the registrar (and tells you plainly if the token lacks account-level zone-create rights).
  3. Vhost + folder — vhost_create defines the Apache/Nginx site. If you did not provide a document root, FrontierStack creates an empty platform-appropriate folder and reports its path. It does not design or generate site content.
  4. DNS — dns_record points the name at the host.
  5. TLS — issue_certificate issues a Let's Encrypt certificate.
  6. Preview — a temporary share for a localhost test point (Chapter 9).
  7. Promote — optionally promote_site clones it onto a fleet host.

Domain registration can join the front of this recipe through domain_register, so an agent can in principle buy the name, create the zone, stand up the vhost, issue the certificate and clone to the fleet — with every money-spending or system-changing step previewed for your approval first.

SecurityEvery provisioning tool is mutating and therefore gated: nothing creates a zone, writes a DNS record, issues a certificate or buys a domain unless Allow changes is on and you approve the action. Cloudflare and registrar tokens stay in the local vault — they are injected at run time and never sent to the model. See Chapter 13 for the full trust model.

Part III

III
Fleet, Network & Security

Link servers into one fleet, then network, harden and monitor them all from a single window — Macs, Linux and BSD boxes, Raspberry Pis and Windows hosts alike.

8

Chapter 8

Connecting Servers: Locations & the Fleet

One Mac is a start. FrontierStack reaches out over SSH to every other server you run — and knows where on the network it is sitting when it does.

Everything so far has been about the Mac in front of you. This part of the manual widens the lens to the whole estate: the Linux boxes in a rack, a vintage Xserve still running macOS Server, a Raspberry Pi on a shelf, a cloud VPS, even a Windows host. You link each one once over SSH, and from then on FrontierStack treats them as a single fleet — running diagnostics, fanning commands out, deploying sites, and watching their health. It also keeps track of where this Mac is on the network, so a laptop that moves between home, office and a café doesn't fire false alarms about servers it simply can't see right now.

This chapter covers linking and running the fleet. Chapter 9 goes deeper on the network and perimeter, Chapter 10 on hardening and the security audits, and Chapter 11 on continuous monitoring and alerts. The AI Administrator can drive almost everything here over the same tools — see Chapter 13.

8.1Locations & Places

Open Locations & Places ▸ Locations. A location is simply a named network — Home, Office, On VPN — recognised from several signals: the Wi-Fi SSID, the router (gateway) MAC address, the Wi-Fi BSSID, the subnet prefix of your IP address (e.g. 192.168.1.), your public IP block, and whether a VPN is up. The header shows where you are right now (Now: Office), with the live snapshot beneath it: Wi-Fi name, IP, gateway and VPN state. Detection runs every 30 seconds.

When FrontierStack sees a network it doesn't recognise it offers a New network detected banner — click Add… to save it. You can also press Add Current Network as Location, then refine the criteria: a location matches when all the set criteria hold (with SSID and router MAC treated as any-of), so leaving a field blank simply ignores it. When several locations match, the most specific one wins rather than the first in the list. Use the Mode picker to pin a location manually instead of auto-detecting — handy when the signals are ambiguous.

Not all signals are equally trustworthy, and this matters more than it sounds. A subnet prefix is not an identity: home routers, cafés and hotels hand out 192.168.1.× everywhere, so a location defined only by its subnet would happily match a completely different building. The router MAC is the strongest signal — it is unique to one piece of hardware and readable without any special permission — which is why Update all criteria from current network is the one-click fix for a location that was saved before router matching existed.

8.23.1Pinning a place with GPS

For the awkward case — two sites that genuinely share a subnet and you would rather not fuss with MAC addresses — a location can also carry a GPS pin. Stand in the place, open the location and press Pin This Spot (GPS); a Radius slider sets how far counts as "here" (150 m by default, because indoor positioning is coarse and a site is a building, not a point).

The pin is a cross-reference, not a requirement. It does two things: it lets a weak match be confirmed, and — more usefully — it lets a wrong one be vetoed, so Home stops claiming a café that happens to use the same subnet. To keep that from ever making detection worse, a location identified only by shared criteria (a subnet, a VPN toggle) is no longer reported as confirmed when a position is available and contradicts it; you get Away / Unknown instead of a confident wrong answer.

NoteIf Location Services is off, denied, or simply has no fix yet, every GPS rule is skipped and matching behaves exactly as it did before — network signals only. The feature can only make detection more accurate, never less available. FrontierStack already asks for Location access to read Wi-Fi network names, so pinning a spot needs no new permission.
SecurityCoordinates are stored on your Mac alongside the location and are never sent to your phone or anywhere else — the companion app only ever sees a phrase like "within 150m of a pinned spot". Positioning is deliberately coarse (hundred-metre accuracy), which is ample to tell two sites apart without holding a precise-GPS session open.

Devices belong to Locations too. In Device Discovery, a monitored device's ⋯ menu ▸ Assign to Location places it at a specific site — or leave it Automatic, where it falls into whichever location owns its subnet. You can also set it from the device's own pane, and each location's row lists the devices assigned to it. Private subnets repeat between sites, so a device pinned elsewhere can land in a location by subnet; press its × in that list (or choose No Location) to remove it, and a matching subnet won't put it back. When the Mac arrives at a recognised location, FrontierStack checks those devices (skipping any seen recently, e.g. over VPN) and shows each one's status: green reachable, red if it should be here but isn't answering, and orange when it's on a Wi-Fi segment this Mac can't reach — usually a different access point or band, such as a 2.4 GHz-only sensor while the Mac is on 5 GHz. Orange means “can't verify from here”, not “gone”.

Linked subnets. A location can also claim devices on subnets the Mac isn't on: list IPv4 CIDRs such as 10.20.0.0/24 in its Linked subnets field, or pick one from the Tailscale Routes menu, which lists the subnet routes on your tailnet. This is the way to give a remote site reached through a Tailscale subnet router its own devices. A linked subnet only places devices and outranks a look-alike subnet prefix on another location. It never makes the Mac “at” that location, because a routed subnet answers from anywhere. Tailnet 100.x addresses are scattered across the tailnet, so assign those devices by hand.

Same address, different hardware. Two sites can both have a router at 192.168.0.1, so FrontierStack identifies routers and devices by their hardware (MAC) address rather than trusting the address alone. A pinned router counts as up only when its MAC answers, and a router whose MAC is a location's router MAC belongs to that location. A location saved without a router MAC learns it automatically the next time it is identified by its access point (BSSID), or by its Wi-Fi name plus a GPS fix inside its pin. A Wi-Fi name on its own is not enough, because a travel router takes the same name everywhere. When a device's address changes, typically a new DHCP lease, a pinned device with a known MAC that stops answering on a trusted location's LAN is looked for by MAC across that subnet and its pin is moved to the new address (Followed by MAC from …). That check runs at most every five minutes per subnet and backs off to hourly while nothing turns up.

The point of all this is the Location-Dependent Monitoring section. Mark a device, Wi-Fi network, Cloudflare zone or watch as critical in Overview ▸ Alerts, then scope it here to Only at Office. That check is paused everywhere else: your NAS won't ring as DOWN from a hotel, and your home Wi-Fi won't alert as lost while you're at work. Paused items resume silently when you return. When the location itself changes, FrontierStack can post a local notification, send a "📍 Now at: Office" alert through your Messaging Gateways, or both.

screenshot to be added
Figure 8.1. The Locations pane: the current location at the top with its live Wi-Fi/IP/VPN snapshot, the saved locations below, and the location-dependent monitoring list.Capture: open Locations & Places ▸ Locations with two or three locations defined and one device scoped to a location
Why a laptop needs locations
A Mac mini bolted to a rack is always on the same network, so it never needs locations. A laptop is the opposite: it roams. Without locations, a LAN-only check ("is the office NAS up?") fails the moment you leave the building, and you get paged for nothing. Locations make reachability honest — checks only run where they can actually succeed.
NoteThe AI Administrator can read this with the get_location tool: the active location, how it was determined (pinned vs auto-detected), the live snapshot, and every configured location's criteria. It uses this to reason about whether a LAN-only service is reachable from where you are now, or whether you're away over VPN.

A server joins the fleet through the Link a Server sheet — reachable from a device's pane, from Device Discovery, or from the Cloud Servers and Remote Tools panes. Enter a name, the host or IP, the port, an SSH username (root, ubuntu, ec2-user…) and the login password. That password is used exactly once: the app installs this Mac's managed SSH key into the server's authorized_keys, then connects key-only from then on. Nothing is stored except the server's address — the password is discarded.

For a key-only server with no password login, expand Can't use a password? Install the key manually, copy the shown public key into the server's authorized_keys yourself, then link. Tick Also install the monitoring helper to set up the host monitor in the same step (covered below).

Windows and Tailscale servers. A Windows PC running OpenSSH links the same way: FrontierStack notices the Windows shell and installs the key with PowerShell — for an administrator account into C:\ProgramData\ssh\administrators_authorized_keys (with the permissions sshd requires), otherwise into the user's .ssh\authorized_keys. The server's SSH host key is recorded in FrontierStack's own trust store, so linking also works when your ~/.ssh/config discards host keys for some addresses (a Host 100.* rule with UserKnownHostsFile /dev/null for Tailscale is common).

Servers whose login shell isn’t sh. FreeBSD’s root account (csh or tcsh on FreeBSD 13 and earlier), OPNsense’s console menu shell and fish users link and run commands normally. Before the first command of each app run, FrontierStack asks the server for its login shell once; when it isn’t sh-compatible, every script is handed to /bin/sh intact instead of being parsed by that shell. sh, bash, zsh, ksh and dash servers receive commands exactly as before.

Linked servers carry a small green or red status dot for reachability. If it goes red with Permission denied (publickey) — typically after a server is reinstalled, or the key was never installed — the AI tool repair_ssh_access clears the stale host key and re-installs the managed key, using a one-time login password you keep as a vault secret. The password is read locally and re-installs key access; on success the dot turns green again.

The host's Status section also shows a Connection row: what actually carries the server's default route — the negotiated Ethernet rate (10 GbE, 2.5 GbE, 1 GbE), the Wi-Fi generation (Wi-Fi 7 = 802.11be, Wi-Fi 6E/6/5) with its channel width, or a VPN tunnel. It is read during the normal status probe on Linux, macOS and FreeBSD hosts, and reported by the host monitor agent (v1.17+) on agent-only hosts. The same row appears for This Mac, and on SNMP devices the Interfaces query now lists each port's negotiated link speed.

Each server also has a Connect via setting (in its Edit sheet) for interactive shells: plain SSH (default), mosh — which logs in over your SSH settings and then switches to its own UDP transport, so the session survives sleep, roaming and flaky links — or experimental SSH3 over QUIC/HTTP3, whose server can hide behind a secret URL on UDP 443. Open Shell and Open SSH honour the choice; probes and file transfers always stay on plain SSH. Both clients are in the Services catalogue (mosh via Homebrew, SSH3 via Go).

SecurityThe login password you type into Link a Server never leaves your Mac and is never stored — it authenticates one connection to copy the public key, then is discarded. Access afterwards is key-based and passwordless. The repair_ssh_access tool reads its one-time password from the local .env vault by name; the value is never sent to the AI model.

8.3The managed key and the saved sudo password

Key access lets the app connect, but many useful operations — reading /var/log, editing Apache config, reloading a firewall — need root on the server. FrontierStack handles this with a per-host sudo password, saved in the macOS Keychain (never in plain files). It is captured automatically when you link a server, and you can set or change it later in the host's pane or in the Remote Tools target section (the Sudo password field).

When a root-only command runs, the helper primes sudo's credential cache with that saved password over the SSH session, then runs the command. If no password is saved, root operations fall back to passwordless sudo -n and simply report "needs sudo" when that isn't configured. Because secrets are referenced by name, you can keep several — for example a distinct MySQL password per server in the .env vault.

SecurityPer-host sudo passwords live in the Keychain, keyed to the host. They are handed to sudo -S over the encrypted SSH channel only when a root action actually runs, and they are never shown to the AI model or written to logs. Revoke one by clearing the field; re-enrol or re-key a single host without touching the others.
NoteFull Fleet. Running one operation across several servers at once needs a Full Fleet licence. On Standard the pane stays open and a run targets a single server — one-at-a-time remote work is part of Standard.

8.4Fleet Run — one command across every node

Fleet & Remote ▸ Fleet Run fans a single operation out across all linked servers at once, or a selected subset, with a live per-host result. Pick your Targets (toggle hosts; the reachability dot shows which are up), choose an Operation, and press Run on N Server(s) — everything runs concurrently over SSH and each host reports back below, expandable to its full output.

Operations are OS-aware: a package update maps to apt, dnf, pacman, zypper, apk or brew depending on the host; a service restart tries systemd, then Homebrew. You never write per-OS commands by hand.

OperationWhat it does across the fleet
Update / upgrade all packagesRuns the host's package manager's update + upgrade. Confirmed before it fans out.
Install a packageInstalls a named package (e.g. htop) on every selected host.
Restart a serviceRestarts a named unit (e.g. nginx) via systemd or brew.
Check reboot-requiredReports which hosts are waiting on a reboot after updates.
Disk usage (df)One-shot df across the fleet to spot a filling disk.
Uptime & loadUptime and load average per host.
git pull a repoPulls a repository at a given path on each host — a quick deploy.
Custom commandRuns a verbatim shell command on every selected host. Double-check before fanning out.
PHP versions & security fixesRead-only. Lists every PHP on each host and compares it with php.net’s latest release of its branch (below).

Fleet Run is the fastest way to spot drift: run Disk usage or Uptime & load to compare hosts at a glance, or use the file-checksum and health-check tools in Remote Tools (next) to find a config that's diverged across the fleet.

PHP versions & security fixes answers the question every PHP security release raises: which of my servers still need it? It lists every PHP on each host — Homebrew, MacPorts, MAMP, Apple’s own, distribution packages, and OPNsense or pfSense firmware over SSH — shows whether the host serves PHP to the web through php-fpm, php-cgi or mod_php, and compares each install with php.net’s latest release of its branch. Installs behind a security release, or on a branch that no longer gets fixes, are flagged in the results. It changes nothing. When something is flagged, Copy AI Prompt puts a prompt on the clipboard for Claude Code, the AI Administrator or another agent: it names the servers and versions found and asks the agent to update PHP from the source each server installed it from, one server at a time, checking with you before every change, then restart whatever serves PHP and confirm the new version.

NoteDistribution and firewall packages often carry a security fix without a new version number, so a flagged Linux or firewall install may already be patched. The prompt asks the agent to check the vendor’s security tracker for those rather than trusting the version alone.
WarningThe Custom command and Update all operations run with a destructive-action confirmation because they execute verbatim on every selected host simultaneously. A typo fans out everywhere. Select a single canary host first when trying something new.

8.5Creating a container, here or on a server

Everywhere FrontierStack lists containers there is a Create Container… button, and they all open the same sheet: the Docker pane for this Mac, the same pane with a linked server chosen in the host picker, and the Docker tab of the Server Activity window. What you build runs on whichever target you started from — locally through the docker binary, or on a server over the SSH connection you already have.

Start from a preset or from blank. The presets cover plain images — nginx, PostgreSQL, MySQL, Redis, a throwaway Ubuntu shell — and every self-hostable service the app can run as a single container, such as n8n, Flowise, Langflow, Vaultwarden and Checkmk. Choosing one fills in its image, port, volumes and environment, all of which you can change. Services that need a docker-compose stack are installed from their own pane on this Mac instead, and the sheet names them so nothing looks missing.

FieldWhat it does
ImageThe image reference, with a menu of images already on the target.
NameOptional, and checked against the names already in use there.
Published portsEach has a This machine only switch that binds 127.0.0.1, so a port is not exposed to the network unless you say so.
VolumesA plain name is a Docker-managed volume; a path starting with / is a folder on the target.
EnvironmentAny variable can be marked secret, so it is entered as a password and hidden from the preview.
AdvancedRestart policy, network, a command override, extra Docker arguments, and whether it runs in the background.

Before anything happens the sheet shows the exact docker run line with secrets replaced by dots, and lets you copy it. Creating pulls the image first (unless you turn that off) and then runs it, streaming the output back into the sheet.

NoteOn a server the command falls back to passwordless sudo docker when the SSH user is not in the docker group — the usual reason a first attempt on a fresh Linux box reports a permission error.
WarningWithout a volume, everything the container writes disappears when it is removed. The presets that carry data — the databases especially — come with a named volume already filled in.

8.23.2The Containers board as a monitor

The Containers pane is not only a list. It carries a status dot that rolls every runtime on this Mac into a single verdict, so a glance at the sidebar tells you whether anything needs attention. Green means everything installed is healthy; orange means something is stopped or still being probed; red means an installed engine is down, or a container is unhealthy, restarting, or exited with an error. A runtime you have never installed is not a fault — green therefore reads as “everything present is happy”, not “everything is running”.

The sections follow the same order as the services list: Apple Containers, Docker, Kubernetes, OrbStack, container machines, then Vagrant. Kubernetes appears here read-only, showing the clusters you pinned in Kubernetes Clusters; pinning and per-cluster actions stay in that pane, which watches whole clusters wherever they run rather than only what is on this Mac. Where a runtime is not installed, the button opens the pane that installs it instead of sending you to a download page.

The pin button in the header opens a small floating palette: a single status bar with the overall dot and a running count, above a short list of what is running, with anything set up but idle grouped under Waiting. It is deliberately tiny — something to leave in a corner of the screen while you work elsewhere. Clicking any row jumps the main window to it.

8.23.3Docker Swarm

Swarm is not a separate product to install — it is built into the Docker engine, which is why FrontierStack monitors it from the Docker pane rather than giving it a pane of its own. When the engine you are looking at belongs to a swarm, a Docker Swarm section appears listing the cluster's nodes (ready or down, whether one is draining, and which are managers) and its services with their replica counts — 3/3 when a service has every task it asked for, 1/3 when it does not. The Server Activity window's Docker tab carries the same thing as a Swarm segment, so you can read a cluster from any linked server.

The state comes from docker info, which the pane already calls for engine health, so a machine that is not in a swarm costs nothing extra to check. One rule of Swarm shapes what you see: only a manager may list the cluster. Ask a worker and its daemon refuses, so on a worker FrontierStack tells you that plainly rather than showing empty tables that look like a failure.

NoteSwarm feeds the Containers status dot. A node that is down turns it red; a service short of its replicas, or a node set to drain, turns it orange. A service you scaled to zero on purpose is not a fault and is left alone. These views are read-only — FrontierStack will not deploy, scale or drain a swarm for you.

8.23.4Ready-made stacks

Some things are not one container but several that are useless apart. Install Stack…, on the Containers pane and in the Server Activity window's Docker tab, sets up a whole group at once. Four ship with the app: the *arr media stack (Prowlarr, which holds the indexer list the others read, plus Sonarr for series, Radarr for films, Lidarr for music, Readarr for books, Bazarr for subtitles and a download client), Monitoring (Prometheus, Grafana and node-exporter), a Media server (Jellyfin, optionally with Jellyseerr for requests) and Immich, a self-hosted photo library that genuinely needs four containers — server, machine learning, Redis and PostgreSQL.

You choose which members to include, where the config and media folders live, the user and group the containers write as, and a port offset that moves the whole stack clear of something already listening. Published ports bind to 127.0.0.1 unless you say otherwise. FrontierStack then writes a docker-compose.yml into the project folder and runs docker compose up -d. Compose is what makes a stack a stack: the members share a network and address each other by name, which is why Sonarr's indexer setting can simply be http://prowlarr:9696.

TipThe sheet shows the exact script before anything runs, and the compose file stays on disk afterwards. Editing that file and running docker compose up -d again is the normal way to change a stack later — FrontierStack has not hidden anything from you.
NoteStacks are Docker-only. Apple's container CLI has no compose equivalent, and on a custom network it cannot yet resolve another container by a bare name, so the members could not find each other the way a stack needs.

8.23.5Apple containers, and the GUI we recommend

On Apple silicon, macOS can run Linux containers natively through Apple's own container command, where each container gets its own lightweight virtual machine instead of sharing one big Linux VM. The Containers pane has an Apple Containers section for this: it lists what is running, starts and stops the container system, pulls images, and creates new containers, in the same shape as the Docker section above. Apple's tool is a command-line program, and FrontierStack installs it from its GitHub releases.

For day-to-day work with Apple containers we recommend Davit, an independent macOS app that puts a proper graphical front-end on that same container command — browsing containers and images, starting and stopping them and following logs, without having to remember subcommands. The Apple Containers section installs it for you through its Homebrew cask and opens it afterwards. Davit needs Apple silicon and macOS 15 or newer.

NoteDavit is a front-end, not a runtime. It drives the same container CLI that FrontierStack drives, so the two always agree about what is running — but Apple's container must still be installed for either of them to have anything to talk to. Installing Davit on its own is not enough.

8.23.6Watchtower on your servers

Watchtower keeps Docker containers up to date by pulling new images and recreating the containers. When a linked server runs it, FrontierStack finds the container in the regular status check and reads its settings and log over SSH, at most hourly. The server pane, the Server Activity window’s Docker tab and the Watchtower pane under Containers show its last scan: how many containers it scanned, updated and failed to update. They also show its schedule and mode, and any errors since. Notification URLs and API tokens are never read. Alerts fire when Watchtower stops, when Docker refuses it, when updates fail, or when scans stop arriving.

WarningThe original containrrr/watchtower was archived in December 2025. Docker Engine 29 and later refuse its API version, so it restart-loops without updating anything. FrontierStack names that cause and flags servers still on the archived image. Switch to the maintained fork nickfedor/watchtower, which takes the same options; the Watchtower pane has a ready-made docker run command.
The Containers pane with a small demo compose project running in Docker: each container&rsquo;s image, uptime, ports, CPU and memory, with Logs, Shell, Restart and Stop one click away.
Figure 8.2. The Containers pane with a small demo compose project running in Docker: each container’s image, uptime, ports, CPU and memory, with Logs, Shell, Restart and Stop one click away.

8.6Remote Tools — per-node diagnostics

Fleet & Remote ▸ Remote Tools is a suite of SSH-driven diagnostics, distilled from real fleet-debugging work. Choose the target first — a pinned server, or Other (IP / host)… for an ad-hoc address that isn't a saved server (its sudo password persists in the Keychain too) — then the tool and its parameters. Read-only checks need no root; ones that read protected logs or config use the saved sudo password through the helper, and a few are marked mutating.

ToolPurpose
Ping · Traceroute · WhoisBasic reachability, path and registration lookups, run from the chosen node.
Net Info · NetstatInterfaces and addresses; routing table, interface/protocol stats, active sockets.
Port Scan · Port Check · Web CheckScan a range, test a single port, or fetch an HTTP/HTTPS endpoint and report the status.
TLS Inspect · TLS ExpiryInspect a certificate; check expiry across selected nodes at once.
System Resources · Listening PortsLoad, memory and disk for the node; what's listening (optionally with sudo).
Tail Log · Config TestTail any log path; validate the web server's configuration.
File Diff · HealthcheckCompare a file's contents across nodes (drift); hit a vhost's paths over loopback on each node.
rsync DeployPush a local folder to a remote path — with a dry-run preview and an optional --delete.
Security · SSH · Exposure · Auth · User auditsRead-only audits (see Chapter 10) on any node or ad-hoc IP.
Flush DNS · Restart BackendFlush the resolver cache; kick the macOS Server web backend (mutating — sites blip).

Some tools work across several selected nodes at once — File Diff, Healthcheck, TLS Expiry and Serving Path Diagnosis (who's up, which public IPs each node binds, per-process CPU saturation and stopped services, cross-checked against every pinned Cloudflare zone's origin IP) are fleet-wide by design — which is exactly how you confirm every web node is serving the same content with a valid certificate. The bottom of the pane also offers safe over-SSH editing of /etc/hosts (root, through the helper) and the SSH user's ~/.ssh/known_hosts, each backed up to .fsbak first.

8.7Recovering a wedged server — and a safe power reset without SSH

A server can stop answering SSH while its services keep running — overloaded, not down. FrontierStack shows this: when SSH is unreachable but a service port still answers (say MySQL on 3306), the server's dot turns orange, not red, and its pane reads "SSH is wedged, but the server is still serving" and lists what's answering, with the database's version banner. The machine is alive — only its management channel is stuck — so don't assume it's dead or blindly cut the power.

Try a normal Reboot first. After Reboot, the dot flashes while FrontierStack waits out a grace period and then polls, refreshing the instant the host returns — no need to keep pressing Refresh.

Make a power reset safe — without SSH. When a database is still answering, the pane shows a red-outlined EMERGENCY box, Prepare databases for a safe power reset. Each step runs over the database's own connection (no SSH), using the credentials saved in Database Health, top to bottom: Stop accepting writes (reads still work, reversible), Quiesce & flush to disk, then Clean-shutdown. After a clean shutdown a hard power-cycle is safe, because nothing dirty is left in memory to corrupt. Coverage differs by engine — MySQL, Redis and MongoDB can be cleanly stopped over their protocol; PostgreSQL can be quiesced and flushed but not stopped over SQL, so you flush then power-cycle. The clean-shutdown button is red and confirms first.

Power-cycle, then bring it back. The hardware power controls (SwitchBot plug, smart powerboard/PDU, KVM) each offer Shut Down Databases First in their confirmation, so you can flush and stop the databases before cutting power. And if the shutdown relieved the pressure and SSH recovers, a Start button starts the database again over SSH — so the ideal path is often: clean-shutdown the runaway database, let the box recover, and Start it, with no power-cycle at all.

WarningThe emergency shutdown actions use the database credentials you saved in Database Health and send privileged commands (read-only, flush, shutdown) over the database's network port. They're deliberately framed in red, gated behind a confirmation for anything that stops a service, and meant only for a server that is genuinely wedged — try a normal Reboot first.

8.8The Host Monitor (remote agent)

SSH diagnostics run on demand. For continuous visibility, install the Host Monitor — a tiny, read-only Go helper (fsagent) that lives on the server and reports its own health, with no per-cycle SSH. From a linked host's pane, choose to install it (or tick the box in Link a Server); over the existing key the app pushes the right binary for the host's OS and architecture, sets up the platform service (systemd, launchd or BSD rc.d), and pins its TLS certificate. The AI tool install_monitor does the same on request.

LAN and Tailscale at once. The monitor listens on the address this Mac used to install it, plus the server's own LAN address and its Tailscale address — never on every interface, and never on a public or container-bridge address. If it stops answering at one (say you left the office and now reach the server over Tailscale), FrontierStack switches to another address that presents the same pinned certificate. A monitor installed before version 1.22 answers on one address only: Detect monitor tells you when it is running but out of reach, and Install & Enroll upgrades it.

Once enrolled, the monitor streams live metrics: CPU, memory, per-mount disk, network interfaces up, detected services, firewall and fail2ban state — and on GPU hosts, per-GPU temperature and utilisation, so a mining or ML rig surfaces thermals. list_monitors reports the fleet's helpers, their versions and latest metrics. Crucially, the monitor keeps watching and can alert even when the Mac app is offline, notifying directly through its own channels and replaying anything it buffered when the app returns. Logs windows prefer the monitor too — it runs as root on the server, so it reads privileged logs without needing the sudo password at all.

An enrolled host's pane also keeps a Behavior & History chart — CPU, memory, disk and temperature at five-minute resolution for up to 30 days, against a learned baseline that flags unusual behaviour. Temperature uses its own degree-marked scale, so it remains readable beside percentage-based resource use. Vertical lines place incidents on the same timeline: a solid red line is a server reboot (derived from the reported uptime), a dashed orange line is a watchdog issue — a forced service restart, a database-corruption warning or a reboot escalation. If the OS crash reporter starts using CPU (a process crashing repeatedly), an orange Crashes curve joins the chart, so "MySQL was force-restarted twice last night and something was crash-looping" is visible at a glance. Open Crash Logs… under the chart opens the server’s log viewer on its crash, hang and panic reports (macOS DiagnosticReports), so you can see which process that curve was about.

The Behaviour &amp; History chart: CPU, memory, disk and crash-reporter curves over 24 hours, a solid red line marking a reboot, and a "no unusual behaviour" verdict against the learned baseline &mdash; 5-minute resolution, 30-day retention.
Figure 8.3. The Behaviour & History chart: CPU, memory, disk and crash-reporter curves over 24 hours, a solid red line marking a reboot, and a "no unusual behaviour" verdict against the learned baseline — 5-minute resolution, 30-day retention.Capture: capture: an enrolled host's pane scrolled to Behaviour & History on the 24-hour tab, with at least one reboot line visible.

The monitor is read-only by default. Turning on Allow actions in its Host Monitor pane unlocks a small, fixed set of control verbs — never arbitrary shell — driven by the gated monitor_action tool: restart/reload/start/stop an allowlisted service, flush DNS, reload the firewall or fail2ban, or reboot. Each action is logged on the server. Targets cover Linux (amd64/arm64/arm — covering every Raspberry Pi), macOS (including legacy Intel builds back to OS X 10.11 El Capitan), FreeBSD (pfSense/OPNsense/TrueNAS) and Windows.

Keeping a monitor healthy over time is handled for you. Rotate monitor credential replaces its bearer credential in place: the new secret is generated on the Mac, sent over your approved FS1 signing key, and activated on the server without ever being shown or handed to an AI. With Allow self-update enabled, pushing a newer build is safe by construction — the candidate binary's release signature is verified, it must pass a compatibility self-test before it is given root, and the previous binary is kept as a rollback; if the new one fails to answer its health check, FrontierStack restores the old one automatically. Pull-mode updates fetch the binary through a short-lived, single-use grant rather than a durable token. When a monitor is verifying FS1-signed requests, its pane shows a FS1 signed badge.

NoteIn the interface these helpers are deliberately called Monitors / the Host Monitor, never "agents", to keep them distinct from the app's AI agents. A monitor watches and reports; the AI Administrator is the thing that reasons and acts.
SecurityThe Host Monitor ships read-only and stays that way until you explicitly enable Allow actions — and even then it can only run a fixed allowlist of verbs, never an arbitrary command. Its control plane is TLS with a pinned certificate and a per-host bearer token you can rotate at any time; self-updates are release-signature verified, self-tested and auto-rolled-back. Revoke and re-enrol one host without touching the rest.

8.9When a server stops answering: what FrontierStack last saw

The server that has stopped answering is exactly the one whose details you need: its address, to try another route; its hardware, to find it in the rack; the services it was running, to know what is affected. So FrontierStack keeps a record of each linked server as it last saw it while the server was answering, and shows that record instead of a pane full of blank checking… fields.

When a server stops answering, its pane opens with an orange line — Not answering — details below are what FrontierStack last saw, followed by when that was — and the remembered values appear dimmed, each marked with a clock icon. Under Services, a Running when last seen list shows what was running at that moment. A dimmed value is not a live reading: it is what was true then, and the server may have changed since. As soon as the server answers again, the live values replace them.

RememberedDetails
SystemOS version, hardware, and the uptime when last seen.
AddressesIPv4 and all addresses; stable IPv6 addresses (link-local and temporary privacy addresses are left out, because they change or are useless from another machine); the Tailscale IP and MagicDNS name; the public name.
NetworkDNS resolvers and the connection type (Ethernet rate, Wi-Fi generation or VPN).
ServicesThe services running when the server was last seen.
Scheduled rebootRestarts the operating system itself has been told to perform: a repeating restart in Energy settings (pmset), a LaunchDaemon that calls reboot or shutdown, cron entries, systemd timers, and unattended-upgrades’ Automatic-Reboot. None set is remembered too, so you can rule a scheduled restart out.
Monitor settingsThe monitor’s version, Allow actions and Allow reboot, the watched services, the Lockup reboot settings, the reboot sentinel’s state and which kinds of direct alert are on — never alert URLs or tokens.

Two rows in the Status section are new, and live whenever the server answers. IPv6 lists the stable IPv6 addresses. Scheduled reboot shows any restart the operating system has been set to perform on its own — the first thing to check when a server “mysteriously” reboots at the same time every week.

The AI Administrator sees the same remembered details, labelled as last seen and dated, so “what was the IP of the server that just went down?” has an answer even when the server can’t give one (Chapter 13).

screenshot to be added
Figure 8.4. A linked server that has stopped answering: the orange “Not answering” line, the remembered OS, addresses, Tailscale name and scheduled reboot dimmed with clock icons, and the “Running when last seen” services.Capture: capture: a disposable lab server that FrontierStack has checked at least once, then powered off or disconnected; open its pane after the next check so the orange line shows, with the Status section and the Running when last seen list both visible. Lab addresses and example names only. 1400x900, light mode.
SecurityThe record is kept on this Mac only, in a file readable by your user account alone, and it is forgotten when you remove the server. It holds no passwords, tokens or alert URLs: the monitor’s settings are recorded by kind, never by secret.

8.10Lockup reboot: when the server is on but nothing gets in

The Service Watchdog (Chapter 11) heals one service at a time. Some failures take out the whole machine while every service still looks fine from inside: a Mac whose SSH and Screen Sharing stop responding, or a server that has quietly lost its network. Nothing outside can reach it to fix it, so the fix has to come from the server itself. Lockup reboot, in the server pane’s Service Watchdog panel, is that fix. It needs monitor 1.23.0 or later; the panel says so if the server’s monitor is older.

SettingWhat it does
Reboot if SSH stops answeringThe monitor connects to the SSH port (22 unless you change it) and waits for sshd’s SSH greeting — not merely an open port. A wedged Mac often still accepts the TCP connection on port 22 and then drops it before saying anything; a port check would call that healthy.
Reboot if the server loses the networkThe monitor checks that it can still reach its default gateway. Optionally list extra targets as host or host:port; if any of them answers, the server counts as online.
Reboot after N minutes of continuous failureDefault 10 minutes. The failure must last the whole period without a single good check in between.
At most one automatic reboot every N minutesThe boot-loop guard: however long the failure lasts, the server reboots itself at most once per interval.

A check only arms after it has worked at least once since the monitor started. A server with no sshd, or with no gateway the monitor can find, is therefore never rebooted by it — the check simply keeps waiting. The server also refuses to reboot unless Allow actions and Allow reboot are both on in the pane’s Remote Actions section, and the panel warns you when they are not.

While Lockup reboot is on, the panel shows each check’s live state — answering · armed, waiting for a first good check, or failing since a given time — the gateway the network check is using, and the time of the last automatic reboot.

WarningThe network check cannot tell “this server lost the network” from “the network lost its gateway”. If the gateway itself goes down — a router restart, a failed switch — every server with the network check on reboots, at most once per interval. If that would hurt, add an extra target that stays reachable without the router, such as a neighbouring server on the same switch.

8.23.7The root reboot sentinel

The wedge that prompted this was stranger than a crash: the server’s ports still accepted connections, but sshd and Screen Sharing never answered. The machine could no longer start new processes — so a reboot that begins by starting a shutdown command could not run either. From monitor 1.24.0, a reboot sentinel is installed alongside the monitor on macOS and Linux: the same binary, running as root, with no network listener and no token.

The sentinel has no policy of its own. It acts only on the monitor’s own Lockup reboot settings and permissions, as a backstop: if the monitor’s reboot should have happened and hasn’t, the sentinel reboots the server 3 minutes later (13 minutes into a failure with the default 10). On that path it starts no programs and does not wait on the disk; it calls the kernel’s reboot itself, so it still works when the server cannot start a new process. Just before rebooting, it records whether a process could be started — evidence afterwards for “this server ran out of process slots”. The panel shows whether the sentinel is installed and reporting, when it would act, and its last reboot. If it says the sentinel isn’t installed, update the monitor.

WarningA lockup reboot is a forced reboot. It skips a graceful shutdown, much like holding the power button: services are not stopped in order, so databases go through crash recovery on the next start. That is the right trade for a machine nobody can reach, and it is why Lockup reboot stays off until you turn it on.

8.23.8Process counts

Running out of process slots is how a server ends up accepting connections it cannot start sshd or Screen Sharing for. From 1.24.0 the monitor samples process counts every minute: the total against the kernel’s limit, the per-user limit, and the users running the most processes. The Processes rows in the Lockup reboot area show the current figures, a Last 24 hours chart with its peak, and an orange warning when the total, or one user’s count, nears its limit — the moment to find the runaway before it becomes a lockup.

NoteWhat this cannot catch. A kernel hang stops everything in userland, the monitor and the sentinel included. On a Mac, also turn on Restart if it freezes in Headless Mac Setup, and for power-level recovery link a smart plug in Power Control or set up a recovery observer on another server (Chapter 11).

8.11Cloud Servers, Server Clone & Remote Apache

Alongside the compute panes, AWS ▸ DynamoDB lists the tables in the selected region with their status, item count, size and partition/sort key. It leans on the two things that actually cost you: the capacity mode capsule separates provisioned tables — which bill for their read and write units continuously, whether or not anything touches them — from on-demand tables that bill per request; and a no PITR flag marks any table without point-in-time recovery, which is off by default on every new table and is the only way to rewind after a bad write. Point-in-time recovery can be switched on or off from each row's menu. DynamoDB has no bulk describe call, so each table is queried individually and the list is capped at 40 per region.

Fleet & Remote ▸ Cloud Servers rolls up one inventory across every cloud provider that has a configured API token — DigitalOcean, Vultr, Linode, Hetzner, Sakura, Contabo — plus AWS EC2, Lightsail and RDS. It is a read-only roll-up (power control stays in each provider's own pane). Each running instance with an IP offers a Services button to discover what's listening, and a + Helper button that links the instance over SSH and installs the monitor in one move — just set the right username and key in the sheet.

Google Cloud joins the same inventory through the Google Cloud CLI pane (Hosting). Installing there also runs gcloud auth login in your browser, and FrontierStack then uses your own login without storing a key. Choose a project or All projects, then work with Compute Engine VMs: SSH, start, stop and reset, with a confirmation before a stop or reset. The AI Administrator reads through diagnose and needs your approval for anything other than a list command.

Microsoft Azure joins it the same way through the Azure CLI pane (Hosting). Installing there also runs az login in your browser. Choose a subscription or All subscriptions, then SSH to Linux VMs, or start, stop and restart them, with a confirmation before a stop or restart. Stop deallocates the VM, because an Azure VM that is only powered off still costs compute. The AI Administrator reads through diagnose, limited to a fixed set of commands because many Azure list commands return secrets, and needs your approval for anything else.

Server Clone is a guided wizard that stands a fleet server up to match this Mac: it installs the detected Homebrew stack, copies configs and site files to their original paths, pushes your domain configs and reloads the web server, and can clone MySQL databases (local mysqldump piped into mysql on the target over SSH). Every step runs over key-based SSH and is safe to re-run; existing data isn't deleted.

When a single site is ready to go live, the Promote to Production push (from a domain's context menu) sends its vhost config to the same path it uses locally, optionally copies the document root and database, points DNS at the target via Cloudflare, and can issue a real Let's Encrypt certificate with certbot — files, database, vhost, DNS and HTTPS in one push.

You can also manage a remote server's Apache directly. The Apache pane gains a host selector (This Mac / each linked server) when any remote host exists; pick a server and FrontierStack discovers its Apache over SSH — version, config layout, and every active vhost with its real log paths — and lets you edit vhosts, modules, MIME types, ports and WebDAV, with each change validated (httpd -t) and gracefully reloaded before it sticks, rolling back if the config is invalid. It even understands the legacy macOS Server.app Apache tree. From the Sites list, Push to Server… renders a local site's vhost onto a monitor-linked server with its document root swapped in. Chapter 7 covers the local Apache and Sites workflow these mirror.

When a list has five or more sites, Test All appears beside it, for a linked server or for this Mac. It requests every site once from this Mac, connecting straight to that server, and lists what each answered, with problems first. To start or stop a web server, Control-click the server in the sidebar and choose Start Web Server or Stop Web Server. Stopping asks first.

screenshot to be added
Figure 8.5. The Apache pane with its host selector set to a linked server, showing the remote server's discovered vhosts with Error log / Access log and Edit buttons.Capture: open Apache, switch the host picker to a linked Linux or macOS Server host that has a saved sudo password, show 2–3 discovered vhosts

8.12Screen sharing to a host

Each server's pane offers whatever remote-access method its probe detected — Apple Screen Sharing / VNC for a Mac, RDP for Windows, and AnyDesk, TeamViewer, RustDesk or NoMachine when their clients are present. When Apple Remote Desktop is installed on this Mac it registers the vnc:// handler and captures the click, so the pane offers a separate Screen Sharing (macOS) action that always opens Apple's built-in Screen Sharing client instead. If the host is reachable at more than one address — a LAN IP and a VPN or Tailscale address, say — that action becomes a menu so you pick which network to connect over; each choice dials the numeric IP directly, so it still works when the host's name isn't resolving (mDNS, split-horizon DNS, or a VPN quirk). A matching “— by IP” button appears for VNC and RDP whenever the pane would otherwise use a name that might not resolve.

TipIf a Screen Sharing button connects but shows a black screen or is refused, the host almost certainly hasn't enabled Screen Sharing (or Remote Management) in its own System Settings — the button only opens the client; the listener has to be on at the other end.

8.23.9Your own RustDesk server

RustDesk is the open-source remote desktop you can run entirely yourself, and its pane (Fleet & Remote ▸ RustDesk) does more than open the client. It watches your self-hosted RustDesk server without credentials — a real rendezvous exchange with the ID server (hbbs, TCP 21115, so an unrelated open port can't pass), TCP 21116, and the relay (hbbr, TCP 21117) — and raises an Alert when it stops answering.

It also shows which server this Mac's RustDesk client uses, and warns when the client is still on RustDesk's public servers or holds a missing or different key. To bring clients across, paste each server's public key (id_ed25519.pub) and copy either the config string clients import under RustDesk ▸ Settings ▸ Network, or the file name to give the Windows installer so it configures itself. RustDesk Server has no macOS build, so Run your own RustDesk server gives a Docker compose file for a Linux server or VPS, with the ports mapped explicitly and hbbr -k _ so the relay serves only clients that hold your key.

SecurityThe client check reads only the server settings in RustDesk2.toml, never the file that holds the device password. Self-hosting keeps the record of who connects to whom off RustDesk's public servers; sessions are end-to-end encrypted either way.

8.13KVM-over-IP: console and power, lights-out

SSH and Screen Sharing need the machine to be up and on the network. When it isn't — a kernel panic, a BIOS/firmware screen, a network stack that never came up — you need out-of-band access: a KVM-over-IP appliance that captures the real HDMI output and injects USB keyboard/mouse, independent of the operating system. The Remote KVM pane registers as many of these as you own — PiKVM, JetKVM, TinyPilot, NanoKVM, GL.iNet Comet, or any generic unit — each pinnable, each one click from its web console down to the BIOS.

Units with power control close the loop. A PiKVM with an ATX board, a network PDU, or GL.iNet's Comet Pro (GL-RM10) — which is a KVM and a smart power plug in one device — can switch mains power, so you can hard power-cycle a truly frozen box. Link such a unit as a server's power source in its Power section (beside SwitchBot, UPS and PDU commands) for On/Off/Cycle. The AI Administrator can drive it too: list_kvms, kvm_power, and server_power — the last reaches a host's linked plug/PDU/KVM to restart a hung server that won't answer reboot_host.

WarningA power-cycle cuts mains power to the machine — unsaved work is lost and a disk caught mid-write can corrupt. Try a normal reboot first; use the hard cycle only when the host is genuinely unresponsive.

8.14Console connections: serial and console-server access

A router or switch that has lost its network configuration can't be reached by SSH, its web UI or a KVM — but its console port still works. The Console Connections pane (Fleet & Remote) is a serial terminal built into FrontierStack. Plug in a USB-to-serial adapter (FTDI, Silicon Labs CP210x, WCH CH340/CH9102, Prolific), or connect the device's own USB console port (Cisco's USB mini-B or USB-C, Netgate firewalls), and it appears under Attached serial ports within a couple of seconds, with the adapter's chip named. Quick Connect opens it at a chosen speed without saving anything. Save as… stores a connection with a vendor's console settings: Cisco, Juniper, Arista, Aruba CX, ProCurve, Ruckus, Fortinet, Palo Alto, SonicWall, WatchGuard, pfSense/OPNsense, MikroTik, Ubiquiti, TP-Link Omada, Dell OS10, Allied Telesis, APC, Raspberry Pi, Linux, and board-level UARTs on OpenWrt and GL.iNet routers.

Every setting stays editable: speed (any rate the adapter supports, including 460800 and 921600), data bits, parity, stop bits and flow control, plus what Return sends (CR, CR LF or LF), Backspace as ^H, local echo, and LF → CR LF for devices that stair-step down the screen. If an adapter is moved to another USB socket and macOS renames it, FrontierStack finds it again by its USB serial number. A console server (Lantronix, Opengear, Digi, Avocent ACS, a Cisco terminal server's reverse telnet, or ser2net on a Raspberry Pi) is added as a telnet, raw TCP or SSH connection.

Each session opens in its own window. Break sends a line break — the signal Cisco ROMMON, Juniper and most boot loaders wait for during password recovery. DTR and RTS can be toggled. A paste delay sends a pasted configuration one line at a time, so a 9600-baud console doesn't drop characters. A session log saves everything the device sends to ~/Library/Logs/FrontierStack/Console, and Export saves or emails the screen. Link a connection to a pinned device and it appears in a Console section on that device's page; a console added from there starts with the platform's usual settings. The AI Administrator can list your consoles and attached adapters (kvm, action consoles), but it never opens a session or types into one.

screenshot to be added
Figure 8.6. The Console Connections pane: one attached FTDI adapter with Quick Connect, and two saved connections (a Cisco switch and a MikroTik router), one expanded to show its line settings.Capture: open Fleet &amp; Remote ▸ Console Connections with a USB serial adapter plugged in, a Cisco and a MikroTik connection saved, the Cisco row expanded
TipIf the console shows nothing at all, press Return a few times, then check the speed. Then check the cable: an RJ-45 console port needs a rollover cable, and a straight-through Ethernet cable shows nothing.
WarningBoard-level UARTs on consumer routers and Raspberry Pis run at 3.3 V. Use a 3.3 V USB-TTL adapter and never connect its VCC pin; an RS-232 adapter's voltage damages the board. Telnet and raw TCP consoles are unencrypted, so use them only on a management network or over a VPN.

8.15Boot Media: installing an operating system over the network

Reinstalling a server used to mean a trip to the rack with a USB stick. The Boot Media pane (Fleet & Remote) replaces the stick: you keep installer images in one library on this Mac, and FrontierStack presents the one you choose to the target machine as a virtual CD — through the server's management controller, a PiKVM, a Proxmox VE virtual machine's CD drive, or a network boot menu. Macs are handled differently, because Apple no longer lets them boot that way; see Macs below.

screenshot to be added
Figure 8.7. The Boot Media pane: the image library at the top, the media server with its serving timer and recent requests, and a Redfish controller expanded to show its virtual CD slots.Capture: capture: Boot Media pane with two local ISOs and one remote URL in the library, serving on with the timer visible, and one iDRAC or iLO controller expanded after Read Controller so its system and virtual CD slot are listed.

8.23.10The image library

Add ISO or Disk Image… records a local file; the file stays where it is and nothing is copied. Add Image URL… records an image that already lives on a web or file server (http, https, nfs or cifs) — a remote URL is handed straight to the target, so this Mac never has to carry the bytes. Compute SHA-256 records the file's checksum so you can compare it with the vendor's published one before installing anything from it. Each entry can be renamed, shown in Finder, removed from the library, or its served address copied with Copy Image URL. An entry whose file is no longer at its saved location is flagged as missing.

8.23.11The built-in media server

A management controller mounts an ISO by reading it over HTTP, piece by piece, for as long as the install runs. The pane's Media server serves the library's local images for exactly that: it supports byte-range requests and keep-alive, which virtual CDs need, and shows a log of recent requests and the bytes served per image, so you can see a controller actually reading. It starts automatically when a target needs a local image, or you can press Start Serving yourself.

SettingWhat it does
Stop serving after1, 3, 6, 12 or 24 hours, or Until I stop it. Every read restarts the clock, so a slow install is never cut off mid-way. Serving also stops when you quit FrontierStack.
Address in image URLsAutomatic uses the address this Mac uses to reach each target, so a controller on a separate management VLAN is given an address it can actually reach. Or choose one fixed address.
Port8742 by default.
Open Port…Shown when pf or the Application Firewall is on and may block controllers. It opens the port after an administrator prompt.
SecurityThe media server answers only private, link-local and Tailscale addresses; any other client gets 403. Each image is published at an unguessable 128-bit token URL, and only while serving is on. An installer ISO is not usually secret, but a customised image can contain keys or answer files, so leave the timer on rather than choosing Until I stop it on a shared network.

8.23.12Server management controllers (Redfish)

Most rack servers carry a baseboard management controller that can present an image as a virtual CD. FrontierStack drives it through the standard DMTF Redfish API: Dell iDRAC 8 and 9, HPE iLO 4, 5 and 6, Lenovo XClarity Controller (XCC), Supermicro X12 and newer, and any other controller that implements standard Redfish virtual media.

  1. Add Controller and enter its address, port, username and password. The password is kept in the Keychain and sent only to the controller. Optionally link the controller to a fleet server so the two are shown together. Use an account with the Virtual Media and Control privileges.
  2. Read Controller discovers what it manages: each system with its model and power state, and each virtual CD slot with whatever is mounted in it now.
  3. Choose the System, the Virtual CD and the Image. Leave Boot from it once on to boot the CD a single time, after which the server returns to its normal boot order.
  4. Under Then, choose Don't restart, Graceful restart or Force restart, and press Mount (or Mount and Restart, which asks for confirmation first).
  5. When the install is done, Eject the virtual CD.
ControllerVirtual media notes
Dell iDRAC 8 / 9Needs the Enterprise or Datacenter licence.
HPE iLO 4 / 5 / 6Needs iLO Advanced.
Lenovo XClarity (XCC)Needs XCC Advanced or Enterprise.
Supermicro X12 and newerStandard Redfish virtual media. X10 and X11 boards offer virtual media only in their own console, so mount the image there using a copied URL.
Other Redfish controllersAnything that implements the standard VirtualMedia insert/eject actions.
WarningA restart into an installer stops everything running on the server, and the installer itself can erase its disks. Check which system you selected before confirming, and prefer Graceful restart so the running OS shuts down cleanly.

8.23.13IPMI controllers and network boot once

Older boards have a controller with no Redfish, or with Redfish but no virtual media: Supermicro X10/X11, ASRock Rack, Gigabyte, Intel and iDRAC 7. Set such a controller's Protocol to IPMI over LAN. FrontierStack then drives it with ipmitool (Install ipmitool installs it with Homebrew in the in-app console). The password stays in Keychain and is passed to ipmitool in its environment, never on the command line. Read Controller shows the power state. IPMI has no standard virtual media, so the way to install an OS through it is the network: Network Boot Once sets the next boot to PXE (chassis bootdev pxe, in UEFI mode unless you tick Legacy BIOS boot), then optionally sends a hard reset, or powers the server on if it is off. IPMI has no graceful restart.

Redfish controllers have Network Boot Once too: a one-time Pxe boot override followed by your choice of restart. Combined with the built-in PXE server below, this boots a remote server into this Mac's ISO menu with no virtual media at all.

8.23.14PiKVM virtual media

A PiKVM can emulate a USB drive for the machine it is plugged into. Boot Media uses PiKVM's documented /api/msd interface, with the same PiKVM API account as its ATX power control (see KVM-over-IP). First copy an image to the PiKVM's own storage: a local file is streamed up with a progress bar, or the PiKVM downloads a remote URL itself. Free space is checked before the copy starts. Then connect a stored image As CD-ROM (for an ISO) or As Flash (for a raw .img), pick it in the machine's boot menu or use Power Cycle… (a hard ATX cycle, with confirmation), and open the console to follow the install. Disconnect Drive and delete tidy up afterwards.

8.23.15Proxmox VE virtual machines

For a virtual machine on Proxmox VE (connected as described in Proxmox VE below), choose the Node, the Virtual machine and the ISO storage, then the Source. Image from the library has Proxmox download the image into ISO storage itself (its download-url call), so a local image is fetched from this Mac's media server; ISO already on Proxmox uses one that is there. FrontierStack attaches the ISO to the VM's CD drive and can put the CD first in the boot order — the original order is remembered and restored when you eject. Finally choose to leave the VM as it is, start it, or reset it (a hard reset, which asks for confirmation).

The API token needs Datastore.AllocateTemplate and Sys.AccessNetwork for the download, and VM.Config.CDROM, VM.Config.Options and VM.PowerMgmt on the VM. The pane lists these beside the controls.

8.23.16Network boot (PXE / iPXE)

Machines with no controller and no KVM can still boot over the network. Turn on Serve an iPXE boot menu from this Mac and the media server also publishes an iPXE menu that SAN-boots any library ISO over HTTP, chains to netboot.xyz for its catalogue of installers, and offers an iPXE shell and boot from local disk. Download iPXE Boot Loaders fetches the official loaders from boot.ipxe.org (ipxe.efi, undionly.kpxe and the arm64 ipxe.efi) so UEFI HTTP Boot clients can load iPXE straight from this Mac.

What remains is telling your DHCP server where to send booting machines. Pick your DHCP server and press Copy Settings for a ready-made snippet:

DHCP serverUse it when
dnsmasqdnsmasq is your DHCP server; it also has a built-in TFTP server.
dnsmasq (proxy-DHCP)Your router keeps handing out addresses and dnsmasq answers only the PXE clients.
ISC dhcpd · KeaA Linux DHCP server you edit yourself.
OPNsense / pfSenseThe firewall is your DHCP server; the snippet names its network-boot fields.
UEFI HTTP Boot (no TFTP)The firmware downloads iPXE over HTTP from this Mac, with no TFTP at all.
NoteFrontierStack never changes your DHCP server — you paste the settings in yourself. SAN-booting works for Windows PE, many rescue and hypervisor ISOs and some Linux installers; for the rest, netboot.xyz boots the installer's kernel directly. Legacy BIOS PXE also needs a TFTP server for the first-stage loader: dnsmasq has one, and so does the built-in PXE server below.

8.23.17The built-in PXE server

With no dnsmasq on the network, and no change to its DHCP server, turn on Answer PXE clients from this Mac under the network-boot settings. The Mac then runs two small services while serving is on:

  • ProxyDHCP (UDP 67 and 4011) replies only to machines asking to boot from the network (PXE firmware, UEFI HTTP Boot, iPXE), and only with a boot file. It never hands out an address, so the router's DHCP keeps working exactly as before.
  • TFTP (UDP 69, read-only) serves the three iPXE loaders and nothing else. BIOS machines get undionly.kpxe, UEFI x64 machines get ipxe.efi, and ARM64 machines get the ARM64 ipxe.efi. UEFI HTTP Boot clients get the loader over HTTP instead. Once iPXE is running, it asks again and receives the menu.

Choose the Network it answers on (the services are bound to that one interface), and optionally list the MAC addresses of the only machines it should answer. Each request and transfer appears below the switch. The loaders are downloaded automatically the first time. If pf or the Application Firewall is on, the server section's firewall button now opens UDP 67, 69 and 4011 as well.

WarningAny machine on that network set to boot from the network will get this Mac's menu while the PXE server runs. The menu falls back to the local disk after 30 seconds, but on a shared network, list the MAC addresses of the machines you are installing. If the network's DHCP server already sends network-boot options, turn those off first, or the two will compete.

8.23.18Other KVM-over-IP units

JetKVM firmware. For a JetKVM, JetKVM Mini or Mini W, Remote KVM shows the installed firmware and whether an update is waiting. FrontierStack reads the version from the KVM's own web interface without a login, asks JetKVM's update server for the latest release, and re-checks every half hour. Firmware before 0.5.4 does not verify that a downloaded update really came from JetKVM (CVE-2026-32294) and is marked Update needed. If you turn on MQTT in the JetKVM and enter its base topic, FrontierStack reads the KVM's own update state instead, along with online status, CPU, temperature, memory and storage. A JetKVM normally installs updates by itself; one stays pending when automatic updates are off or someone is always connected to its console. Alert me on the KVM's row raises an alert when it stops answering, runs the vulnerable firmware, or has had an update waiting for more than a week.

KVM storage. Most compact KVMs run from an SD card or built-in eMMC, and a worn-out card is a common reason one stops booting. Each KVM's Storage section records what it runs from (microSD, SD, eMMC, USB or SSD), the capacity, the card's make and model, when it was fitted, and notes such as where the spare is kept. A removable card that has been in service for three years or more shows a wear warning. For a PiKVM, Read from PiKVM shows the free space on the card's image partition, using the same API account as ATX power; a JetKVM's storage figure appears once MQTT is on. FrontierStack never reads from or writes to the card itself.

JetKVM, GL.iNet Comet, NanoKVM, TinyPilot, Raritan, ATEN, Avocent, Lantronix and Adder units have no stable public API for virtual media, so FrontierStack does not pretend to drive it. Instead Copy URL starts serving and copies an image address the KVM can reach, and the pane shows where to paste it in that vendor's own console.

8.23.19Macs

A Mac cannot boot an installer ISO, and network boot is gone: Apple silicon has none, and Intel NetBoot lost its server in macOS Server 5.7 and is refused by T2 Macs at Full Security. So for Macs, Boot Media installs macOS the way Apple supports — by downloading Apple's full installer on the Mac itself over SSH and running it. Every remote Mac in the fleet gets a card (add Macs under Remote Servers first):

  • Refresh reads its macOS version, whether it is Apple silicon, Intel or Intel with T2, the model, free space, the installers already present, and whether Content Caching is on.
  • List asks Apple which full installers are available (softwareupdate --list-full-installers); Download on the Mac fetches one in the background (--fetch-full-installer) with progress.
  • Install… runs startosinstall in one of two modes: Upgrade / reinstall (keeps data) or Erase and install. On Apple silicon only a volume owner may start an install, so you enter an administrator user and their password; the password is passed to startosinstall on standard input and never stored.
  • Turn On Content Caching (on this Mac or any fleet Mac) keeps a copy of Apple's updates and installers on the LAN, so every other Mac downloads them from there rather than from Apple.
  • For an Intel Mac with a linked KVM, Internet Recovery… restarts it into Apple's own network recovery, after confirmation. Recovery has no Screen Sharing or SSH, which is why a KVM is required to drive it.
WarningErase and install wipes the Mac's startup disk and asks for a strong confirmation; there is no undo. Every install is also refused on an OpenCore Legacy Patcher Mac until the OpenCore Patcher pane says it is safe — the same gate scripts obey — and a Mac that has not been checked yet must be checked first.

8.23.20From the AI Administrator

The AI Administrator and MCP clients reach Boot Media through the existing kvm tool: media_list (read-only) reports the library, the media server's state, each controller's power and mounted image, and each PiKVM's drive; media_attach mounts an image on a target — a controller or PiKVM by name, or proxmox:<vmid> — and with boot=true also restarts into it; media_eject removes it. Attaching, ejecting and restarting need Allow changes and always ask you to confirm (Chapter 13).

8.23.21Serial-console installs

Appliances, small x86 boards such as the UP Squared, and servers wired only to a console port have no screen to install on, so the installer has to run on the serial line. Turn on Install over a serial console in Boot Media and choose the machine's port (ttyS0–ttyS7; a UP Squared's debug UART is ttyS4) and the speed — 9600, 19200, 38400, 57600 or 115200 baud, or 230400–921600 for UARTs and adapters that can take it. From then on the iPXE menu sets console=tty0 console=ttySn,baudn8 for every Linux installer it starts through netboot.xyz, and tells netboot.xyz not to send screen-clear codes.

An ISO's own boot menu can't be changed from outside, so the section shows the exact edit for each installer: the GRUB or ISOLINUX kernel line for Ubuntu, Debian (after the ---, so the setting carries into the installed system), Rocky/Alma/RHEL (with inst.text) and other Linux ISOs; Proxmox VE's Terminal UI, Serial Console entry (fixed at ttyS0, 115200 — edit it for another port or speed); pfSense's memstick and OPNsense's serial image, or the FreeBSD loader commands for any other speed; and, for Windows, which has no serial setup, the EMS commands for after installation. Copy GRUB Settings gives the /etc/default/grub lines that keep the installed system on the serial line. Open Console at n Baud opens a session on the USB adapter plugged into this Mac at the same speed, and saved consoles set to another speed can be switched in one click.

NoteThe boot menu itself reaches the serial line only when the firmware redirects its console there (BIOS/UEFI setup: Console Redirection). Speeds above 115200 suit Linux on UARTs built for them, but firmware, GRUB's COM-port driver and the FreeBSD loader stop at 115200 — install at 115200. A UP board's debug UART is memory-mapped, not a COM port: GRUB reaches it through the firmware's serial console, and the FreeBSD loader can't use it.

8.16Proxmox VE: live cluster status and guest power

A Proxmox VE host is a server full of servers, and SSH to the node alone does not tell you much about its guests. The Proxmox VE service page (Containers category; see Chapter 6) therefore talks to Proxmox's own API. Add Connection and enter a cluster or single node's address with an API token — the token ID in user@realm!name form and its secret, which is kept in the Keychain and sent only in the Authorization header. Proxmox's self-signed certificate is accepted only on a private address. A token with the PVEAuditor role is enough for status; power control and boot media need the extra permissions listed above.

Once connected, the page shows the cluster name, Proxmox version and quorum; for each node its CPU, memory, root disk and uptime; every VM and container with its state; and a usage bar for each storage. Each guest can be started, shut down or rebooted, and — after confirmation — hard-stopped or reset. Show in Server Activity and Boot an ISO… jump to the other two places Proxmox appears.

In the Server Activity window (Chapter 11) every node is a tile in the All Servers, Cluster and Everything layouts, with CPU, memory, disk and uptime sparklines and a line such as “5/7 VMs · 2/3 containers running”. A node's detail shows its KPIs, a CPU and memory chart, the guest list with the same power controls, its storage and the cluster facts, plus Open Web UI, Refresh and Boot an ISO….

Alerts watches each connection in the background, refreshing about every five minutes: API reachability, each node's online state, cluster quorum, and any storage more than 90% full. The AI Administrator has the same view through the kvm tool's proxmox_status action (read-only) and can change a guest's power with proxmox_power, which always asks for confirmation.

TipCreate a dedicated API token for FrontierStack with Privilege Separation on, and grant it only the roles you need. If you only want to watch the cluster, PVEAuditor is enough; add the VM and datastore permissions later if you decide to boot installers from here.

8.17Garage: object-storage clusters at a glance

Garage is a lightweight S3-compatible object store that spreads its data over several small nodes, often in different places. The Garage service page (Object Storage category) watches any number of Garage clusters through Garage's admin API. Add Cluster, then enter the admin endpoint of one node — 10.0.0.5:3903 is enough on a LAN, since port 3903 and plain HTTP are assumed — and the admin token. One node reports the state of the whole cluster; add a second endpoint on another node so the cluster stays visible when the first one is down. The token is kept in the Keychain and sent only in the Authorization header, and plain HTTP is used only for a private, Tailscale or .local address; anything else must be https://. Both Garage 2.x (admin API v2) and 0.9/1.x (v1) are understood.

The section's first line counts every cluster as healthy, needing attention, or down. Each cluster then shows its health — healthy, degraded (some data has fewer copies than it should) or unavailable (some data can't be read or written) — with the nodes connected, storage nodes up, partitions with quorum and fully replicated, the layout version, zones and assigned capacity. Below that comes every node, with down nodes and the fullest disks first: zone, capacity, Garage version (a node on a different version from the rest is flagged), draining, and how full its data and metadata disks are. Turn on Also read /metrics to count blocks that failed to resync on the listed nodes — a number that should always be zero.

Alerts checks each cluster about every five minutes: admin API reachability, cluster health, each node in the layout, data and metadata disks at or above the cluster's threshold (90% unless you change it), and errored blocks. The AI Administrator reads the same view with get_server_health area object_storage. Nothing here changes the cluster.

TipRather than the master admin_token, create a token for FrontierStack with garage admin-token create and limit its scope to GetClusterHealth and GetClusterStatus (add Metrics if you read /metrics with it).

8.18Old Macs, Raspberry Pis & Windows hosts

Part of the point of a fleet is keeping older or odd hardware useful. A vintage Xserve or Mac mini still running macOS Server links like any other host; the Remote Apache discovery understands Server.app's own Apache tree and its internal ports, so its websites show up and can be edited, and the legacy Intel builds of the monitor run as far back as OS X 10.11 El Capitan. A shelf of Raspberry Pis links as ordinary Linux boxes — the monitor's arm build covers every Pi including the Zero — so you watch their CPU, disk and services right alongside everything else.

Pop!_OS and other Ubuntu-based systems are recognised by their distribution rather than by the word “Linux” in the OS name. Pop!_OS reports itself as “Pop!_OS 24.04 LTS”, which earlier releases didn't treat as Linux, so the monitor's self-update refused it (as it did some Ubuntu hosts). On apt systems, Check for Updates in the server's package tools (Manage in Server Activity…) also reports what apt alone doesn't: a newer kernel that's installed but not yet running, even where /var/run/reboot-required is never created, as on Pop!_OS and some Debian installs; the free space on the EFI system partition — Pop!_OS boots with systemd-boot and kernelstub copies every kernel and initrd there, so a nearly full partition is the usual reason a kernel update fails half-way; and how many Flatpak apps have updates.

Windows hosts join over Microsoft's OpenSSH server: link them like a Linux box for SSH diagnostics, and install the monitor as a native Windows Service (because Windows services don't reliably inherit machine environment, its config is read from a file beside the executable). Windows monitor installs are done manually with the supplied PowerShell installer from the Host Monitor pane, rather than auto-pushed.

For interactive control beyond diagnostics, the catalog also carries the remote-access tools — RustDesk, MeshCentral, Apache Guacamole, Windows Remote Desktop and WinRM — but those are services you run, not the SSH fleet itself. The fleet's strength is uniform, scriptable, low-overhead management of everything from one window — and, with Chapter 13's run_script targeting any node by name, an AI that can diagnose and fix a remote server two steps at a time: a read-only test, then a minimal fix, re-run to confirm.

UP Squared and other UP boards. AAEON's UP boards — UP Squared, UP Squared Pro, V2, 6000 and Pro 7000, UP 7000, UP Xtreme — are small x86 machines that often run headless as a firewall, a Proxmox node or a Linux box. They link like any Linux host, and the status check reads the board's firmware identity (DMI; serial numbers are never read), so the server's page names the model and shows where its 3.3 V debug UART is and which ttyS Linux gives it (ttyS4 on a UP Squared, ttyS5 on the first UP Xtreme), with the firmware keys (F7 boot menu, Del or Esc setup) and the BIOS path that turns on PXE. Console Connections has a matching UP Squared / UP board preset, Device Discovery recognises AAEON's MAC prefix, and Boot Media's serial-console install takes it from there. The same check names other hardware too — Dell, HPE or Supermicro servers, and Raspberry Pis by their device-tree model.

8.19Group Policy & domain trusts

For Windows domains, the Group Policy & Trusts pane (under Identity & Accounts, Full Fleet) reads a linked domain controller over SSH. A Windows Server DC needs the Group Policy Management feature and the AD PowerShell module (both are there on a normal DC); a Samba AD DC is read with samba-tool, and with the server's sudo password saved, ldbsearch adds where each GPO is linked. The pane has three tabs.

TabWhat it shows
OverviewDomain, forest, NetBIOS name, functional level, PDC emulator, the domain controllers, how SYSVOL replicates (DFSR or the retired FRS), and every finding.
Group PolicyEvery GPO with its links (a lock for enforced, struck through when the link is disabled), whether user or computer settings are switched off, its version numbers and WMI filter.
TrustsEvery trust: kind (forest, external, parent–child, realm), direction, transitivity, the secure-channel test result and the security settings.

What it flags. For Group Policy: GPOs whose Active Directory and SYSVOL versions disagree (replication is broken if it lasts), SYSVOL still on FRS or half-way through migration to DFSR, a default policy that is missing or unlinked, and, as information, GPOs that are unlinked, empty or fully disabled. For trusts: a trust whose secure channel fails (nltest /sc_query on Windows, samba-tool domain trust validate on Samba), SID filtering turned off on an external trust, SID history allowed across a forest trust, TGT delegation across a trust, RC4-only trusts, down-level (NTLM) trusts, and two-way trusts that use forest-wide rather than selective authentication. Inbound-only trusts can only be tested from the other domain.

Actions (Windows DCs only): Report opens a GPO's full settings report (Get-GPOReport) in your browser; Back Up All GPOs… runs Backup-GPO into a new dated folder under ProgramData\FrontierStack\GPOBackups on the DC; Force Refresh on a Computer… runs Invoke-GPUpdate on one domain computer. FrontierStack never creates, edits, links or deletes a GPO or a trust.

Tick Watch in Alerts and the DC is checked every 30 minutes; a failing trust or a DC that stops answering raises an alert under Directory Services. The AI Administrator reads the same state with get_server_health and area=domain.

SecurityThe trust findings are the settings attackers look for when they move between domains. Treat SID filtering off and TGT delegation across a trust as things to fix, not just to note.

8.20OpenCore Legacy Patcher Macs: is it safe to update?

Some of those older Intel Macs will be running a macOS newer than Apple ever shipped for them, courtesy of OpenCore Legacy Patcher (OCLP). That changes what a reboot means. An ordinary server Mac boots power → macOS → FrontierStack agent; an OCLP Mac boots power → firmware → EFI/OpenCore → macOS → OCLP root patches → FrontierStack. Every extra link is a place where an unattended boot can stop: a macOS update replaces the sealed system volume and takes the root patches with it (Wi-Fi, graphics acceleration and Bluetooth vanish until they are re-applied), a major upgrade needs a matching OCLP release first, and if the firmware's startup entry ever stops pointing at OpenCore the machine sits at a boot picker until someone holds Option and chooses “EFI Boot” — considerably more troublesome when that Mac is in another building.

The OpenCore Patcher pane (Fleet & Remote) exists so you know this before you press Update. Pick This Mac or a linked Mac and it runs a read-only probe — the OCLP app version, OpenCore's NVRAM stamp (only present when the Mac actually booted through OpenCore), the root-patch receipt, bless --getBoot, SIP, Software Update settings, the real model behind OpenCore's spoofed one — and turns it into a Remote boot safety list: firmware boot entry → OpenCore, default boot volume set, FileVault's effect on unattended reboot, root patches present and current, OCLP release supports the installed macOS (checked against the newest GitHub release), pending macOS update, automatic macOS installs off, and an EFI/OpenCore backup. Above it sits one verdict: Safe to update macOS, Update with caution, or Not safe, with the reasons.

[[FIG id="oclp-pane" caption="The OpenCore Patcher pane: the verdict, the Remote boot safety checklist and the three admin actions." capture="OpenCore Patcher pane against an OCLP MacBook Pro with a pending update and root patches present."]]

The pane deliberately does not administer OCLP — building OpenCore and applying root patches stay in OCLP's own app. It offers three fixed, reversible admin actions: turn off automatic macOS installs (so System Settings never updates an OCLP Mac unattended), back up EFI (an archive of the EFI/OC folder kept on that Mac), and re-bless OpenCore (the same bless --setBoot OCLP's “Install to disk” runs, refused unless OpenCore.efi is really there). The fleet status probe also notices OCLP on every pinned Mac: the host row and the Server Activity window show it, and Alerts raises a Security item when root patches are missing or the boot entry bypasses OpenCore.

TipThe AI Administrator sees the same facts. Its fleet context marks OCLP hosts, diagnose ["oclp"] returns the full report, and its scripts refuse to install a macOS update — or reboot a Mac whose boot entry bypasses OpenCore — until the pane's verdict is safe. So when you ask “why did Wi-Fi disappear after I updated this Mac?”, it reasons from OCLP = true, the real model, a recent update and root patches = missing, rather than from the diagnosis it would give an officially supported Mac.

8.21A Build Mac: Xcode builds on a server

Xcode’s Build button always builds on the Mac in front of you. To build somewhere else — a Mac mini in the rack with more cores, a stable signing setup and nobody’s editor open on it — give a linked Mac the Build Mac role, a Full Fleet feature. Use the toggle in its server pane or in the server editor, and the pane gains a Build Mac section.

The section shows what the Mac can build with. It is checked over SSH every 30 minutes, read-only: the installed Xcodes and the selected one, whether the licence is accepted and the first-launch components are installed, free disk, how much DerivedData, archives and simulators take, the simulator runtimes, and every code-signing certificate with its expiry date. Problems go to Alerts under Build Macs: no Xcode, licence not accepted, under 30 GB free (you can change the limit), or a certificate expiring within 14 days.

Projects are saved on the server: a git URL, branch, optional project or workspace, scheme and destination. Build, Test and Archive clone or update the repository into ~/fs-builds on the build Mac and run xcodebuild there in the console, so the whole log is in front of you and you can cancel it. The build Mac needs its own access to the repository. Archive unlocks the login keychain first, because signing over SSH can’t reach a locked keychain.

Two set-up steps make it a real build server. Set Up Gitea Runner installs act_runner, registers it with your Gitea and keeps it running with the label macos-xcode. You paste the registration token in the console, and FrontierStack never stores it. Then a workflow with runs-on: macos-xcode builds and tests on every push, the job Xcode Server used to do. Turn On Headless Xcode MCP enables Xcode 27’s xcrun mcp-server for the build folder, so coding agents can use Xcode’s tools on that Mac without an Xcode window.

TipThe AI Administrator’s xcode tool lists Build Macs and their health (action=build_macs). With Allow changes, it can build, test or archive a saved project on one by name.

8.22Migration wizards: moving a stack onto a new device

Retiring an old server rarely means "reinstall everything by hand." FrontierStack ships guided migration wizards that lift a stack off a legacy machine and stand it up on a destination you choose — this Mac, another Mac, or a Linux box. The source is only ever read; everything is written to the target.

Migrate Setups starts with Migrate from: a stack found on this Mac (MAMP, XAMPP, Pancake Stack), Apple Server (a whole Server.app machine, below), Windows, Web Servers (other web servers, dev tools and dev servers) or Other Tools (what isn't a website: databases in other apps, Git servers, hosts files and repos). Each runs in the order the work happens — what moves, where it goes, move it — and ends with Check everything, then retire. As with Retire Apple's PHP in Modernize Old Mac Server, nothing is ready to retire until it has been named and checked: every imported site's pages and files are fetched through the new Apache (pages by status and PHP source, plain files byte for byte against the source's copy) and every database table's row count is compared with the source. Scripts other than a folder's index page are never opened, because opening one can run it. Whatever differs or couldn't be checked is listed by name, and the pane tells you to keep the old setup until the check passes. A move to another device runs the same comparison for files (rsync checksums) and tables in the console, and copies made from other database apps are checked table by table too.

The Migrate Setups pane handles a MAMP, XAMPP or Apple Server.app web stack. It auto-detects the source, then lets you tick exactly what to carry: the Homebrew tools, web files, MySQL databases, the sites (vhosts), MIME overrides, Apache modules, PHP settings, WordPress wp-config.php fix-ups and Git repositories. A Set up on picker chooses the destination: leave it on This Mac for the full in-app migration, or pick a linked host to install the stack on that new device over SSH, copying the web files (rsync) and databases (dump over SSH) across — with a Linux toggle to use apt/dnf instead of Homebrew.

Other Tools ▸ Servers and settings also has Import from a Repo…: point it at a folder or git repo that holds an SSH config, an Ansible inventory or .env files, and it adds the servers to your fleet and the credentials to Script Secrets or the matching service, after you review them. FrontierStack AI can read other layouts without ever seeing a value (Ch 13).

Coming from another tool? Import from a Web Server or Dev Tool… (Migrate Setups ▸ Web Servers, and beside Import Sites… in the Apache pane) reads sites, settings and databases from Laravel Herd, Laravel Valet, ServBay, AMPPS, DesktopServer, Devilbox, DDEV, Docksal, Lando, Local and DevKinsta; from web servers' own config files — Caddy, nginx, Lighttpd, OpenLiteSpeed, H2O, Cherokee, Abyss, Tomcat, Jetty, WildFly/Undertow, CivetWeb and Mongoose; and from dev servers that are running right now (Python http.server, Uvicorn, Gunicorn, Waitress, Vite, webpack-dev-server, BrowserSync, http-server, live-server, miniserve, Node.js, Bun and Deno). Each site becomes an Apache site on ports 80/443 — serving its files, or forwarding to an app server that keeps running — or a Localhost project. Domains, aliases, HTTPS certificates, redirects and proxied paths carry over, and you can rename any domain before importing. The Databases tab finds every MySQL, MariaDB and PostgreSQL server running on this Mac — DBngin, Herd, ServBay, MAMP, Local and others — dumps the databases you tick with that server's own tools and loads them into FrontierStack's Homebrew MySQL or PostgreSQL, then compares every table's row count with the source (it's also on its own as Other Tools ▸ Copy Databases…). Docker-based projects (DDEV, Lando, Docksal, Devilbox, DevKinsta) are exported with their own command. An opt-in switch also points each copied site's wp-config.php or .env at FrontierStack's MySQL, keeping a .pre-migrate.bak copy.

Coming from Windows? Copy the whole C:\laragon folder to the Mac (USB drive, shared folder, a Parallels/VMware Windows disk or a ZIP) and use Migrate Setups ▸ Windows ▸ Import from a Windows Stack…. The same importer reads XAMPP for Windows, WampServer, AMPPS, Uniform Server and IIS from a copy of their folder (for IIS, also copy applicationHost.config and the site folders); folders without a vhost become <folder>.test, and ASP.NET sites come over for reference only. Every project in www and every vhost in etc/apache2/sites-enabled becomes an Apache site under Laragon's host name ({name}.test or your own template); Windows paths are mapped onto the copy. Laragon's data folder can't be reused on a Mac, so export each database on the PC first (HeidiSQL ▸ Export database as SQL) and save it in the Laragon folder or the site's folder — it is matched to its site and loaded on the Databases tab.

Migrate Setups ▸ Apple Server (formerly the Apple Server Migration pane) handles a whole Server.app machine. Point it at the source (this Mac or a remote one) and it inventories every service with serveradmin — Websites, Mail, Calendar and Contacts, Messages (XMPP), VPN, DNS, DHCP, NetInstall, Open Directory, File Sharing, Time Machine, Profile Manager and more — and anything else it finds running, such as a git server, databases, Docker or a standalone Nginx. Each service shows a status badge and a modern equivalent; where there's more than one sensible replacement (Calendar → Radicale / SOGo / Baïkal, VPN → WireGuard / strongSwan, DHCP → dnsmasq / Kea) you choose which one. Pick a target machine and OS, and the wizard installs the equivalents and prints a precise carry-over checklist. This Mac's own websites move in the same place (full vhost + file copy) and get the same check before anything is retired, and the DNS zone files the services' run copies are named and checked against the source. Open Directory (users and groups) hands off to the Accounts pane, and a detected git server to the Git Server migration. To keep the Mac rather than leave it, use Modernize Old Mac Server (Chapter 4).

NoteBefore you migrate, watch the old box. The Server.app web stack fronts ports 80/443 with Apple’s serviceproxy, and on older releases — High Sierra especially — that process wedges: it carries on accepting connections but stops answering them. Ping succeeds, the port scans as open and SSH still works, so the sites look reachable while every one of them hangs. It is routinely misdiagnosed as a DNS or network fault for exactly that reason, and a plain “is the service running?” check will not catch it either, because the process never dies. Give the source machine a Service Guardian watch on http://127.0.0.1/ with service serviceproxy (use server-httpd to watch the backend behind it) so a wedge is spotted and healed with launchctl kickstart while you plan the move. Migrating the sites to a plain Apache removes the wedge-prone proxy from the serving path for good.
NoteDiscovery on a remote Mac runs serveradmin as root, so save that host's sudo password in its settings first (Chapter 8, "The managed key and the saved sudo password"). Some Apple services carry their config automatically (DNS zones, Apache vhosts, Postfix main.cf); others install the replacement and hand you the steps — the wizard labels each one Automatic, Assisted or Manual so there are no surprises.
Migrate Setups ▸ Apple Server: point it at a Server.app machine &mdash; this Mac or a remote one &mdash; discover its configured services read-only, then choose where the modern equivalents go.
Figure 8.8. Migrate Setups ▸ Apple Server: point it at a Server.app machine — this Mac or a remote one — discover its configured services read-only, then choose where the modern equivalents go.

Leaving a site builder? Migrate Setups ▸ Site Builders ▸ Import from STUDIO… moves a site off STUDIO (studio.design), which has no export of its own. Type the site's address and FrontierStack reads what the site shows every visitor — no STUDIO sign-in — then adds its pages, its CMS items (as posts, with dates, cover images, categories and tags) and its images to a new WordPress site on this Mac — FrontierStack downloads WordPress, creates the site's own database and MySQL user, adds an Apache site for its name and installs it — or to a site the WordPress pane already lists, with redirects from the old addresses. Newer STUDIO sites are read from their finished pages; older ones, which arrive as an empty page, are read from STUDIO's publish storage and CMS service, the same requests a visitor's browser makes. The design, animations, shared headers and footers, forms and fonts don't come over, and the import ends with a checklist of them. When the new site is ready, Publish to a Host… opens Site Clone set up to copy it and its database to a server or a hosting account under the STUDIO site's own address; a WordPress copy gets a wp-config.php for the new place, with its own database login there. Running the import needs a licence; looking at the site doesn't.

8.23The Git Server: Gitea & repository migration

The Git Server pane stands up a self-hosted Gitea (behind Caddy for automatic HTTPS) on any target — this Mac, a linked server, a NAS, a Docker host or a Linux box — detecting the platform and installing the right way. Once it's running, connect with an access token for a live monitor: version, repository count and backup-staleness alerting when a mirror falls behind its source.

The same pane migrates or mirrors another Git server into Gitea. Point it at on-disk bare repos — the legacy macOS app Simple Git Server, Xcode Server, Gitolite, a plain git-daemon, or any folder — or at a running remote server via any git://, https:// or ssh:// clone base (enumerate the repo names over SSH, or paste them). Scan lists the repositories; Migrate mirror-clones each one with full history, every branch and tag, and pushes it into Gitea, creating the destination repo through the API. The copy runs on this Mac.

The Git Server pane: stand up Gitea behind Caddy on the target you pick, with the install method chosen per platform and HTTPS handled automatically once a domain is set.
Figure 8.9. The Git Server pane: stand up Gitea behind Caddy on the target you pick, with the install method chosen per platform and HTTPS handled automatically once a domain is set.
9

Chapter 9

Networking & the Perimeter

See every device on your LAN, read your router's live state, and reach a service from the outside world — with or without opening a single port.

A Mac that runs services lives inside a network, and that network is where most real-world trouble starts: a router whose WAN link flapped, a forgotten device on the wrong subnet, a port you opened months ago and never closed. FrontierStack treats the network and its perimeter — the boundary between your LAN and the internet — as first-class objects. It reads your router directly, scans the LAN to build an inventory, draws a data-flow map, and gives you several disciplined ways to expose a service to the outside.

This chapter covers the network around your servers. For linking the servers themselves over SSH see Chapter 8; for the host firewall, fail2ban and the security audit see Chapter 10; and for Cloudflare DNS and TLS see Chapter 7.

9.1Routers & firewalls you can read and drive

FrontierStack talks to network gear through its own management API where one exists, and over SSH where it does not. The two tightest integrations are OPNsense (its full REST API) and Cloudflare (covered in Chapter 7); a wider set of routers and firewalls report live status. Add a device in the Router & Network pane with its address, vendor and API key, and the AI Administrator's router_info tool can then read its version and model, uptime, CPU and memory, WAN links and gateways (up or down), interfaces and client count — plus the raw API JSON for any field FrontierStack does not map. It is read-only: it queries the device's own API, never SSH.

DeviceHow FrontierStack reaches it
OPNsenseFull REST API — live status, firewall rules, port-forward (rdr) for the perimeter
pfSenseREST via the API package
MikroTik RouterOSREST API (RouterOS v7+)
Ubiquiti UniFi / EdgeOSController / gateway API key
OpenWrtLuCI / ubus API
DD-WRTWeb admin / SSH
ASUSWRTRouter web API / SSH
FRITZ!BoxTR-064 / web admin
TP-Link OmadaController API
Huawei LTE/5G (HiLink)Router web API — connection, 4G/5G network, operator, signal; drop alerts
Huawei Wi-Fi AX/BE, EchoLife/OptiXstar ONTWeb admin (no open local API)
Huawei VRP (AR, NetEngine, USG, S, CloudEngine) / AirEngineWeb admin (HTTPS) / SSH / SNMP; AirEngine APs via their controller
screenshot to be added
Figure 9.1. The Router & Network pane showing a configured OPNsense gateway with its WAN links and interface list.Capture: capture: open Router & Network with one OPNsense device added, expanded to show WAN/gateway status
NoteA router does not need API credentials to be seen. If you pinned it through Device Discovery (below) but never added a key, router_info still reports that it is pinned, where, and whether it is reachable — and tells you to add its API key in Router & Network to read version, gateways, WAN and interfaces live.

Huawei LTE/5G routers. Pin a Huawei B-series, E5186/E5785 or 5G CPE (H112/H122/H138) with the Huawei LTE/5G Router (HiLink) platform (default address http://192.168.8.1). Check Status reads the router's own web API: the connection, 4G or 5G network, operator, signal (RSRP, RSRQ and SINR, with a plain rating) and Wi-Fi clients without a password; model, firmware and full signal detail once its web password is in Access. Monitor the mobile connection raises an alert when mobile data drops — useful when the router is a backup WAN that nobody looks at until the fibre fails. These routers allow only one or two web sessions and lock their page after repeated failed logins, so FrontierStack signs in at most every 10 minutes (every sweep on a model that hides even its status page), always signs out, and stops retrying a refused password for 30 minutes. Huawei Wi-Fi routers, fibre ONTs, VRP gear and AirEngine access points have their own platforms, which set the right web UI, SSH user and notes. Discovery recognises Huawei product names and suggests the platform.

For OPNsense and pfSense, an API key unlocks a continuous firewall monitor (the toggle in the pinned device's pane): every Alerts sweep polls the firewall itself for gateway state, interface carrier and service liveness — so a WAN line that dies while a multi-WAN router silently fails over (servers browse fine, inbound to your sites is dead) raises an alert naming the gateway and the port that lost carrier, instead of an unexplained sea of red site dots. Nothing is installed on the router: OPNsense's REST API is built in, and pfSense needs only its REST API v2 package. The same pane can also join an OPNsense router to your tailnet: sign in to Tailscale on your Mac (Google accounts work), mint a pre-auth key, paste it in the device pane's Tailscale section — FrontierStack installs the os-tailscale plugin if needed, saves the key and login server (Headscale too), and restarts the service over the API, no browser login on the router required. The tailnet address is then remembered as a fallback: when the LAN address stops answering (off-site, VPN route down, LAN leg dead), Check Status, the monitor and certificate renewal retry over Tailscale automatically and say so, and the monitor raises a separate "LAN address" alert so a routing fault is not mistaken for a dead router.

Attack and failure signals. The same sweep that watches gateways also watches for trouble on the router itself, and a router in distress turns orange with a warning triangle in the sidebar — hover for the reason. On OPNsense with the Intrusion Detection plugin enabled, FrontierStack reads its recent Suricata alerts over the same API and shows the count and top signature (an attempted attack surfaced without opening the firewall UI; pfSense's REST API does not expose IDS uniformly, so this is OPNsense-only for now). Across every monitored router — OPNsense, pfSense, OpenWrt and the rest — each sweep also flags an unexpected reboot (uptime dropped sharply: a crash, a power event, or an attack), a brute-force spike on the router's admin/SSH (repeated failed logins, with the busiest source IP named from the router's own log), resource stress (memory or load dangerously high — a DoS, a runaway or compromised process), and an available firmware update (outdated firmware means known holes). Each raises an alert; signals a given platform cannot report are simply skipped, never a false all-clear. OPNsense and OpenWrt report the most; pfSense's API is more limited.

Certificate expiry. The same sweep reads the firewall's trust store — every CA and certificate a service uses — and raises an alert a month before one expires, and again once it has. This is the failure nobody plans for: an OpenVPN server certificate issued on OPNsense's 397-day default quietly locks every remote user out a year later, and the Web GUI's own HTTPS certificate lapsing turns the admin page into a browser warning. The device pane lists them soonest-first with a coloured dot, and a Renew… button reissues a certificate in place through the router's API: same private key, subject and CA, a lifetime you choose (up to ten years), and optional restarts of the OpenVPN servers and the Web GUI so they load it. Because the key and subject are unchanged, existing VPN client profiles keep working — nothing to re-export. On pfSense the REST API's renew action does the equivalent and restarts dependent services itself, and because its API reports no expiry for certificate authorities FrontierStack reads that date out of the CA certificate itself, so a pfSense CA warns like any other. CAs cannot be renewed through either API; an expiring CA is announced early precisely because replacing it means re-signing certificates and redistributing client profiles. The OpenVPN service pane shows the same router certificates next to the CA and client certificate embedded in every .ovpn profile on the Mac (OpenVPN Connect, Tunnelblick, the last file used), so client and server expiry sit side by side; its Plan & Cost card also notes that OpenVPN itself is free and what Access Server and CloudConnexa charge.

Driving and diagnosing a router. The AI Administrator can now do more than read: reboot_router restarts an appliance the same way it reboots a server (OPNsense/pfSense via API, OpenWrt over SSH), gated behind "Allow changes"; and when a task is genuinely better done in the router's own console, the assistant offers to open its Web UI with open_web_ui, resolving the address from the device pane rather than guessing. FrontierStack itself deliberately does not edit these appliances' firewall rules — OPNsense/pfSense/OpenWrt manage rules through their own config system, so the pane and the assistant point you at the native firewall page instead (right-click a router ▸ Open firewall rules… deep-links it). Two pane conveniences round this out: a Diagnostics button runs an API-free reachability check (ping, the common admin ports 80/443/8443/53, reverse DNS, gateway) so you can triage a router even without an API key; and for a router or firewall, Discover Services offers to open the Web UI rather than port-scanning it (a scan of your own perimeter device is rarely what you want). If SSH to an OPNsense or pfSense box is refused, SSH is either disabled or — more often — only allowed on certain interfaces (commonly the LAN, not the WAN): reaching it over the LAN, e.g. through a VPN, usually works, while from outside it is typically blocked. Enable SSH and its listening interfaces in the web UI (System ▸ Settings ▸ Administration ▸ Secure Shell on OPNsense). The SSH button itself is only hidden for consumer gateways that have no admin shell at all (NTT, some TP-Link/FRITZ!Box), where the Web UI is the only way in.

SecurityThe router security signals are read-only monitoring, not a substitute for the appliance's own logging — but an orange dot the moment Suricata fires, someone brute-forces the admin, or the box reboots unexpectedly is often the earliest warning you will get that something is wrong at the perimeter. Wire these to an alert channel (Chapter 11) and treat an unexpected router reboot or a failed-login spike as an incident until proven otherwise.

9.2Firewall vitals, graphs and power

A pinned OPNsense, pfSense or OpenWrt firewall with monitoring switched on reports its own vitals through its API, and its pane now graphs them: CPU and memory on one 0–100 chart, load average, and temperature. The samples come from the monitoring poll that was already running, so the graphs cost no extra API calls and fill in as the Alerts sweep proceeds, covering roughly the last six hours of the session.

What each platform gives differs, and the pane shows only what is real: pfSense reports an instantaneous CPU percentage, while OPNsense reports load average instead. Temperature depends on the hardware exposing a sensor FreeBSD can read — many virtualised and ARM installs have none, so a missing figure means "no sensor", not a fault.

Any pinned device can also have a smart plug linked to it, exactly as servers do: On, Off, Power-cycle, and a live wattage reading where the plug meters it. This matters most for a firewall, because it is the one box you can never reach over SSH when it wedges — the network you would reach it over is the one it serves. Neither OPNsense nor pfSense reports its own power draw (FreeBSD exposes thermal sensors, not watts), so a metered plug is the only real power figure available for one. Power-cycling asks for confirmation and warns that every connection through the firewall drops; try the API reboot first.

An OPNsense firewall linked through its API also reports the PHP its firmware installed. OPNsense’s web GUI runs PHP as root and its captive portal serves PHP pages to guest devices, so this is PHP on your perimeter. FrontierStack reads the version from the firmware package list with the daily firmware check and compares it with php.net’s latest release of that branch. The firewall’s security rows warn when it is behind a security release or on a branch that no longer gets fixes, and say what to do: update through System ▸ Firmware ▸ Updates once OPNsense ships a release with the fix, and until then keep the GUI reachable from trusted networks only. Never install PHP packages on the firewall by hand.

9.3Traffic, usage spikes and possible unauthorised use

A monitored router also reports its WAN traffic. On every Alerts sweep FrontierStack reads the cumulative byte counters it already exposes — OPNsense interface statistics, pfSense interface rows, OpenWrt device statistics, MikroTik RouterOS interfaces, a Huawei HiLink router's mobile-data totals — and turns the difference between two readings into a rate. The WAN interfaces are summed (every internet byte crosses one of them exactly once); where no WAN can be identified the busiest interface stands in, and the pane's Measured on line says which was used. A UniFi console reports its gateway's current uplink rate instead of counters, so its daily volumes are estimates. Hourly volumes are kept for about 60 days on this Mac.

The router's pane shows the rate now against the usual rate for this hour, today's volume against the usual day, the number of connected devices where the router reports it, a six-hour rate chart and a two-month bar chart of daily usage. Two alerts are built on it, both on by default with conservative thresholds; each has its own switch and a Conservative / Balanced / Most sensitive menu.

AlertFires when (conservative default)
Usage spikeTraffic stays above 8× the usual rate for that hour and weekday, and above 25 Mbps, for 20 minutes. The floor keeps a quiet line from alerting on a phone's backup.
Long-term usageThree whole days in a row at twice the median of the previous 28 days, and at least 5 GB a day more. One big day (a game download, a cloud backup) never fires it.

The long-term alert is the one to take seriously. Someone quietly using your connection — a neighbour who learned the Wi-Fi password, a guest network left open — adds traffic every day without ever producing a spike, so the alert reads possible unauthorised use, compares connected devices with their usual number, and points you to the connected-devices list and to Change Wi-Fi Password… (see Changing a Wi-Fi password across many routers). If the new level is expected, Accept as New Normal restarts both baselines from the last few days; Use Full History undoes it.

NoteA reboot or a cleared counter is never counted as traffic: a counter that goes backwards simply starts a new reading, and a single odd reading can never raise a spike because the rule needs several in a row. While the history is short the rows read learning — spikes after about two days, long-term usage after a week.

9.4Device Discovery: an inventory of your LAN

Open Device Discovery and press Find Monitors (or pick a subnet first). FrontierStack sweeps the chosen /24 using every method available at once, so routers, access points, switches, NAS boxes (Synology, QNAP, ZimaCube/ZimaOS…), printers, cameras and other servers all surface:

  • Ping / ARP — an ICMP sweep, with ARP/MAC giving each host's vendor; turn on TCP Probe to find hosts that filter ICMP.
  • Bonjour (mDNS) and SSDP / UPnP — advertised services and their friendly names.
  • SNMP and LLDP / CDP — add model, port and neighbour details when net-snmp and lldpd are installed (buttons in the pane install them).
  • Windows service ports — a machine that filters ICMP is still found by probing its distinctive ports (RDP, WinRM, SMB and friends), so Windows PCs no longer hide from the sweep.

The scan also notes how each host can be reached. An AnyDesk badge appears when AnyDesk is running locally or answering on its default port 7070, and a Tailscale badge — green when the peer is online — is built from this Mac's own tailscale status, matching mesh peers to discovered devices (only endpoints, hostnames and OS are kept; login names are never retained). On a directly-connected LAN, the Macs and devices macOS already knows through Bonjour appear before the slower IP sweep, so the list fills in quickly. A device's detail view carries matching AnyDesk and Tailscale rows with an Open app shortcut.

Devices from earlier scans. A scan starts with the devices it remembers from the last 90 days on this network and marks any that don't answer as Expected · not yet seen. To drop one that has gone for good, choose Forget This Device from its ⋯ menu once the scan has finished. It leaves the list and the scan history, though a device that answers a later scan is found again.

A router pinned by another address. A firewall has a different address and hardware address on each network, so the gateway a scan finds may not look like the OPNsense you pinned on another interface. Once its API key is set, FrontierStack saves the interface list OPNsense reports, and a scan row with one of those hardware addresses shows as Pinned as that router. Other router brands aren't matched this way yet.

The Wi-Fi unit you're connected through. The device this Mac's Wi-Fi is associated with is marked as an Access Point with a This Mac's Wi-Fi badge, using the radio address (BSSID) macOS reports, which needs Location access. A wireless bridge often has no address on the subnet it carries; its row then says No address on this subnet and can't be pinned or monitored until you add its management address by IP.

To pin tailnet devices without scanning for them, open the Tailscale service pane: Tailnet Devices lists every device on your tailnet as this Mac's Tailscale sees it (no API token needed; it falls back to the Tailnet pane's API list when Tailscale isn't connected here). It also finds each device's LAN (Wi-Fi/Ethernet) address — from a direct Tailscale connection, tailscale ping, the Tailscale API or Bonjour. Devices you've already pinned, or that are already in your servers, are marked and open with a click. Macs and servers get Add to Servers (the same place Device Discovery files them); everything else gets Pin. A device on this Mac's network is added at its LAN address and is still watched over its tailnet address when you're away; one elsewhere is added at its tailnet address. A Mac, Windows PC, server or NAS also joins Servers on its own when you pin it or change its type to one of those, carrying over its MAC address, vendor, icon, colour, power and UPS links, saved password, location and sidebar group; Open in Servers in its Identity section jumps to that entry.

A router on a LAN you reach through another tailnet device's subnet route answers pings, but over the tunnel there's no hardware address to prove which router answered — two sites can both have a 192.168.1.1 — so it stays offline until you vouch for it. The router's pane shows a Tailscale Subnet Route section naming the device that routes its subnet; click This router is on …'s network and from then on an answer through that route counts as online. Only one pinned router per address can hold a given route.

The AI Administrator's discover_devices tool runs the same scan and auto-pins the devices whose type it can identify confidently. Anything ambiguous is listed back rather than guessed at, so the assistant can ask you what it is and then pin it with pin_device. A pinned (monitored) device appears in its type's sidebar section; double-click it to open its pane, or use Open Web UI, Discover Services, Reclassify or Remove from its row. If you already know an address, the Add a device by IP field probes and pins it directly — no full scan needed.

Pin without waiting for the scan. A row that is already identified with high confidence shows Pin while the sweep is still running, and Review & Pin… lets you choose the type for one that isn't. A device pinned mid-scan stays pinned, and when the scan finishes (or you press Stop) its pinned record picks up whatever the rest of the scan learned. To look closer at one device instead, press Stop — the rows found so far stay — and choose Identify & Pin from its Review & Pin… or ⋯ menu: FrontierStack fingerprints just that address and pins it if the result is confident, or leaves it for you to review with the fingerprint result shown.

Point-of-sale hardware. A Square Terminal or Register opens no ports and doesn’t advertise on Bonjour, so it is recognised by Square’s own MAC address block and listed as Point of Sale. The Square pane’s Hardware section shows it next to the devices Square’s API reports (status, battery, Wi-Fi and IP). Square card Readers connect over Bluetooth and never appear on the network. Star Micronics and Epson TM receipt printers are identified by vendor and model name.

Android TV and Google TV boxes. An NVIDIA Shield, Chromecast with Google TV, Mi Box or onn box is recognised by the Android TV Remote service it advertises and pinned as Android TV / Google TV. With the Android TV / Google TV (adb) platform, Check Status reads its health over adb: model, Android version and how old its security patch is, uptime, storage, memory, whether the screen is on, temperature and the app in front, with warnings for a patch over a year old, storage over 90% full and thermal throttling. Install Google’s platform tools from the device pane, turn on Developer options ▸ USB debugging on the TV and accept the “Allow USB debugging?” prompt once. FrontierStack only reads; an offline alert keeps watch on boxes that drive signage or act as a subnet router.

Chromecast and Google Cast. A Chromecast, or a TV or speaker with Cast built in, is recognised by the Google Cast service it advertises. Its page reads the name, model, Cast firmware, network, uptime, what's casting, standby and volume, with no sign-in and nothing to turn on. Stop Casting… stops the current cast after you confirm. There's no Restart as there is on a Fire TV, because Google keeps that behind a Google account: restart it in the Google Home app, or link a smart plug and use its power-cycle. A Chromecast with Google TV is treated as an Android TV box instead.

Aqara, and Thread border routers. Aqara has no local API, so FrontierStack meets its hardware where it reports. Hubs (M1S, M2, M3, M100, M200) are pinned as smart hubs and show whether they advertise HomeKit, Matter and a Thread border router — turn on the offline alert, because a hub going down silences every Zigbee sensor behind it. Cameras and doorbells stream RTSP on port 8554 once RTSP is turned on in Aqara Home; add them in AV Feeds with the vendor Aqara. The FP-series presence radars (FP1, FP1E, FP2, FP300, FP400) report through Zigbee2MQTT, where they are named by product and show presence, light, temperature, humidity and a low-battery alert, or through Home Assistant, whose pane groups them into one row each. Any device advertising itself as a Thread border router gets a Thread badge with its network name, and an Apple TV’s pane says whether its model has a Thread radio at all.

Apple Home hubs. A HomePod or Apple TV that is a home hub gets a badge beside its name in Device Discovery: a green Home Hub on the hub running the home right now, Standby Hub on the others, and a plain Hub when this Mac's Home data doesn't record which one is active. Its device pane adds an Apple Home section with the same status, and the Apple Home pane lists every home's hubs. Apple Home picks the active hub itself and can move to another whenever a hub restarts, updates or loses its network; choose a preferred hub in the Home app under Home Settings ▸ Home Hubs & Bridges. FrontierStack reads this from the Mac's own Home data, read-only, and matches hubs to devices by name; if macOS blocks access, grant Full Disk Access in System Settings ▸ Privacy & Security.

TipFound only this Mac and the gateway? That is almost always client isolation (common on guest Wi-Fi) or VLAN separation — the AP or switch is blocking device-to-device traffic. Many smart-home gadgets are 2.4 GHz-only too; if your bands are separate networks, scan that subnet explicitly with the field in the pane.

9.5Cameras from every maker

The Cameras pane is one status board for every camera FrontierStack knows about, whether or not it can show a picture. It gathers cameras found by Device Discovery (pinned, and found but not yet pinned), AV Feeds streams, SwitchBot cameras, Smart Life cameras and UniFi Protect cameras. With dozens of cameras, the counts at the top and the Offline filter are the quick answer: offline cameras sort first, and a stream whose address matches a pinned camera is shown on that camera's tile rather than twice. A Protect camera with the same MAC address as a pinned camera is shown on that camera's tile. The bell on each tile switches its offline alert, and Alert on All covers every camera that can be checked at once. Alerts go through the Alerts pane, so a contacts preset can page the technician for the site.

A camera counts as alive if it answers on RTSP (port 554), its web port (80) or ONVIF (2020). Cloud-only cameras such as Ring, Nest, Blink and Arlo show no status, because only their own app can reach them.

Tapo cameras from anywhere (unofficial). In Services ▸ Cameras ▸ Tapo Cameras, sign in with your TP-Link ID to see each Tapo camera's online / offline state even when the Mac is away from home, with offline alerts through Alerts. FrontierStack signs in the way the Tapo Android app does, because TP-Link offers no official API — so it can break when TP-Link changes its app, and using it may be against TP-Link's terms. Only status is read. Your password is never stored, a camera counts as offline only after two checks in a row, and if TP-Link's cloud can't be reached the camera shows Status unavailable, never offline. Pinned Tapo cameras keep a green dot off-LAN while the cloud says they are online; other Tapo devices and, with a second sign-in, Kasa devices can be watched too.

SD cards. For Tapo, Hikvision/Annke, Dahua/Amcrest/Lorex, Reolink and Axis cameras, each tile also shows the memory card as the camera itself reports it: SD ✓ 42% used, No SD card, Unformatted, SD card error, or SD — when it isn't known (hover for the reason). FrontierStack asks the camera's own local API, never a cloud, and only while the Mac is on the camera's network; away from it, the last result stays with its time. Checks run every 30 minutes, one camera at a time and at most once per 10 minutes per camera. Non-Tapo cameras use the login from their AV Feeds stream or one you enter in the camera's device pane. Tapo cameras need admin and your TP-Link account password, entered once under Tapo Cameras ▸ Local camera access; it stays in the Keychain and is never sent to TP-Link's cloud. If a camera refuses a login, FrontierStack stops asking it until you fix the login or press Retry, because cameras lock accounts after repeated failures. A camera that can't be reached or signed in to is never reported as having no card. SD alerts are opt-in; nearly full alerts are off by default because most cameras loop-record and are always close to full. eufy, WTW and Eseecloud cameras have no local storage API.

Restarting a Tapo camera. A Tapo camera's device pane has Restart Camera… — the Tapo app's Reboot, sent over the same local sign-in as the SD check and under the same rules: only on the camera's network, with its pinned certificate, and not after a refused login or a lockout. The camera stops recording and streaming for about a minute.

What each make needs:

MakeWhat worksHow to set it up
Anker eufyRTSP on many models; no ONVIF and no public APIIn the eufy Security app: camera ▸ Settings ▸ Storage ▸ NAS (RTSP). Set the username and password there (they are random by default) and copy the link, usually rtsp://user:pass@ip:554/live0. Choose Continuous recording: in Event mode, and on battery cameras, the stream exists only during an event, so an offline alert would be false. At most four viewers at once.
WTW (塚本無線)RTSP and ONVIF on the PoE/IP line; nothing on the EAGLE Wi-Fi lineSee below.
Eseecloud (EseeCloud / IP Pro apps)RTSP on recorders, on the web port 80Turn on the RTSP server in the recorder's own Network menu, then use rtsp://user:pass@nvr-ip:80/ch0_0.264. Channels count from zero (ch0 is camera 1), and _1 is the sub stream. Many stand-alone Eseecloud Wi-Fi cameras have no RTSP at all. The default login is admin with a blank password.

9.22.1WTW cameras and recorders

Older IP cameras. WTW's own 2018 IP camera manual gives rtsp://ip:554/live/0/main for the main stream and /live/0/sub for the sub stream. Port 554 is the default and can be changed. RTSP is turned on in the camera's web network settings. Current PoE/IP models and NV4-series recorders list RTSP and ONVIF in their specifications. If the path above doesn't connect, add the camera over ONVIF in an NVR app to find its URL.

EAGLE Wi-Fi line. These have no RTSP and no ONVIF. WTW's support site says so for one camera, and the recorder specification lists only TCP/IP, DHCP and P2P. For these, the most you can do is check that the recorder answers on its web port: pin it in Device Discovery as WTW Camera / NVR and turn on its offline alert.

Default passwords. NV4 recorders use 00000000, which becomes wtwjapan after a factory reset. Older cameras use admin with a blank password, or admin/admin. Change them before the device goes on your network.

SecurityBudget cameras and recorders ship with blank or well-known passwords and are frequent attack targets. Set a password, never port-forward a camera to the Internet (use Tailscale to watch remotely), and put cameras on an IoT VLAN if your network has one.

9.22.2Smart-home clouds

Smart Life (Tuya) devices are read through Tuya's official Cloud API. Create a Cloud project at iot.tuya.com in your account's data center (Japanese accounts use Western America), link your Smart Life account with Devices ▸ Link Tuya App Account, and paste the project's Access ID and Secret into the Smart Life pane. You then see every device's online state and plug power, can switch plugs and lights — each outlet of a power strip separately — and can have any device alert when it goes offline. TESSAN, BN-LINK, Edison Smart, OHMAX and MEAPUXIN plugs are Smart Life devices too; add them to Power Control as Smart Life / Tuya outlets to power-cycle a server. The free trial allows about 26,000 calls a month and must be extended every few months, so FrontierStack checks every 10 minutes.

Minut sensors report noise, occupancy, temperature and humidity in rentals. The Minut pane alerts when a sensor goes offline, when its battery runs low, and when a home has a noise disturbance in progress. Minut opens its API only to accounts it has approved; its help article ties this to the Enterprise plan.

SmartThings, Govee, LIFX, Sensibo and Nuki each have their own pane that lists the account's devices with a status dot: green online, red offline, grey when the cloud didn't say. Turn on the bell next to a device, or Alert on all, to get an alert when it goes offline. Govee, LIFX, Sensibo and Nuki need only an API key or token from the vendor's app or website. For SmartThings, create your own OAuth app once with the SmartThings CLI so sign-in keeps working. A personal access token also works, but it expires after 24 hours. If a key is rejected or a sign-in expires, you get one account alert. If a cloud can't be reached, its devices are left unknown. Neither case is reported as devices going offline. Nuki locks are worth watching in rentals: a lock that has lost its connection can't be opened remotely for guests.

Keypad codes. For a Nuki lock with a paired Keypad, the Nuki pane lists its codes once you press Show Codes, with the digits hidden until you reveal them. You can add a code, change its digits or name, limit it to a date range, certain weekdays or a time of day, switch it off, or delete it. Nuki codes are six digits from 1 to 9 and can't start with 12. The API token needs permission to manage smart lock authorizations as well as to view locks, and each change reaches the lock through its bridge within about a minute. In the SwitchBot pane, a Keypad or Lock Vision row has a Passcodes list: add a permanent, temporary, one-time or emergency passcode of 6 to 12 digits, or delete one. SwitchBot can't edit a passcode and never sends one back in readable form, so to change a code add the new one and then delete the old one, and note the code when you add it. Each of these changes needs a real press, and Touch ID when Human-Presence Approvals asks for it, so automation driving the screen can't hand out door codes. Every change is written to the audit log without the digits.

9.6Phones, PBXes and SIP trunks

VoIP & telephony is part of Full Fleet; on Standard everything below is shown view-only. Device Discovery recognises desk phones and ATAs (Yealink, Poly, Grandstream, Snom, Fanvil, Cisco, Avaya, Mitel, Panasonic, Gigaset, 2N and Algo intercoms…) and PBX appliances and session border controllers (Grandstream UCM, Yeastar, Avaya IP Office, NEC UNIVERGE, Panasonic KX-NS, AudioCodes Mediant, FreePBX and 3CX servers…) and types them IP Phone / ATA or PBX / Phone System. A router with a built-in phone port, such as a FRITZ!Box, stays a router. The device page's VoIP section has Check SIP, which sends a real SIP OPTIONS request, Watch in Alerts, and for a phone an offline alert.

A SIP check proves more than an open port: any SIP answer, even 401 or 404, means the SIP stack is working, while a 5xx answer such as 503 means it is up but refusing calls, and counts as down. Tools ▸ SIP Health Check runs it by hand over UDP, TCP or TLS; a SIP (OPTIONS) watch in Alerts runs it on every sweep, over TLS when the port is 5061. Use it for your PBX, your SIP trunk provider's proxy and your SBC.

The VoIP & Telephony catalogue adds live monitors that alert on what actually stops calls: offline extensions and trunks on Asterisk, FreePBX, PBXact, Issabel and VitalPBX (through a read-only Asterisk REST Interface user, reached over the LAN or a VPN); unregistered trunks, an expired licence or stopped services on 3CX; offline desk phones in Zoom Phone and Webex Calling; and a prepaid balance below your floor at Telnyx, Plivo, Vonage and VoIP.ms.

Japan and Korea. Device Discovery also knows the domestic business-phone makers: Saxa PLATIA, Iwatsu Frespec, Nakayo NYC, OKI CrosCore and DISCOVERY neo, Hitachi NETTOWER, NTT SmartNetcommunity α, IPECS (formerly Ericsson-LG) and Samsung OfficeServ. A brand name on its own is never enough — an OKI printer, an NTT home gateway or a Samsung TV stays what it is. The catalogue adds BIZTEL, MOT/TEL, MiiTel, SoftBank ConnecTalk, KDDI 光ダイレクト, Arcstar IP Voice and the business internet phone services of LG U+, KT and SK Broadband. The BIZTEL monitor reads call history through BIZTEL's API (the 履歴取得API option and an API token) and alerts when unanswered inbound calls in the last hour go over your threshold; it fetches only new calls each poll so it uses little of the account's monthly API allowance, and shows that usage.

9.7The Data Map

The Data Map pane draws a per-location data-flow diagram: where your data lives and how it moves across the devices and services at one site. FrontierStack serialises the location's inventory — the discovered devices, their roles, and (optionally) scanned ports — scrubs it of secrets, and hands it to your subscription Claude through the local claude CLI (not the metered API the in-app harness uses). The reply comes back as a Mermaid flowchart plus a short narrative, rendered offline in the pane; the last diagram for each location is kept, and you can save it to your Obsidian vault as a runbook. Locations themselves are explained in Chapter 8.

9.8Opening a port: UPnP and NAT-PMP/PCP

To reach a service from the internet the classic way, a port on the router has to forward to your Mac. Rather than make you log into the router by hand, FrontierStack can ask the router for a mapping using the standard protocols it advertises:

  • UPnP IGD (via miniupnpc) — the common consumer-router method.
  • NAT-PMP / PCP (via libnatpmp) — Apple's and the modern equivalent.
  • OPNsense — a perimeter rule and port-forward through its API directly.

These tools are installed on demand the first time you use them. A mapping made for a temporary session (see Debug Share) is torn down automatically when the session ends.

SecurityForwarding a port punches a hole in your perimeter that stays open until something removes it — the single most common cause of accidental exposure. Open a port only for a service that is hardened and authenticated, prefer the tunnel methods below (which need no inbound port at all), and review forwards regularly in your router. A perimeter forward also needs a public, non-CGNAT IP to work; behind carrier-grade NAT it cannot.

9.9Dynamic DNS: following a changing IP

Home and small-office connections rarely have a static IP, so a hostname you point at today's address goes stale tomorrow. The Dynamic DNS pane keeps a hostname tracking your current public IP. Add an entry with a Name, a Hostname (for example myhost.duckdns.org) and the account data for your provider; press Update Now to publish immediately, or turn on Update automatically. You choose whether the updater runs only while FrontierStack is running or permanently as a system service, so the record stays current even when the app is closed. Cloudflare users get a tighter path: a Cloudflare DDNS A record that follows your public IP, driven by the same Cloudflare integration as Chapter 7; a generic interval-based updater covers other providers via an update URL.

9.10DHCP Servers: scopes, leases and failover

The DHCP Servers pane (under DNS, Full Fleet) looks after the servers that hand out addresses on your networks. Pick a linked server and FrontierStack finds whichever DHCP server it runs, over the existing SSH link: the Windows Server DHCP role (read with the DhcpServer PowerShell module), Kea (kea-dhcp4.conf and its lease file), ISC DHCP (dhcpd.conf and dhcpd.leases) or dnsmasq, including the copy inside Pi-hole. On Linux, reading lease files usually needs the server's sudo password saved in Remote Management.

SectionWhat it shows
ServerWhich DHCP server, its version, whether it is running and, on a domain-joined Windows server, whether it is authorised in Active Directory.
FindingsProblems in order of severity: service stopped, a scope nearly full, failover out of step, a reserved address leased to a different device, two DHCP servers configured on one host.
ScopesEvery IPv4 scope or range with a fill bar: addresses in use against the pool size, and how many are reserved.
FailoverWindows failover relationships and ISC failover peers, with this server's state and the partner's.
Reservations / LeasesFixed addresses, and every live lease with MAC address, host name and expiry. Filter the list by IP, MAC or name.

Reservations. On a Windows DHCP server you can add a reservation (scope, IP, MAC, optional name) and remove one; right-click a lease and choose Reserve This Address… to fill the form. FrontierStack never edits Kea, ISC or dnsmasq configuration files: for those, right-click a lease and choose Copy Reservation Line, paste the line into the config, and reload the server.

Reserving a pinned device's address. Devices that change address on every DHCP renewal (cameras that drop off Wi-Fi, a PC after a router reboot) can be pinned to one. In the device's own pane press Reserve This Address…, or ask the AI Administrator, whose tool is dhcp_reservation. FrontierStack uses the device's MAC to find which DHCP server holds its lease. On an OPNsense firewall with an API key, Dnsmasq or Kea is changed through the API and applied straight away. The key needs the “Dnsmasq DNS/DHCP: Settings” or “DHCP: Kea(v4)” privilege, and a Dnsmasq reservation also makes the name resolve locally. A Windows server here is changed with PowerShell. For OPNsense's ISC DHCP and file-configured servers you get the static-mapping path or the config line. Otherwise the router at the device's location gets step-by-step web-UI instructions, because consumer routers such as TP-Link Archer and Deco have no API. Nothing changes until you confirm.

Alerts. Tick Watch in Alerts for a server and it is checked every 30 minutes. You get an alert when the DHCP service stops, a scope reaches the alert level (95 % by default; the pane warns from 85 %), or failover goes partner-down. Change both levels at the bottom of the pane. The AI Administrator reads the same state with get_server_health and area=dhcp.

NoteFull Fleet. On Standard the pane stays visible but greyed, with an upgrade link; nothing is probed or alerted.

9.11Tunnels and mesh: reaching in without opening up

The better way to reach a service from outside is to skip inbound ports entirely. A tunnel makes an outbound connection that an outside endpoint rides back in on, traversing NAT with nothing forwarded:

  • Cloudflare Tunnel — a Quick Tunnel gives you a public *.trycloudflare.com URL with no account, or a named tunnel for a permanent hostname.
  • Tailscale — Serve keeps a service private inside your tailnet; Funnel publishes it to the internet through your Tailscale node.

For ongoing connectivity between machines, a mesh or VPN network gives every node a stable private address wherever it roams. FrontierStack manages the common ones — by API on a router that supports it (OPNsense), or over SSH on a server:

NetworkWhat it is
WireGuardModern, fast kernel VPN tunnels — the base layer most of the rest build on
TailscaleWireGuard mesh with exit nodes and subnet routers, set up over SSH or the OPNsense API; the VPN pane can also bring Tailscale up automatically at every FrontierStack launch, so router fallback addresses and tailnet monitors work from the first sweep
HeadscaleSelf-hosted, open-source Tailscale control server
NetBirdOpen-source zero-trust networking, self-hostable
NebulaLightweight overlay mesh (Slack / Defined Networking)
ZeroTierZero-trust SD-WAN / virtual networks — agent plus API
NoteTunnels and a mesh are also how the forthcoming iOS companion app reaches your Mac from anywhere — over your LAN, Tailscale or a Cloudflare Tunnel — without exposing anything to the open internet. Each device authenticates with its own signed-request key.

9.22.3Tailnet: the whole-network view of Tailscale

The per-server Tailscale controls live inside each server's own pane and work over SSH: they answer “is the daemon up on this box”. The Tailnet pane answers the questions that span the whole network, which only Tailscale's own API can: paste an API access token (device read is enough — the pane never writes) and it lists every device with its addresses, OS, client version, owner, tags and last-seen time.

What earns the pane its place is the Needs attention list. It surfaces node keys that are about to expire — a scheduled outage, because when a key lapses the device silently drops off the tailnet until somebody re-authenticates it — devices waiting for approval, devices advertising routes nobody approved (the usual reason a subnet is unreachable even though the node is plainly up), and devices that stopped checking in weeks ago. Key expiry and pending approvals also raise Alerts.

9.22.4Self-hosted DERP relays

When two Tailscale or Headscale devices can't connect directly — usually because one side is behind hard NAT — their traffic goes through a DERP relay. Tailscale runs relays worldwide, and you can also run your own derper for lower latency or to keep relayed traffic on hardware you control. The Tailscale DERP Relay pane (VPN ▸ Tailscale DERP Relay) covers both ends:

  • This Mac's view. From the local tailscale netcheck: whether UDP works, whether the network has hard NAT, the home region and the latency to each region, any self-hosted regions in the tailnet's DERP map, and which peers are relayed through DERP right now rather than connected directly or through a peer relay.
  • Your relays. Each derper you add is checked without credentials — HTTPS /derp/probe, that the DERP handler is on, the certificate's expiry, and a real STUN binding on UDP 3478 — and raises an Alert when it stops answering or its certificate is within 14 days of expiry.
  • Put it into service. For each relay the pane generates the commands to run it (go install tailscale.com/cmd/derper@latest, optionally with -verify-clients so only your tailnet's devices can use it), the derpMap block for the tailnet policy file, and a DERP-map file for Headscale.
NoteA relay needs a public address with TCP 80 and 443 and UDP 3478 open, and nothing in front of it — no NAT, load balancer or proxy. The pane is read-only; the AI Administrator reads the same report through tailscale_control with op=derp.

9.22.5An Apple TV as the way in: reaching a locked ISP router

ISP-supplied routers, such as NTT's XG-100NE and other FLET'S home gateways, can't run Tailscale or a VPN, and their settings page answers only on the LAN. On an IPoE line (MAP-E or DS-Lite) there is no usable inbound IPv4 port either, so port forwarding and a classic VPN server are out, and static routes only steer traffic inside the network. The answer is an always-on device behind the router running Tailscale as a subnet router. It makes only outgoing connections and exposes nothing to the internet, and an Apple TV already plugged in to the TV is an easy choice.

  1. On the Apple TV, install Tailscale from the App Store, choose Install VPN Configuration and log in by scanning the QR code.
  2. Turn on the app's subnet router option and enter the LAN, e.g. 192.168.1.0/24.
  3. In the Tailscale admin console's Machines list, open the Apple TV's ⋯ ▸ Edit route settings…, tick the range and save; in the same menu, Disable key expiry.
  4. From anywhere on your tailnet, open the router's LAN address, e.g. http://192.168.1.1.
ModelTailscale
Apple TV 4K (2021, 2022)Fully supported (tvOS 27)
Apple TV HD (2015), Apple TV 4K (2017)Works, but stops at tvOS 26; the HD has 100 Mbit Ethernet
Apple TV 3rd generation and earlierNo App Store, not possible

Make the Apple TV a home hub so it stays reachable while asleep, use Ethernet where the model has a port, and test a power-cycle before you leave, because tvOS updates restart it unattended. Give the home LAN an unusual range (on NTT gateways, Web設定 ▸ LAN設定) so it doesn't collide with the 192.168.1.x network you connect from. tvOS has no SSH, so FrontierStack can't configure the Apple TV itself; the Tailnet pane shows whether it's online and flags routes still waiting for approval.

TipOther devices can be the subnet router too: a Raspberry Pi, a Mac, a NAS or Home Assistant, a router you own (OPNsense, OpenWrt, GL.iNet), or an Android TV box. Older Android-based Fire TV models can sideload the Tailscale app but stop background apps too readily to be dependable, and Echo speakers, iPhones and iPads can't do it at all.

9.22.6Running your own ZeroTier controller

ZeroTier's client is only the member side; networks are normally administered at my.zerotier.com. But every zerotier-one install can also be the controller for its own networks — fully self-hosted, no third party holding your membership list — and that path ships with no local administration UI at all. The ZeroTier Controller pane is that missing interface.

It shows the controller's identity and the networks it owns, and works the member-authorisation queue with one-click authorise/deauthorise. Members authorised but unseen for a fortnight are flagged, because an unused grant is a standing hole in the network. You can edit a network's name, privacy, routes and IP assignment pool, and write flow rules in ZeroTier's own rules language — compiled locally as you type, with templates for the common cases and a warning before you save a rule set that would lock everybody out.

Everything runs over SSH against the controller's own loopback API. The controller listens on 127.0.0.1:9993 and authenticates from a root-readable token, so FrontierStack never needs — and actively discourages — a publicly reachable controller API; the built-in audit flags it if one has been exposed anyway, along with loose file permissions and a missing backup. There is also a Prometheus export, a warm-standby backup/restore, and an assistant for migrating networks out of ZeroTier Central.

NoteA network ID embeds its controller's identity, so networks can never be moved between controllers and cannot be carried over from Central — migrating means recreating the configuration and having members re-join the new ID. It also makes identity.secret irreplaceable: lose it and every network ID it owns is orphaned. Back it up encrypted, off the box.

9.12UniFi: Cloud Gateways, Dream Machines and Superlink

Ubiquiti's consoles get their own pane, because a UniFi gateway is doing more than a generic router probe can see. It covers the console families alike — a Dream Machine (UDM, UDM Pro, UDM SE), a Cloud Gateway (UCG-Ultra, UCG-Max, UXG), a Superlink gateway, a Cloud Key or a self-hosted controller. The UniFi pane speaks both of Ubiquiti's APIs, and they answer different questions. A Site Manager key — one key, created at unifi.ui.com — lists every console on your account with its model, firmware and online state. That is the only way to learn a remote site has lost power or its internet connection, because a console that is off the network cannot tell you anything locally. A local console key, created on the console itself under Settings ▸ Admins & Users, unlocks what the gateway is doing right now.

Locally the pane shows WAN links with their ISP, latency and throughput, and marks which link is actually carrying traffic. That last detail matters: when a primary line drops, UniFi fails over silently to the backup, which is usually slower and often metered, and the normal way people discover this is the following month's bill. It also lists adopted devices and their firmware, firewall rules in the order the gateway evaluates them, the client list, and every port forward. Each enabled forward is a deliberate hole through the firewall, so the pane flags the ones that accept connections from any source address — correct for a public web server, worth a second look for anything else.

Alerts cover a console dropping offline, a WAN link going down, running on the backup link, a device leaving the network, and internet-exposed port forwards. The pane is deliberately read-only: rule and network changes stay in the UniFi console, where their validation lives. PoE switch ports are handled in the next section, and plain console reachability still appears in Router & Network alongside the other vendors.

The Site Manager key also lists UniFi Protect cameras and doorbells, read at most every five minutes. Tick Alert on a camera, or Alert on all Protect cameras, for offline alerts. A camera that is updating, or whose console is itself offline, is shown as unknown rather than down.

9.13Changing a Wi-Fi password across many routers

When a Wi-Fi password leaks — a departing employee, a password printed in a guest room, a network someone is quietly using — the fix is a new password on every router and access point that broadcasts that network, at once. Change Wi-Fi Password… (Router & Network ▸ Routers, or the Wi-Fi Analyser) does that in one pass. It is a Full Fleet feature. FrontierStack signs in to each pinned router, lists the networks it broadcasts and ticks the ones that broadcast the network you choose. Type a new password or press Generate for a random one that is easy to read aloud, then confirm. The routers are changed one at a time; the one acting as this Mac's gateway goes last, and each row reports what was changed.

PlatformHow the password is changed
OpenWrtLuCI login over ubus: the matching wifi-iface keys, uci commit, then a Wi-Fi reload
MikroTik RouterOS 7Router login over REST: the security profile or inline passphrase behind the network (wifi, wifiwave2 or legacy wireless)
UniFi consoleThe local API key from the UniFi pane (Network 10.1 or later); the console updates every access point it manages
Everything elseA Change by Hand checklist with each router's Web UI link

Only personal (WPA2/WPA3 pre-shared key) networks are changed. Enterprise, open and uplink (station) networks are left alone, and a RouterOS security profile that another network also uses is refused, because changing it would change that network's password too. Afterwards Rejoin This Mac reconnects this Mac, Show Join Code displays a QR code phones can scan, and Select Failed to Retry re-runs only the routers that failed.

SecurityThe new password is never saved, logged or passed to the AI Administrator; the audit log records only the network name and how many routers changed. Store it in your password manager before closing the window. OpenWrt's web interface is usually plain HTTP, so on those routers the password crosses your LAN unencrypted — the rollout flags them; use an HTTPS address or Tailscale where you can.

9.14Power over Ethernet: the power button for devices that have none

Access points, cameras, door controllers and desk phones have no power switch. Their only supply is the switch port they are plugged into, which means the recovery move for a wedged one — power-cycle it — normally involves a vendor web UI, or a walk to the cabinet.

The Power over Ethernet pane makes the port the button. Add a managed switch by IP and you get, per port: its PoE state (delivering power, searching, fault), powered-device class, priority and wattage where the switch reports it — plus power off/on and a proper power cycle. It also shows the switch's power budget: total watts, watts in use, and a warning when you cross the switch's own usage threshold, past which it starts shedding low priority ports — so port priority is editable here too.

This works broadly because PoE is standardised: RFC 3621's POWER-ETHERNET-MIB is implemented by essentially every managed PoE switch — Cisco, Aruba/HPE, Netgear, TP-Link/Omada, Ubiquiti, MikroTik, D-Link, Zyxel. Reading uses the SNMPv2c or SNMPv3 profile from Device Discovery. With SNMPv2c, switching a port needs a separate read-write community, added per switch and kept in your Keychain. With SNMPv3, it uses the authenticated profile only when that user has write permission on the switch. Cutting power deserves deliberate access and confirmation; FrontierStack does not expose arbitrary OID writes. With Monitor on, a port in fault state or a switch over its power budget raises an Alert — both otherwise stay invisible until someone notices a camera has gone dark.

Vendor controllers. When you add an entry, choose its type. Besides SNMP, the pane speaks the controllers' own APIs: a UniFi console or controller (a local admin account, or a Network API key), a TP-Link Omada controller, MikroTik RouterOS 7 over REST, NETGEAR Smart Managed Plus switches (GS305EP, GS308EP, GS316EP — through their own web login, since they have no API; Smart Managed Pro models use SNMP) and Cisco Meraki through a Dashboard API key. Ports are grouped by switch, with the watts in use and — where the controller knows — the name of the device each port powers. UniFi, MikroTik, NETGEAR and Meraki cycle a port on the switch itself, so it comes back even if the access point you are cycling carries this Mac's own connection; an Omada port is switched off and then put back exactly as it was. A controller with a self-signed certificate shows its SHA-256 fingerprint first: compare it with the controller and approve it once. If the certificate later changes, FrontierStack stops sending commands until you approve the new one.

Web-only systems, pinning and whole switches. Cloud-managed lines without a public API — Aruba Instant On, Zyxel Nebula, NETGEAR Insight, EnGenius Cloud, Grandstream GWN, RUCKUS One, D-Link Nuclias — are added as Web UI only: FrontierStack can't switch their ports, so a device linked to one shows an Open … to power-cycle link instead of a button. Pin puts any controller, switch or web-only system with your pinned devices and on Places, its web page one click away. Cycle All… restarts every PoE device on one switch together: ports go off as a group, wait once, and come back as a group.

From the device. On any device's page, Add power control… ▸ PoE switch port links it to the port that powers it; the port a controller reports it on is offered first. That creates a Power Control outlet, so the device gets On, Off and Cycle in its own Power section, can be power-cycled automatically after failed health checks, and can be cycled by FrontierStack AI with your confirmation.

screenshot to be added
Figure 9.2. The Power over Ethernet pane: a switch's power budget above its port list, with one port mid power-cycle.Capture: capture: open Power over Ethernet with one switch added and its ports listed

9.15Mellanox / NVIDIA networking

Data-centre switching from NVIDIA's Mellanox line has its own pane, Mellanox Networking (Full Fleet). It reads six kinds of device: Spectrum Ethernet switches on Onyx (its JSON API) or Cumulus Linux 5.x (the NVUE REST API on port 8765), Quantum and SwitchX InfiniBand switches on MLNX-OS, the UFM fabric manager, BlueField DPUs through their BMC's Redfish service, and the ConnectX NICs inside your fleet servers, read over SSH as the linked user.

Add each device with its management address and a read-only account: a monitor-capability user on Onyx or MLNX-OS, an nvue-monitor user on Cumulus, a Monitoring Only UFM user, a ReadOnly BMC account. A self-signed certificate is fetched and shown with its fingerprint; compare it with the console and approve it before any password is sent. Devices are checked every three minutes from the Alerts sweep, and sessions are logged out after each check.

Ports. The first good read watches every port that is up. A watched port alerts when its link goes down, and also when it dropped and came back between two checks — the pane reads each port's own link-down counter, so a flapping cable shows up even if it's up when polled. Ports somebody disabled never alert. On InfiniBand, a port that is LinkUp but not Active is called out: usually no subnet manager is running, and an embedded SM that is enabled but not running is an alert in its own right.

Hardware and fabric. Failed power supplies and fans, sensors over their critical limit (or your threshold, for NICs and DPUs), devlink health reporters in error, a BlueField whose Arm OS has crashed, and UFM's Critical and Major alarms — grouped into one alert per fabric — all reach the usual alert channels. With NVIDIA's MFT installed and passwordless sudo for mlxfwmanager, ConnectX firmware updates are listed too. The AI Administrator can read the same state through router_info with report=mellanox.

9.16Show Network: supervising a club, stage or show

A show runs on a network nobody looks at until something on it goes quiet: a CDJ drops off the link, a lighting node stops answering, the timecode stops, an NDI feed vanishes from the media server. The Show Network pane (sidebar ▸ AV & Stage) makes this Mac the supervisor of that network. It does not run the show; it watches everything that does, and tells you the moment a piece of it disappears.

9.22.7The census

At the top of the pane, FrontierStack writes one plain sentence for each network or VLAN the Mac is attached to, counted from what the devices themselves announce — for example: “There are 14 Art-Net nodes, 73 universes in use, 2 sACN sources and 1 NDI video source on en5 · 2.0.0.0/8.” It is the quickest answer to “is everything here?” when you walk into a venue, and the first thing to read after a cable has been moved.

9.22.8The Show Dashboard

Below the census, the Show Dashboard gives each part of the show its own tile:

TileWhat it shows
Players & mixerEach Pro DJ Link player by number (CDJ 1 online), the DJM mixer and rekordbox.
TempoBPM from beat packets — the master deck when player-status packets reach this Mac, otherwise the deck that is playing.
ResolumeOnline when its web server answers, when it runs on this Mac, or when its NDI outputs are seen.
NDIHow many NDI video sources are on the network.
Art-Net / sACNUniverses in use, with the Art-Net nodes and sACN sources sending them.
TimecodeHealthy or Stopped, from MIDI Time Code on any CoreMIDI source and from Art-Net timecode.
LED systemsWLED controllers, pixel controllers and LED processors that have been found or added.
ControlOSC endpoints, RTP-MIDI sessions and TCNet nodes.

Lists underneath show every device behind each tile, with a Watch button on each row. SMPTE LTC is an audio signal and is not read directly; convert it to MTC or Art-Net timecode (most LTC interfaces and ShowKontrol do) and it appears on the Timecode tile.

9.22.9Arm Show

Before doors open, press Arm Show. FrontierStack watches everything that is online at that moment — decks, mixer, lighting nodes, sACN sources, NDI sources, LED controllers, the Link session — and if any of it disappears, it raises an alert through your usual channels (Chapter 11), filed under the Show Network group. Disarm after the show clears the watch list. You can also watch or unwatch single devices by hand.

9.22.10Passive discovery, and stepping aside

Almost everything is found by listening, never by asking:

ProtocolHeard on
Pro DJ Link (CDJ/XDJ, DJM, rekordbox)UDP 50000–50002: keep-alives and beat packets
Denon StageLinQ (Engine DJ)UDP 51337
Ableton LinkMulticast 224.76.78.75:20808: peers, tempo and session
TCNet (ShowKontrol)UDP 60000
sACN / E1.31Universe discovery on 239.255.250.214:5568; data universes only if you list them
NDI, OSC, WLED, RTP-MIDIBonjour
MIDI sources and MIDI Time CodeCoreMIDI, input only

The one thing FrontierStack sends is an Art-Net ArtPoll: a single discovery broadcast, repeated every 30 seconds so new nodes appear on their own. Turn Poll for Art-Net nodes automatically off under Settings if you would rather press Poll Art-Net Now yourself.

Show software needs its UDP ports to itself. While rekordbox, Engine DJ, ShowKontrol, Beat Link Trigger, PRO DJ LINK Bridge, QLC+, Resolume, MadMapper, QLab or similar run on the same Mac, the matching listener closes and the pane says so. To see both the software and the network, supervise from a second Mac on the show network.

SecurityArtPoll is never sent on an open network that is not one of your Places, so a laptop on venue guest Wi-Fi does not broadcast to strangers. Listing sACN data universes joins their multicast groups (up to 16) for live priority and rate; avoid that on Wi-Fi.

9.22.11Show Servers

Under Show Servers, Add Server takes the address of a media server, LED controller or lighting daemon. Each is checked over HTTP every 30 seconds and alerts when it stops answering. Some report real status:

  • Resolume — through its web server (Preferences ▸ Webserver).
  • WLED — LED count, frame rate, current draw, Wi-Fi signal and any live Art-Net or sACN input, with On/Off and brightness control.
  • Falcon Player (FPP) — player state and the current sequence.
  • OLA and QLC+ — the daemon or web access answering, with OLA's version and universe count.

NovaStar/COEX, Brompton Tessera, Colorlight, MADRIX 5 and Lightjams are checked for their web UI or remote port answering. Receiving cards, cabinet temperatures and topology stay in the vendors' own tools.

screenshot to be added
Figure 9.3. The Show Network pane: the census sentence above the Show Dashboard tiles, with the show armed.Capture: capture: open Show Network on a lab show network with a few Art-Net nodes, an NDI source and two CDJs, then press Arm Show

9.22.12Presets

9.22.13Warning lights, pinning and power

A stage manager can't watch a screen all night, so Show Network can flash a light instead. Under Warning Lights add a WLED strip or beacon, Philips Hue lights on a local bridge (press the bridge's link button, then Pair), or an HTTP request — an alarm URL and a clear URL, which drives a PATLITE network signal tower, a Shelly relay switching a rotating beacon, or a Home Assistant webhook. While anything watched is down (after a short delay you choose), the lights flash red; when it recovers, or someone presses Acknowledge, they go back to exactly how they were. The light follows Show Network second by second rather than the one-minute Alerts sweep.

Pin puts a player, mixer, Art-Net node, WLED, Falcon Player or LED processor into Device Discovery, where its device pane links a power outlet or PDU, a SwitchBot plug and the UPS behind it. Pins count against your plan's device limit. A pinned, watched device then shows Power-cycle… in Show Network and an optional Auto-cycle — off unless you choose a delay, at most twice, half an hour apart. A UPS behind show gear appears as its own tile, and going on battery flashes the warning lights. LED wall processors (NovaStar/COEX, Brompton Tessera, Colorlight) and MADRIX are High-end show systems, part of Full Fleet.

The Clubs & Bars preset includes Show Network, AV Feeds and Power over Ethernet. For festivals, touring and corporate shows, start from Stage & Shows, which adds the show network's plumbing (Places, VPN, mesh networking). Any other setup can take the Show Supervisor add-on.

9.17Generators: event and standby power

Concerts, festivals and outdoor events run on rented generators, and a generator that stops is a stage that goes quiet. The Generators pane (in AV & Stage, beside Show Network) watches them. Rental fleets mix makes, so there are three ways in:

  • The controller on this network. Most sets are run by a Deep Sea Electronics, ComAp, DEIF, CRE or Datakom controller, and these speak Modbus TCP. Put the controller on the production network (DSE through its Ethernet port or a DSE855 gateway), add its IP, and FrontierStack identifies the model and reads it every few seconds — no cloud subscription, no mobile signal. Supported maps: DSE (GenComm, with alarms named for each family), ComAp InteliLite 4, DEIF AGC 150, CRE GENSYS Compact and Datakom D-300/500/545/700.
  • ComAp WebSupervisor, for sets already reporting to ComAp's cloud: connect with an API key and an application client id and secret, then choose which units to watch. Values refresh every minute.
  • AEMP 2.0 telematics (ISO 15143-3): Trackunit — fitted across much of the rental industry — and Atlas Copco FleetLink and most other equipment makers' portals. Connect the account, then watch the sets you want from its fleet. Snapshots refresh every five minutes; Trackunit's extended data adds the generator's own voltage, frequency and load. Telematics is good for fuel and “is it still running”, too slow to catch a trip mid-set.

Each set shows its state and mode, kW and load (set the rated kW if the controller doesn't report load), fuel with an estimate of the hours left once it has 20 minutes of running data, volts and amps per phase, frequency, coolant temperature, oil pressure, battery voltage, run hours, and the controller's own alarms by name.

When the doors open, press Arm running sets. Every set running at that moment is now expected to keep running: if one stops, faults or stops answering, an alert goes out (group “Generators”). Low fuel, fuel running out within a set number of hours, high load, a lost phase, and frequency or voltage outside tolerance are alerts too. Frequency defaults to whichever of 50 or 60 Hz the set is nearest, which matters in Japan, where both are in use. Electrical problems have to last 15 seconds before they count, so a stage's rig coming up all at once doesn't set them off. Sets with Warning lights on flash the Show Network warning lights on anything critical.

SecurityModbus has no password and no encryption. FrontierStack only talks to controllers on a private or VPN address; never expose a controller's port 502 to the internet. The pane only watches: generators can't be started or stopped from FrontierStack, so nobody standing next to one has to wonder whether it might start under their hands.

The Stage & Shows preset and the Show Supervisor add-on include Generators. The AI Administrator can read every set with ups_status (kind: generator).

9.18Internet Health and speed tests

The Internet Health pane is your view of the link itself. It continuously pings a list of Targets — Cloudflare's 1.1.1.1, Google and Quad9 DNS, two AWS regions and Tailscale's coordination server by default — showing latency and packet loss and re-testing every 30 seconds; hosts that block ICMP fall back to a TCP-connect latency on :443. The gear button in the Internet section's header opens the target-editing dialog — set the list up once and it stays out of the way. The same section carries an IPv6 verdict: each sweep checks whether a global IPv6 address is assigned, whether IPv6 traffic actually works (ping to Cloudflare/Google v6 anycast), and whether the network's advertised IPv6 DNS servers answer. The state it warns about loudest is advertised-but-broken IPv6 — the router hands out an address and an IPv6 DNS server, connections try IPv6 first, and everything stalls until IPv4 fallback; the pane says so in plain words, names the dead DNS server, and points at the router. The AI Administrator can run the same diagnosis with internet_speed (check=ipv6) and dig deeper with ping6/dig/scutil through its diagnose tool. The sidebar's Internet Health row carries a status dot fed by a light background sweep (at launch, then every 5 minutes): green when healthy, orange for broken IPv6 or heavy packet loss, red when every target is unreachable. Live Traffic graphs real-time throughput across every active interface; Addresses & Networks lists each interface, its subnet (a network you can reach directly) and the gateway. A built-in traceroute shows the ISP and transit providers your traffic crosses. Press Test Now in the Speed Test section — or ask the AI with internet_speed — to measure download, upload, latency and responsiveness, using the Ookla speedtest CLI if installed and Apple's networkQuality otherwise. While it runs, two speedtest.net-style dials show the download and upload live — needle, phase and the current Mbps — fed by Ookla's streaming output (the built-in networkQuality reports only at the end, so its dials wait), and the pane names the test server it connected to (provider and city), during the run and in the result. A test that fails now says why instead of ending silently. A Mac on Wi-Fi, though, measures its Wi-Fi as much as its ISP — so the same section can run the test from your router or a wired server instead: pick it under From Router / Server and FrontierStack runs the probe on that device over SSH (key authentication; routers as root), preferring an installed Ookla/speedtest-cli and falling back to a curl single-stream estimate. If the router measures much faster than the Mac, your bottleneck is the wireless hop, not the line — and the AI can do the same comparison via internet_speed with a source.

One test tells you about one moment; Speed History, the section below it, tells you whether the line is getting slower. Turn on Run speed tests on a schedule — it is off by default, because every test uses real bandwidth and, on a metered line, real data — and choose Every 6 hours, Daily (the suggested setting), Every 2 days or Weekly. Each run lands on a random minute, and for daily and longer rates Only between keeps it inside a quiet window such as 02:00–05:00, so results are comparable and nobody's video call is interrupted. A due test is skipped and retried later, never failed, when there is no internet, the connection is metered or in Low Data Mode (an iPhone hotspot, for example), the Mac is on battery, or another test is running; the Mac has to be awake at the chosen time. Without the Ookla CLI the built-in networkQuality does the measuring, and each result records which engine produced it. Under Also test from a router or server you can put the router's own test on the same schedule, which measures the line without this Mac's Wi-Fi in the way; each device keeps its own history, and scheduling more than one device needs Full Fleet. Every result — time, download and upload, latency and jitter where the engine reports them, engine, test server, and whether this Mac was on Wi-Fi (and which network) or Ethernet — is kept, up to 400 per source, and charted with the baseline band. When the median of the last 7 days (at least four scheduled tests spread over two days or more) falls below 65% of the median of the 28 days before (at least eight tests), a long-term decline warning appears in Alerts under Network & Routing, with recent and baseline Mbps and the percentage change. Only like is compared with like — the same source, the same engine, and for this Mac the same connection type and Wi-Fi network — so a laptop that moves between home and office never reads as a decline, and manual tests are charted but left out of the trend, since you usually run one when something already feels slow. A decline has two possible causes and the warning names both: the line or ISP has degraded, or something on the network is quietly using a lot of bandwidth — compare with the router's usage on its device pane and look for devices you don't recognise. After a deliberate change, such as a cheaper plan, Accept as New Normal makes the current speed the baseline and ends the warning. The AI Administrator reads the same history and verdict with internet_speed (check=history).

9.19Network Path: switches, hubs and hop-by-hop latency

The Network Path pane answers the physical question the IP tools cannot: which boxes does this connection actually cross, and which one slows it down? LAN Path reads your managed switches' bridge tables and LLDP neighbours over SNMP and draws the chain between this Mac and any LAN device — each link labelled with its port and speed, the slowest link flagged, and a dashed inferred box drawn where several devices share one switch port (the classic hidden unmanaged switch or hub, which cannot be queried directly). Locate a Device tracks one machine down: IP, MAC, maker (from the MAC prefix), type — and the exact switch port it is plugged into. Visual Traceroute charts each hop's round-trip time and highlights the hop that adds the most latency, so “is it my Wi-Fi, the ISP's first mile, or further out?” becomes a picture. Reading the switches uses the SNMPv2c or SNMPv3 profile set in Device Discovery; unmanaged gear stays invisible by nature, which is exactly what the inference is for. The pane fills itself in: on open it automatically maps the devices between this Mac and the router (and Map Mac → Router re-runs it). Device Link Speeds goes wider still — it surveys the negotiated Ethernet port speed of every known device from its switch port (both ends of a link negotiate the same rate), slowest and half-duplex links first: a NAS stuck at 100 Mbps on a gigabit network is usually a bad cable, an old unmanaged switch, or a mis-negotiating NIC, and this is where it shows up. Locate a Device also asks the device itself over SNMP what its ports negotiate, when it runs an agent.

9.20Subnets and VLANs

The Subnets pane lists every network FrontierStack knows about — this Mac's interfaces and VPN routes, your routers' LANs, the networks your servers and devices sit on — and what is on each. The switch at its top shows the same networks three ways: as a List, grouped By VLAN, or drawn as a VLAN Layout.

Each subnet is placed on a VLAN from the strongest evidence available. Your own word comes first: right-click a subnet and choose Assign to VLAN… for networks nothing reports (the assignment is saved with your other settings and included in settings backups). Next come routers whose API lists their VLANs — OPNsense, pfSense with the REST API package, MikroTik RouterOS and UniFi — together with the address on each VLAN interface, and router interfaces whose name carries the tag, such as igb0.10. Then this Mac's own VLAN interfaces. Last, managed switches: when most of a subnet's devices are learned on one VLAN in the switches' forwarding tables, the subnet goes there. Every placed subnet says which of these placed it, and anything left over is listed under No VLAN tag known.

VLAN Layout draws the result: the routers and switches that carry your VLANs at the top, the 802.1Q trunk below them, and a colour-coded column per VLAN with its subnets and gateways, the switch ports it uses (filled for untagged access ports, outlined for tagged ones) and the devices and servers on it — each opens its own pane. Read Switches fills in the ports: it asks the managed switches Device Discovery found for their VLAN names, port membership, native VLANs and VLAN-by-VLAN forwarding tables over SNMP, using the same read-only profile as Network Path, and marks ports that carry several VLANs tagged as trunks. Switch readings last for the session, so press it again after re-patching. Ask the AI Administrator “which VLAN is the NAS on?” and it reads the same view through router_info.

screenshot to be added
Figure 9.4. The Subnets pane in VLAN Layout: a router and a managed switch above the trunk, with columns for a management, a users and an IoT VLAN and their switch ports.Capture: capture: open Subnets, choose VLAN Layout and press Read Switches on a lab network with three VLANs
TipA subnet in the wrong VLAN column is usually one whose devices were learned on a trunk port. Assign it yourself — your assignment always wins.

9.21Debug Share: expose a localhost server, briefly

When you need to show a colleague or a phone a dev server running on localhost, the Debug Share pane exposes it for a session and then closes itself. Enter the port (or press Scan localhost to find a running server), choose how to Expose via, set an Auto-close time, and press Open debug session. Every share also closes automatically when FrontierStack quits.

MethodReach
Cloudflare Quick TunnelPublic *.trycloudflare.com URL, no account — ideal for a quick client or phone preview
Tailscale ServePrivate — reachable only inside your tailnet
Tailscale FunnelPublic, through your Tailscale node (Funnel must be enabled in the tailnet)
LAN forwarderA 0.0.0.0:<auto> → 127.0.0.1:port bridge so other machines on this LAN can reach a loopback-only server

The LAN forwarder has two extras. If the host firewall is on, the pane shows Open port in firewall to allow that port in the pf rules just for the session. And an Outside access picker can map a WAN port via UPnP, NAT-PMP or the OPNsense API and pair it with a DDNS host, so a LAN share becomes reachable from the public internet — the mapping is removed when the share closes. The AI Administrator can open, list and close sessions too (debug_share_open / _list / _close), including over MCP when "Allow changes" is on.

A Debug Share session is meant to be brief. To keep your own dev server reachable from your tailnet with no timer, turn on Also serve on Tailscale for it in the Localhost pane (Chapter 4): it answers on this Mac’s Tailscale address on the same port, stays off the LAN, and closes when the server stops. The AI Administrator can start a folder that way with debug_share action serve and report the address to open.

SecurityDebug Share is built around a TTL: every session carries an auto-close timer and is also torn down when the app quits, so an exposure cannot outlive your attention. Keep the window short, prefer the tunnel methods (which open no inbound port), and remember that a Quick Tunnel URL is public to anyone who has it for as long as it lives.

9.22Named tunnels: a permanent public hostname

A Quick Tunnel is deliberately throwaway. When you want a service on this Mac to be reachable permanently at a real address — a self-hosted app, an internal dashboard, a webhook receiver — use a named tunnel instead. It gives the service a stable hostname on one of your own Cloudflare zones (say app.example.com), survives reboots, and — like every tunnel — opens no inbound port: the Mac dials out to Cloudflare's edge, so there is nothing to forward and nothing for a port scan to find.

Create one in the Cloudflare pane's Named Tunnels section: New Tunnel…, then a hostname under one of your zones and the local port it fronts. FrontierStack drives the whole setup through the Cloudflare API using the token you already hold — it creates the tunnel, writes its ingress rule (hostname → http://localhost:PORT), adds a proxied CNAME pointing the hostname at <id>.cfargotunnel.com, and then installs the persistent daemon with cloudflared service install. That last step needs a one-time admin prompt (it writes a LaunchDaemon under /Library); cloudflared itself is fetched from Homebrew on first use. Untick Run on this Mac now if you only want the tunnel and DNS created, to run cloudflared on some other host. Delete unwinds all of it — daemon, DNS record and the account-side tunnel. The AI Administrator has the same three verbs (tunnel_create / tunnel_list / tunnel_delete), with creating one gated behind a red confirmation because it publishes a service to the internet.

Notecloudflared service install runs a single system daemon per Mac, so one named tunnel runs locally at a time. You can still create and route additional named tunnels through the app and run their cloudflared connectors on other machines — the account, the hostname and the DNS are all set up either way.

Each tunnel row also shows a live health line and a bell for an opt-in down alert, and Protect… puts a Cloudflare Access sign-in in front of the hostname — see Chapter 7.

10

Chapter 10

Security & Hardening

The perimeter is only half the job. This chapter is about closing the doors you are not using, watching the ones you are, and proving who is allowed through them.

A server is most exposed not when something attacks it, but when it quietly drifts: a firewall left open, a password login no one disabled, a certificate that expired last week, a mail server that will relay for anyone. FrontierStack treats hardening as a continuous, observable state rather than a one-time checklist. The Security pane is your console for the host in front of you; the AI Administrator (Chapter 13) carries the same checks across your whole fleet over SSH. Everything here is read-only until you ask for a change, and every change is one you could make by hand.

10.1The firewall: Application Firewall and pf

macOS ships two firewalls and FrontierStack reads both. The Application Firewall (ALF) is the per-app layer you set in System Settings; the Security pane reports its state — enabled, stealth mode, block-all-incoming, and how many app rules exist — so you can confirm at a glance that it is on. The pf packet filter is the lower, port-level layer, and this is the one FrontierStack manages directly.

App-managed pf rules live in their own file, ~/Library/Application Support/FrontierStack/pf-frontierstack.conf, loaded into a dedicated frontierstack anchor that is wired idempotently into the system /etc/pf.conf. Keeping rules in their own anchor means FrontierStack never edits Apple's base ruleset and your rules survive a reload without trampling anything. Adding or removing a rule reloads pf through an authenticated admin prompt.

From the AI side, the firewall_rule tool adds or removes a single allow/deny rule for a port, optionally scoped to a source address. It detects the target's operating system first: This Mac and remote macOS hosts get pf (the frontierstack anchor); Linux servers get ufw. It never sends a ufw command to a Mac or a pf rule to Linux.

screenshot to be added
Figure 10.1. The Security pane: firewall state at the top, then intrusion prevention, the SSH-hardening audit, and the open-ports list.Capture: open the Security pane on a host with fail2ban installed and a few listening ports, scrolled to show the Application Firewall summary and the Open Ports section
WarningA deny rule on the wrong port can lock you out of a remote host — including the SSH port FrontierStack itself uses to reach it. Before tightening pf or ufw on a server you only reach over the network, confirm the rule allows your management path, and keep a second way in (console, KVM-over-IP, Headless Setup's Screen Sharing).

10.2Intrusion prevention and the open-ports watch

An open port that has to stay open still needs a guard. The Security pane integrates two intrusion-prevention engines. fail2ban bans IP addresses that match abusive log patterns — SSH and Apache brute force are the classic cases; the pane shows whether it is installed and running, its jail count and how many addresses are currently banned, with a one-click Reload and a "write a starter jail.local" action that drops in a sane SSH jail without overwriting your overrides. CrowdSec adds a shared reputation network on top, showing its active decision count and a Metrics button. Both run as root services installed via Homebrew.

The Open Ports section lists every listener on the host. A companion watch — remote-control and screen-sharing exposure — specifically flags VNC/Screen Sharing (:5900), Apple Remote Desktop, AnyDesk, TeamViewer, Chrome Remote Desktop, Splashtop, RustDesk and Tailscale exit-node advertising, and turns red when someone is connected right now. The Recent Intrusions and Active Bans sections aggregate detections from fail2ban.log, CrowdSec, Suricata's eve.json and Wazuh's alerts.json, newest first; sources you do not run are simply skipped. A new ban, a new listener or an active inbound session can each raise an alert — configure delivery in Chapter 11. The same section checks FileVault on this Mac, judged by what the Mac holds: if it is off while the Mac has SSH access to linked servers or the app-managed SSH key, the row turns red and an alert is raised, because a lost or stolen laptop would give up the keys to your whole fleet. A Mac with no fleet credentials is left alone.

10.3SSH hardening

SSH is the single most valuable door on most servers, so the Security pane includes an SSH Hardening Audit. It reads the effective configuration with sshd -T — not just the file on disk, but what the daemon actually applies after its drop-ins — and flags the settings that matter: PermitRootLogin, PasswordAuthentication, and the rest. When SSH is reachable from the network the pane says so plainly, because that is exactly where the findings matter.

The baseline for an internet-facing host is key-based authentication with PasswordAuthentication no. Apply fixes by editing /etc/ssh/sshd_config.d/ rather than the main file, so package updates leave your hardening intact. FrontierStack's own fleet channel already follows these rules: it uses Ed25519 keys, BatchMode=yes, IdentitiesOnly=yes and host-key trust-on-first-use recorded in known_hosts (Chapter 8). If a host's key access breaks, the repair_ssh_access tool reinstalls the managed key using a one-time login password held in your local vault — the password is read on your Mac and never sent to the AI.

10.4Server Security: the posture check for a remote host

Everything above describes the Security pane for this Mac. The Server Security pane is its counterpart for a linked server: the same posture check, read over SSH, for any host in your fleet. Open a server's detail and click Check… beside Security, or open the pane directly and pick a server from the host menu. A single scan reports the SSH hardening that matters (PermitRootLogin, PasswordAuthentication, the listening port), whether a firewall is present and enabled (ufw, firewalld, nftables or raw iptables), the intrusion-prevention engines running (fail2ban, CrowdSec), the count of pending security updates (apt, dnf, yum), every service listening on all interfaces, and host-integrity smells — world-writable directories missing the sticky bit, unexpected SUID binaries.

Each finding is scored High · Warning · Info · OK and rolled up into a one-line summary badge, so you can sweep a fleet and see at a glance which host needs attention. The pane never changes anything: a Fix it link takes you to the pane that actually makes the change — the Server Firewall pane to enable a firewall or edit rules, the Remote Tools SSH-hardening review, or the security tools that install fail2ban/CrowdSec. It reads deepest as root or with password-less sudo; without either it runs what it can and tells you so. Cross-links run both ways: the local Security pane links to macOS Firewall, Server Security links to Server Firewall, and a pinned server's panes link to both.

SecurityServer Security is strictly read-only — it opens no rules and installs nothing. That is deliberate: a posture scan you can run against a production host without a change window is one you will actually run often, and running it often is what catches the firewall someone left off after a maintenance window. Wire a High finding to an alert channel (Chapter 11) so the scan tells you the moment a host drifts.

10.5Security updates and breach warnings

The Security Updates pane (Security Tools) lists, for this Mac and every linked server, the security fixes that are waiting. Each server reports its own: apt's -security pocket on Debian and Ubuntu, dnf or yum advisories with their CVE numbers on Red Hat–family systems, zypper security patches, FreeBSD's pkg audit, Alpine updates checked against OSV.dev, and Software Update on a Mac. Homebrew doesn't mark security fixes, so its outdated formulae are listed separately. The check reads only, every six hours, as root where a sudo password is saved; the one thing it changes is apt's package lists when they are over a day old. Linux and FreeBSD servers with a Host Monitor (1.28 or later) run the same check themselves and report through it, with no SSH session or sudo password; Macs are always checked over SSH.

Urgency comes from public sources. A waiting update that fixes a CVE on CISA's Known Exploited Vulnerabilities list turns the server red and alerts at once. OSV.dev supplies the CVEs behind Debian, Ubuntu and Alpine updates; FrontierStack sends it package names and versions only. endoflife.date flags operating systems and runtimes that no longer get fixes (a distribution's own PHP or Python is left to the distribution, which backports fixes). Enfour patch advisories, signed like the breach advisories but with a key of their own, cover urgent cases with the fixed version for each branch. Routine security updates alert only after they have waited longer than you choose, seven days by default.

Automatic Updates… on a server's row opts it in to security-only updates inside a maintenance window: apt installs only security-pocket packages and keeps your configuration files, dnf and yum use --security, zypper installs security patches, FreeBSD upgrades what pkg audit reported, Alpine what OSV lists, and a Mac only the Homebrew formulae an Enfour advisory names (as your user). Each window runs once. Before a run FrontierStack checks free space on /var; afterwards it reports any service that stopped. You can also let fixes for exploited vulnerabilities install straight away, and on a Mac require a recent Time Machine backup first.

SecurityAutomatic updates never restart a server, never install macOS updates and never touch OPNsense or pfSense, whose firmware updater does that job. Saving a schedule, and Install Security Updates Now…, need a real person at this Mac (Human-Presence Approvals), and every run is in the audit log. The AI Administrator can report all of this but cannot install anything. Automatic updates on linked servers are part of Full Fleet.

Breach warnings come from the same signed source as KeyRotate's. When a service people paste API keys into is breached, Enfour publishes an advisory; FrontierStack checks twice a day, verifies the signature, recognises sites built with the service from their pages, shows the vendor's checklist in that service's pane and keeps a Security alert open until you mark it dealt with. The alert also fires when the affected software is installed on this Mac or reported by a server. KeyRotate knows which keys you saved in the service and helps you replace them.

NoteFrontierStack can't see backups on Linux servers, so it can't wait for one there. Take your own snapshot before a window if you need one.

10.6Edge Appliances: NetScaler, BIG-IP and the VPN gateways

The appliances on your perimeter — Citrix NetScaler ADC/Gateway, F5 BIG-IP, FortiGate, Palo Alto PAN-OS, Ivanti Connect Secure, Cisco ASA/FTD, Kemp LoadMaster, SonicWall SMA and SonicWall firewalls — are where most large intrusions of the last few years began: CitrixBleed, the 2026 NetScaler zero-days, the FortiOS SSL-VPN bugs, GlobalProtect, Ivanti's 2024–25 chain, ArcaneDoor, the SonicOS SSL VPN flaw behind the Akira and Fog ransomware attacks. The Edge Appliances pane (Routers & Firewalls, and inside each vendor's catalogue pane) keeps asking the questions those campaigns turned on.

For each appliance it reads the running version and checks it against the vendors' own bulletins, exploited-in-the-wild first, taking into account the features actually switched on — a CVE that needs a Gateway virtual server or DTLS is marked affected but not in use only when the configuration proves the feature is absent; when it can't tell, it assumes the worst. It flags end-of-life branches, configuration the attackers relied on (management on data-plane or WAN interfaces, SSLv3/TLS 1.0, default SNMP communities, no remote logging, unencrypted config secrets, admin accounts with names from attacker playbooks), and the health of virtual servers, HA pairs and certificates. Every finding names the fixed version and the advisory, and lists the vendor's post-upgrade steps, such as NetScaler's session kills after CitrixBleed.

screenshot to be added
Figure 10.2. The Edge Appliances pane: a NetScaler with an exploited-CVE finding, its fixed version and the post-patch steps.Capture: capture: open Routers & Firewalls ▸ Edge Appliances with one NetScaler added and its findings listed

Connecting. Use a dedicated read-only account — a NITRO user bound to the read-only command policy, a BIG-IP Auditor, a FortiOS API user with a read-only profile, a PAN-OS “Superuser (read-only)” key, an Ivanti read-only administrator, a Kemp key with no write rights. Cisco ASA/FTD and SonicWall SMA have no safe read API, so you type the version. Credentials go only over HTTPS and only after the appliance proves who it is: a publicly trusted certificate, or a self-signed one whose fingerprint you compared with the console and approved. If an approved certificate changes, FrontierStack sends nothing and raises a critical alert.

SonicWall firewalls. The TZ, NSa, NSsp and NSv firewalls run SonicOS, and for most of their owners they are the SSL VPN as well (catalogue entry SonicWall Firewall). Add one either way: type the firmware version, or enable the SonicOS API (RFC-2617 Basic authentication) so FrontierStack can also read the model, serial number, WAN-side management and SSL VPN settings. SonicOS lets only full administrators use its API, so there is no read-only account to create; FrontierStack logs in without pre-empting an administrator who is using the web UI, and logs out after every check. The version is checked against SonicWall's PSIRT advisories, exploited CVEs first — CVE-2024-40766 (improper access control in management and SSL VPN, used by Akira and Fog ransomware), CVE-2024-53704 (SSL VPN session hijack) and CVE-2020-5135 (an HTTP request buffer overflow). Two checks are specific to SonicWall. The hardware model's end of support is tracked separately from the firmware: every Gen 6 model is now past it, however current its 6.5.5 firmware. And a reminder asks you to look in MySonicWall ▸ Product Management ▸ Issue List for the firewall's serial number, because configuration backups stored in MySonicWall's cloud were exposed in September 2025; if it is listed, or you can't tell, follow SonicWall's Essential Credential Reset.

Patched is not clean. For a CVE that was exploited before most people patched, a fixed version keeps a reminder — run a compromise check, rotate the credentials the box held, end old sessions — until you mark it handled. For NetScaler and BIG-IP, link the appliance to a fleet server whose SSH host key you have verified and run the compromise scan: a fixed, read-only script built from CISA, Mandiant, Citrix and F5 indicators. A scan that is cut short, or that lacks a tool, says so; it is never shown as clean.

WarningThe bundled advisory data has a review date, shown in the pane. FrontierStack also reads CISA's Known Exploited Vulnerabilities list daily and warns when CISA adds an exploited CVE for one of your vendors that the bundled data doesn't cover — check those by hand against the vendor's advisory.

10.22.1Riverbed SteelHead and SD-WAN gateways

WAN optimizers and SD-WAN gateways sit at the edge too, and they're managed as a fleet, so Edge Appliances covers them. A Riverbed SteelHead, Interceptor or SteelCentral Controller (SCC) connects through the RiOS REST API with a REST access code (Administration ▸ Security ▸ REST API Access ▸ Add Access Code), which FrontierStack exchanges for a short-lived token on every check. It shows model, serial, RiOS version and whether the optimization service is running. Add the SCC rather than each box: one entry then lists every SteelHead the SCC manages with its health and connection, and Alerts fires when one becomes degraded or critical. A single SteelHead's health and alarms aren't in its REST API; read them by SNMP with the Riverbed SteelHead template in Devices, and watch the Health OID there if you want an alert.

Riverbed SteelConnect EX SD-WAN gateways are read through the Versa Director that manages them, at https://director:9182 with a read-only Director account: every organization's gateways with reachability, services status, config sync and critical alarms. Type the Director's release as its version. FrontierStack carries no fixed-version advisory tables for Riverbed or Versa, so the pane says that plainly rather than reporting “no advisories”; CISA's exploited list is still checked against them — it includes CVE-2024-39717, the 2024 Versa Director zero-day.

No longer sold, still monitored. SteelConnect CX — the SDI-130, SDI-330, SDI-1030, SDI-2030, SDI-5030 and SDI-USB gateways, SDI switches and access points, virtual gateways in AWS and Azure — and SteelHead SD (570-SD, 770-SD, 3070-SD) left Riverbed's price list in 2020 but run in plenty of branches. Add the SteelConnect Manager realm that manages them (https://yourrealm.riverbed.cc, or an on-premises SCM) with an SCM account that has REST API access: each check lists every appliance with its model, site and whether SCM sees it online, and Alerts fires when one goes offline. Cloud SCM is Riverbed's public service, so its address isn't treated as an exposed management interface. A medium lifecycle finding links Riverbed's end-of-support notice until you mark it noted; add a SteelHead SD's optimization side as a Riverbed SteelHead entry as well.

10.22.2VPN concentrators and the Citrix estate

The Show switch at the top of the pane narrows it to VPN Concentrators or to Citrix. Besides the gateways above, it covers Check Point Quantum (type the Gaia train and Jumbo Hotfix Take, for example R81.20 Take 166; a fw ver build number is not a Take and never counts as patched), WatchGuard Firebox, Zyxel ATP / USG FLEX, Array AG, OpenVPN Access Server, Juniper SRX, Sophos Firewall and Barracuda CloudGen. Where an appliance's API reports it (NetScaler Gateway today), the summary shows connected VPN users and a finding appears when they reach 90% of the licensed limit.

For Citrix, NetScaler Console and NetScaler SDX are read over NITRO with a read-only account; an SDX also has the NetScaler build of every VPX instance it hosts checked against the bulletins. XenServer / Citrix Hypervisor is read through XenAPI on the pool coordinator with a read-only account, and Virtual Apps and Desktops, ShareFile StorageZones Controller and Citrix SD-WAN take a typed release. NetScaler itself now also reports whether SAML is configured (the precondition for the October 2026 bulletins), unsaved configuration, a licence close to expiry, full disks and NTP sync switched off.

NoteJuniper, Sophos, Barracuda and XenServer have no bundled fixed-version table. The pane says so rather than implying “no advisories”, and still flags every exploited CVE on CISA's list.

VMware host hardware. Add a vCenter Server to watch every ESXi host it manages, or a single ESXi host, with a user holding the built-in Read-only role (approve the host's self-signed certificate in the pane). Each check reads every host's fan, power-supply, temperature, memory, CPU and storage sensors and its connection and maintenance state; a yellow or red sensor, or a disconnected host, raises an alert. Sensors that report no health state are listed but never alerted on, and installing the server maker's CIM providers (Dell, HPE, Lenovo images) gives fuller hardware health. Hosts in lockdown mode refuse direct logins unless the user is on the exception list, so add vCenter instead.

10.7Rogue Device Watch: a hidden mail sender on your network

In August 2025 a couple checked into a hotel in Kobe, connected a computer to the room's network, hid it in a corner and checked out. An accomplice controlled it remotely and sent several hundred thousand phishing mails through the hotel's internet line, so the mail appeared to come from the hotel. The Rogue Device Watch pane (Routers & Firewalls) exists to catch that kind of box. Your Mac cannot see it: guest Wi-Fi isolates clients, and device discovery only sees the Mac's own segment. The router sees every connection, so FrontierStack asks the router.

Outbound mail. Every 10 minutes, for each pinned router with API credentials (OPNsense; pfSense with the REST API v2 package; MikroTik RouterOS; OpenWrt), FrontierStack reads the connection table and keeps, for each internal device, the set of external mail servers it has talked to in the last hour. Port 25 is server-to-server SMTP: a laptop never needs it, a mail server or a spam bot does. Mail apps send through their own provider on 587 or 465, so those ports only count when a device reaches an unusually wide spread of providers. A device that isn't an approved mail server and reaches 5 or more servers on port 25 (adjustable in the pane) raises a Hidden mail sender alert in the Security group. The alert gives its IP, plus the MAC address and hostname from the router's DHCP leases, and the steps: find it by its MAC (the lease list, then the switch port or access point it hangs off), disconnect it, block outbound TCP 25 from guest and LAN networks except your mail server, and check whether your WAN address has landed on a spam blocklist. One stray connection is listed under the router, but never alerts.

RouterWhat is read
OPNsenseFirewall states, filtered on the router by port; DHCP leases (Dnsmasq, Kea or ISC); firewall rules once a day
pfSense (REST API v2)Firewall states filtered by destination port; DHCP leases; firewall rules once a day
MikroTik RouterOSConnection tracking (TCP only, address fields only); DHCP leases
OpenWrtConntrack and DHCP leases over ubus, with the LuCI login
UniFiThe client list the UniFi pane already loads (long-stay check only)

Approved mail servers are entered as an IP address, a range or a MAC address, and never alert. Servers you manage in FrontierStack that run Postfix, Exim, Dovecot or another mail service are offered as one-click suggestions. A scanner that e-mails scans directly is the other usual entry.

Devices that never leave. Under each router, mark its guest networks: pick a name the router reports (an interface, DHCP server or UniFi network) or type an address range. Then turn on Flag devices that never leave a guest network. A client that stays online there for more than 7 days (adjustable) without a break raises a Long-stay guest device alert, because guests come and go. Presence is measured between scans, so a Mac that was asleep or closed never breaks a stay or invents one. The hotel's own equipment on the guest network, such as a smart TV or a room thermostat, is cleared with Acknowledge. The check is off by default.

Policy advice. On OPNsense and pfSense, once a guest network is marked, its firewall rules are read once a day to see whether that network can open TCP 25 to any server on the internet. If it can, the pane recommends a block rule above the one that allows internet access: guests' mail apps keep working on 587 and 465, and a hidden mailer can no longer send. Open Firewall Rules takes you to the router's own page. When an alias decides the answer, or the API shows no rules for that network, the pane says it couldn't tell rather than guessing.

SecurityRogue Device Watch only reads. It never adds, changes or removes a firewall rule; FrontierStack leaves rule edits to the router's own interface, where its validation lives. The router credentials need read access to firewall states, DHCP leases and rules — on OPNsense, the Diagnostics: Show States, DHCP lease and Firewall: Rules privileges.
NoteThe pane is part of Full Fleet; on Standard it is visible and view-only. Throughput spikes and long-term usage alerts for the same routers are in the router's device pane (Chapter 9).

10.8The LAN Compromise Check: a device that has been taken over

On a switched network only the router sees every device's internet connections, so the check reads the connection table of each router Rogue Device Watch can read (OPNsense, pfSense, MikroTik RouterOS, OpenWrt) — on Check now, or every two minutes with Watch the network continuously — and keeps six hours of who connected where. It flags beaconing (new connections to one address on a steady timer), connections to addresses with no domain name on non-web ports, contact with addresses on public threat lists (abuse.ch Feodo Tracker, Spamhaus DROP, Emerging Threats, CINS Army; Tor exits as a weaker sign), unexpected inbound connections from the internet, scanning of remote-login ports, and proxy-like fan-out. Each device gets a worry score out of 100, a plain-language explanation and steps for its own router to cut its internet, move it to a quarantine VLAN or take it off the network — each a rule or network for that device alone. Mark your own port forwards Expected and addresses you know Trust. High and critical devices raise an alert; the AI Administrator ranks and explains them with security_audit scope=lan_compromise. Smart devices check in with their maker's cloud too, so one signal is a reason to look, not proof.

10.9Printer privacy & security audit

A printer's device page has Run privacy & security audit. It asks the printer only what any computer on the network could: make, model and firmware (IPP, SNMP with the factory community, its web page), which services answer, whether its settings pages want a password, whether it hands out its job history with document names, whether it holds stored jobs, faxes or scans, and whether it uses a maker's cloud service. It tests your public address from outside on the printer's ports (through Globalping; switch it off if you prefer) and lists CVEs that mention the model. Every exposing setting is ordered by risk, followed by click-by-click steps for HP, Brother, Epson and Canon to set a password, wipe stored jobs, close remote access and turn off unused services. Nothing on the printer is changed. The AI Administrator runs the same audit with security_audit scope=printer.

10.10Deeper forensics tooling

When a quick scan is not enough, the heavier analysis lives as installable services in the Security Tools catalog category — reveal them with the catalog filter (Chapter 6). Volatility 3 is a memory-forensics framework for examining a RAM capture; capa identifies the capabilities hidden inside an executable; the CAPE and Cuckoo sandboxes detonate a suspicious sample in isolation and extract its configuration and behaviour. Threat-intel services such as URLhaus, OpenPhish and OpenCTI feed your YARA and sandbox rules. SIEM platforms such as Wazuh have their own SIEM & Security Data section, described below.

10.11The EDR Fleet board

If your endpoints already run a commercial EDR agent, the EDR Fleet pane gives you one read-only roll-up across every console. Choose Add Console…, pick a provider and paste its API credentials — stored in the Keychain, never in the AI's view. Endpoint and open-detection counts are pulled from each vendor's REST API for SentinelOne, Huntress, CrowdStrike, Sophos Central, Bitdefender GravityZone and Microsoft Defender for Endpoint; Jamf Protect and LimaCharlie connect for reachability, and any other console can be added as Generic (reachability only). A Fleet totals row sums the lot. The board refreshes every few minutes; a console going unreachable raises an alert under the Security group, with its open-detection count riding along in the alert detail. Open Console jumps you to the vendor's own dashboard for the deep work.

NoteEDR Fleet does not replace your vendor's console — it aggregates the headline numbers so a single board tells you "everything is connected and quiet," and pages you the moment a console stops answering. The counts are best-effort against each vendor's documented endpoints; verify against your own tenant before acting on them.

10.12SIEM & Security Data

The SIEM & Security Data sidebar section separates a security-operations workflow that used to be scattered between Security Tools and Logging. Its SIEM Overview answers the first fleet question: which security platforms and data paths does FrontierStack know about, and are their watched management endpoints reachable? A row becomes configured only when the app has concrete evidence — a saved API credential, a detected local install, or a remote endpoint watch. A saved key is labelled Credentials saved, not Connected; a TCP response is labelled Reachable, not Healthy. This distinction prevents a listening but broken or unrelated service from receiving a false green status.

The section has two layers:

  • SIEM platforms — Wazuh, Security Onion, Splunk, Elastic Security, Microsoft Sentinel, Google Security Operations, Graylog, IBM QRadar, Sumo Logic Cloud SIEM, Rapid7 InsightIDR, LogRhythm, Devo, FortiSIEM and OpenText ArcSight.
  • Security-data pipelines — VirtualMetric DataStream, Cribl Stream, Logstash, Vector, Fluent Bit, Fluentd, NXLog, syslog-ng and OpenTelemetry Collector. These collect, normalize, filter, buffer and route telemetry; they are not themselves necessarily the place where an analyst hunts an incident.

Open a service to choose the right setup. A cloud-only SIEM shows a Connect area for its account/tenant and least-privilege API token, stored in the macOS Keychain, with no meaningless local Install button. A self-hosted or hybrid platform offers its vendor deployment path and a Remote Instance watch for the management console. Collectors with a real Homebrew formula can be installed and controlled locally; Linux/Windows agents and appliances link to their supported packages instead of pretending to be Mac services.

Sources & coverage links the layers rather than merging them. Use EDR Fleet for endpoint-console coverage, Security for host/network detections and intrusion prevention, and Logs for local troubleshooting. The SIEM destination owns full event retention, correlation, hunting and incident response. FrontierStack remains the health and control plane: it keeps credentials local, checks the pieces it can prove, alerts on lost reachability, and takes you to the correct console for the deep work.

SecurityGive FrontierStack a dedicated read-only or monitoring role wherever the vendor supports one. A SIEM often contains identity events, source addresses, detection logic and incident evidence; do not reuse a global administrator token merely to read health. FrontierStack stores the token in Keychain, but least privilege still limits what a stolen or misconfigured integration could do.

10.13Read-only security audits

The fastest way to learn where a host actually stands is the AI's security_audit tool, which runs a comprehensive, entirely read-only sweep on This Mac or any linked server over SSH. It self-detects the OS and checks pending security updates, disk encryption (FileVault or LUKS), the firewall (Application Firewall + pf on macOS, ufw / iptables on Linux), SSH hardening, listening ports, UID-0 and privileged accounts, passwordless-sudo (NOPASSWD) entries, intrusion prevention and recent failed logins. It uses passwordless sudo only where it is available and degrades gracefully where it is not. Nothing changes; you get a prioritised list of findings and specific fixes, which you can then apply yourself or hand back to the AI behind the usual approval card. Set target to a server's name to audit it remotely; omit it for the local Mac.

10.14The Security Audit pane: an exploitable-only auditor in a sandbox

The read-only security_audit sweep above tells you how a host is configured. The Security Audit pane asks a harder question: what here can an attacker actually exploit? It turns a coding agent into an adversarial auditor that maps the target, hunts from many angles — injection, broken access control, authentication and authorization, business logic, cryptography, exposed secrets, SSRF, misconfiguration and chained attacks — then tries to disprove each of its own findings, so what survives is only the issues with a concrete attack path. Every finding carries a scenario and a fix; there is no theoretical noise.

It runs in two modes. Codebase points the agent at a repository or web-project folder and audits the source. Infrastructure audits your own estate from the signals FrontierStack already gathers — Cloudflare zones and their TLS/WAF settings, domain and certificate health, each pinned server's OS, exposed services, remote-access and MDM/Activation Lock/FileVault posture, and the local firewall — assembled into a redacted inventory the agent then attacks.

The whole run happens inside a Sandcastle Docker sandbox, so an adversarial agent pointed at untrusted code never touches your host directly. The app provisions the sandbox image and runner the first time you run an audit (it needs Docker or Podman running); after that, runs start immediately. Findings render with severity badges and can be saved to Obsidian or raised as Alerts for anything critical or high. As everywhere else, only a redacted prompt leaves your Mac — secrets are stripped first — and the sandboxed agent authenticates with your Claude subscription using a token from claude setup-token (or an Anthropic API key).

Before the agent starts, FrontierStack checks for exposed .env files and Git repositories itself — the agent never sees either. In Codebase mode it looks through the folder (a web content folder that isn’t a repository works too; only the agent step needs Git), asks any of your sites that serves the folder for each .env and .git it finds, and flags a .env that is committed or not git-ignored. In Infrastructure mode it requests /.env and /.git/HEAD over HTTPS on every domain it knows, Cloudflare zones included. A catch-all page that answers every address doesn’t count, and only whether a file is served is kept, never its contents. Hits appear under Exposed .env & Git as critical findings.

WarningThe target must be a git repository (Sandcastle snapshots the tree via a git worktree), and a folder containing credential files — .env, private keys, service-account.json — is refused rather than mounted into the sandbox. Audit a clean checkout.
The Security Audit pane: audit a codebase or your infrastructure from a disposable sandbox, authenticated with a dedicated Claude Code token that is never reused elsewhere.
Figure 10.3. The Security Audit pane: audit a codebase or your infrastructure from a disposable sandbox, authenticated with a dedicated Claude Code token that is never reused elsewhere.

10.15Strix: AI penetration testing

The audits so far are read-only: they inspect how a host is configured and where its code might be exploitable. Strix goes further — it runs an active penetration test. From the Strix AI Security Testing section of the Security pane you point it at a repository folder, a Git URL, a domain, a URL or an IP address (or pick one of your linked hosts), choose a depth of Quick, Standard or Deep, and it maps the attack surface, attempts real exploit paths, and writes a penetration-test report.

FrontierStack does this by driving the open-source Strix command-line agent locally on your Mac and reading the run artifacts it leaves on disk — the findings, the run metadata and the report — rather than scraping any hosted service. If the CLI is not installed the section says so and offers an Install Strix… link; Update Strix upgrades it through uv or pipx, never by piping a script into a shell. An AI provider key is optional; when you supply one it is stored in the macOS Keychain, handed only to the local Strix process, and never displayed or sent to any cloud model — the pane shows only whether a key is configured.

The tiles summarise the last run: Critical, High and Medium counts, duration, anything new in the last 24 hours, and any failed scans. A run in progress shows live phase text and a Stop button; when new critical or high findings appear you get a local notification unless Silence alerts is on. Open Findings and Export Report surface the detail, and Re-run Failed Scan and Restart Scan Engine recover from a bad run. Serious findings are treated as sensitive and are never sent to cloud AI. The AI Administrator can drive Strix as well, through strix_status, strix_scan and strix_control, all covered in Chapter 13.

SecurityStrix actively probes its target, so a scan will not start until you tick “I own this target or have explicit permission to test it.” Only ever point it at systems you own or are explicitly authorised to test.

10.16Certificate Sources and TLS

An expired certificate is a self-inflicted outage. The Certificate Sources dashboard gives you one row per issuance stack on the host — Let's Encrypt (via acme.sh), Certbot, Step CA, Traefik and Cloudflare SSL — with expiry read directly from the certificates themselves using openssl. Cloudflare uses the token and zone you configured for its analytics; sources that are not present on this Mac show dimmed. For Traefik you can point the dashboard at its acme.json; for Step CA, at its URL.

For issuing certificates, FrontierStack offers two paths. mkcert creates a locally-trusted certificate — ideal for development on .localhost or LAN names, where a public CA is irrelevant; the Certificates pane's Get action uses it when installed. For anything the public must reach, use Let's Encrypt: the AI's issue_certificate tool runs acme.sh or certbot on This Mac or a linked server, and for the DNS-Cloudflare method it reads a CF_TOKEN vault secret that is injected at run time, never sent to the model. For a commercial certificate, pick GlobalSign Atlas as the certificate authority in the Certificates pane’s ACME section, enter the EAB key ID and HMAC key from the Atlas portal and register once; issuing and renewing then work the same way, and the HMAC key stays in the Keychain.

10.17Mail security

A mail server is two distinct risks: it can be spoofed (someone forges mail as your domain) and it can be abused (it relays mail for a stranger). FrontierStack addresses both, with tools that understand the old Apple Server case where Postfix sits underneath.

  • Anti-spoofing DNS — email_auth_dns builds the SPF, DMARC and (optional) DKIM TXT records: SPF declares who may send for the domain, DMARC tells receivers how to treat failures, DKIM cryptographically signs outgoing mail. With publish=cloudflare it creates the records for you; otherwise it prints the exact records to paste into BIND, dnsmasq or your registrar.
  • DMARC reports — the DMARC Reports pane reads the daily aggregate reports that Gmail, Microsoft, Yahoo and other receivers send to your record's rua= address. Add the IMAP mailbox that address delivers to and FrontierStack checks it every hour, parses the zip, gzip or XML attachments, and shows each domain's pass rate and every server sending as it. The verdict per server separates sometimes fails (a server of yours missing DKIM or SPF on some mail — fix these first) from mail that authenticates only as another domain and mail that isn't authenticated at all (usually spoofing). Reports can also be imported from Suped. Alerts fire when a mailbox can't be read, when your own servers fail more than the threshold, or when a domain stops reporting. Check here before moving a domain from p=none to quarantine or reject; the AI reads the same summary with email_auth_dns action=reports.
  • DKIM keys — generate_dkim_key runs opendkim-genkey on the server for a domain and selector and returns the public key as the TXT record to publish; the private key stays on the server for the OpenDKIM milter.
  • Postfix hardening — harden_mail_postfix applies safe defaults over SSH with postconf: require SMTP AUTH to relay (this closes an open relay), reject unknown and unlisted sender domains, optionally enforce sender/login matching. It reloads Postfix and prints the effective settings.
  • Open-relay test — test_open_relay runs a safe SMTP conversation (EHLO / MAIL FROM / RCPT TO to an external domain, then QUIT without sending) and reports whether the external recipient was rejected (good) or accepted (an open relay — bad).
  • Delivery probe — from a server's Mail Server Policy section, send one tagged test message end-to-end through the relay and read the exact SMTP verdict: accepted & queued (with the queue id), deferred, rejected, or a TLS-certificate failure. This is what distinguishes “accepted then silently dropped” from real delivery — and on a relay addressed by its LAN IP, whose STARTTLS certificate can't verify, a Trust LAN relay option retries over an encrypted-but-unverified channel. On an Apple Server.app box FrontierStack also finds Postfix's real log even when the config leaves it to syslog/ASL, and reads the mail queue and the Server.app /Library/Logs/Mail/ files.
  • Account check — in the Mail Server pane, type in a mail account's POP3, IMAP and SMTP settings and click Check Settings. Each server is tried the way a mail client connects, and each step says what it found: a server name that doesn't resolve, a port that refuses or is silently dropped by a firewall, a security mode that doesn't match the port (SSL/TLS on 110 or 587, STARTTLS on 995, 993 or 465), TLS 1.0/1.1, and a certificate this Mac doesn't trust — with the reason: expired, issued for another name, self-signed or missing its intermediate. It then signs in, reads the message count and logs out, and a refused login shows the server's own reply. Nothing is downloaded, sent or deleted, and the password is never saved. It isn't sent at all when the certificate is invalid or the connection is unencrypted, unless you turn that on.
WarningOn a Mac running the classic macOS Server, Postfix may be managed by serveradmin, which can overwrite main.cf and silently undo a harden_mail_postfix change. Review the result afterwards and, if it reverts, re-apply the equivalent settings through Server.app.

Certificate auto-renewal. A mail server proves its name to Let's Encrypt through DNS, not a web page. Mail Server ▸ Certificate Auto-Renewal checks, for a linked server, whether acme.sh renews the certificate Postfix and Dovecot use through Cloudflare DNS and installs it where they read it; Set Up Auto-Renewal… fixes whatever is missing, using a Cloudflare token limited to that zone's DNS, and renews once to prove it works. The server is then checked daily, with an alert if the certificate gets within 20 days of expiry.

Mailbox sizes. When the mail disk fills up, the first question is whose mail is filling it. Mail Server ▸ Mailboxes ▸ List Mailboxes lists every mailbox on the chosen server, largest first, with the total and Copy as CSV. Where Dovecot can list its users, the sizes come from Dovecot with message counts and quota use; otherwise FrontierStack measures the mail folders on disk, including macOS Server.app's per-user folders, which are shown by account name rather than GUID. It only reads. Linked servers need their sudo password saved so every folder can be measured.

10.18Password AutoFill and Credential Exchange

FrontierStack already keeps the logins for the web pages you administer — a router or printer saved under Routers & Network ▸ Web links, the Synology or QNAP admin account, a server controller in Boot Media, a service sign-in. The Password AutoFill pane (Secrets & Vaults) lets Safari and other apps fill them, so you stop copying passwords out of the app.

  1. Open Secrets & Vaults ▸ Password AutoFill. If the status line says FrontierStack isn't turned on, choose Turn On… and enable FrontierStack in System Settings ▸ General ▸ AutoFill & Passwords.
  2. Under Saved in FrontierStack, choose Offer next to each login Safari may fill. Logins the app doesn't hold elsewhere can be added with Add a Login….
  3. On the device's web page, pick the FrontierStack suggestion (or open the passwords menu and choose FrontierStack), then confirm with Touch ID or your Mac's password.
SecurityThe AutoFill extension holds one keychain group of its own and can read only the logins you offered — never the API tokens, sudo passwords or service keys in FrontierStack's main store. Every fill needs Touch ID or the Mac's password; nothing is filled silently. The copies are this-Mac-only, readable only while the Mac is unlocked, and refreshed whenever FrontierStack starts, comes to the front or the list changes.

Credential Exchange (macOS 26 and later) is the FIDO standard for moving passwords between password managers. In Passwords — or any password manager that supports it — export to an app and choose FrontierStack. macOS hands the data straight across; nothing is written to disk on the way. FrontierStack then shows a review: logins whose address belongs to this network (a known FrontierStack login, a fleet server, a private address) are already ticked, and where FrontierStack has the login but not yet its password, the imported one can fill it. Untick anything you don't want. Passkeys, verification codes, cards, notes and every unticked login are discarded when you finish, and the Audit Log records only counts.

Going the other way, Export to a Password Manager… lets you tick saved logins and send them to another app, after Touch ID or your password; macOS then shows its own sheet to choose the destination.

NotePassword AutoFill needs macOS 14 or later, and a build that includes the AutoFill extension; Credential Exchange needs macOS 26. If the pane says AutoFill isn't available in this build, the copy you are running was signed without the extension.

10.19Who may change things from outside

Everything above hardens the machines FrontierStack looks after. This section is about hardening FrontierStack itself — because an app holding SSH keys, database passwords and cloud tokens for a whole fleet is a more attractive target than any single server it manages.

FrontierStack can be driven from outside through several doors: the MCP server for AI clients, the inbound HTTP control server for webhooks and the mobile panel, App Intents for Shortcuts and Siri, and — when you enable them — agent integrations. Each already carries its own token. Above all of them sit two settings in Remote Control & Lock, and it is worth being clear about which question each one answers.

The App Lock answers what survives a lock. Set a password, lock the app, and the window is covered while every external surface is either blocked outright or held to read-only.

10.22.3Fleet: require a physical security key

A Fleet licence adds Physical security key immediately beside the password-lock settings. Choose Yubico YubiKey, Google Titan or FEITIAN ePass, then enrol the key through Apple's system security-key sheet. FrontierStack stores only the public credential; the private key never leaves the dongle.

Once enabled, FrontierStack starts locked and re-locks when it goes into the background. It does nothing — the window and every external control surface remain gated — until an enrolled key is connected or presented and you touch it. If you also configured an App Lock password, unlocking is two-step: the correct password and a physical-key touch are both required. A missing key never falls back to password-only access.

Register up to three keys and keep at least one backup somewhere separate. The supported families are YubiKey, Google Titan and FEITIAN FIDO2/ePass. On iPhone and iPad, use a compatible USB-C or Lightning key, or present an NFC-capable model when Apple's sheet asks. Removing the policy also requires a fresh touch from a currently enrolled key, so someone with an unlocked session cannot silently weaken it.

WarningDo not enable physical-key lock with only one key unless you accept the recovery risk. FrontierStack deliberately fails closed when the enrolled credential cannot be read or no registered key is available. Enrolling and adding keys is Fleet-only; an already-protected installation continues to accept its registered key after a licence change so a downgrade cannot bypass the lock.

Paired devices and Script Secrets

With a key enrolled, Paired devices need the key too is on by default. Creating a pairing code, pairing KeyRotate and raising a paired device’s permissions — a higher level, the remote shell or AI changes — each take a touch on this Mac. Demoting or revoking a device never does. A phone’s secrets and shell requests are refused until a touch opens a device key session (15 minutes by default). When a phone asks without one, the key prompt appears on the Mac, at most once a minute. Locking FrontierStack closes the session, and Paired Devices shows whether it’s open.

The AI’s Script secrets can be sealed with the key too: Encrypt with Security Key… in AI Administrator stores the values in secrets.env.fsenc, encrypted with a key that only a touch of an enrolled security key can recover (FIDO2 PRF, macOS 26.4 or later). The names stay visible. The values need a touch after each launch or lock and relock after an hour; a script that uses one asks for the touch when it runs. Use Add Backup Key… for every backup key. Keys enrolled before this feature existed must be removed and enrolled again first, and FrontierStack won’t let you remove all keys while secrets are sealed to them.

SSH with a security key. In a linked server’s Edit Settings, Create Security-Key SSH Key… makes an ed25519-sk key on your security key, installs it on the server using the access you already have, and switches the server over only after a test session succeeds. You can optionally remove the old key from the server. Day to day, Open Key Session takes one touch, and monitoring, commands and terminals share that session until it has been idle for the timeout (60 minutes by default, set per server). While the session is closed, that server’s monitoring pauses rather than showing it as down, and nothing in the background ever waits for a touch. Apple’s built-in ssh can’t use FIDO keys, so this Mac needs Homebrew’s OpenSSH — FrontierStack offers to install it. That applies to every server, Linux and Windows included; nothing extra is installed on the server, which only needs OpenSSH 8.2 or later. Stop Using Security Key… returns the server to its previous key.

External changes answers a different question: in an unlocked app, how much must an outside caller do before it can change anything? It applies to every external surface at once — the MCP server, the control panel, Shortcuts and the command line. Three levels. Full auto lets external tools act without asking — defensible only when you trust every connected client and the machine it runs on. Confirm each action, the default, puts an approval panel in front of every change, naming the caller. While a request is waiting and FrontierStack isn’t the frontmost app, its Dock icon keeps bouncing — including after you look away without answering — and stops once the request is answered. The notification for a waiting request carries Deny and Allow once buttons — visible on hover, or permanently if you set FrontierStack to Alerts in System Settings › Notifications. Deny always works from the notification. Allow once asks for Touch ID when human-presence protection uses it, and with hardware-input protection it opens the panel instead, because a click on a notification cannot be told apart from a synthetic one. Timed grants stay on the panel. Calls that only read — a mail-server audit, a DNS record listing — are never prompted. Password required demands your password before an external tool touches a server at all.

The confirm tier has a release valve that matters during an incident. Approving a change offers Allow for session, which grants five minutes — but only for that one caller and that one kind of action. Approving a service restart from an MCP client does not authorise a shell from that client, and does not authorise a restart requested through the mobile panel. The narrowness is the point: repeated prompting during an outage is exactly what drives people to switch to full auto permanently, and a grant that leaked sideways would be worse than the prompting it replaced.

Three properties hold at every level, and they are what make the setting trustworthy rather than merely configurable. Reading is never gated — a monitoring client keeps working whatever you choose, because a dashboard that goes dark during an incident is a liability. Credentials, shell access and FrontierStack’s own settings can never be changed from outside, at any level; those are refused rather than prompted, on the reasoning that a request arriving from a remote tool is simply the wrong origin for reading a password or running an arbitrary command. And session grants are never written to disk: quitting the app or locking it clears them, so a five-minute convenience cannot quietly become a standing permission you forgot you gave.

NoteIf you select Password required without having set a password, external changes are blocked rather than downgraded to a prompt. A strict setting that silently became the weakest one would be worse than no setting at all.

10.22.4Human-Presence Approvals — when the AI can move the mouse

Confirmation panels assume the person clicking them is a person. An AI agent that drives the whole computer (“computer use”) breaks that assumption: it can post synthetic mouse and keyboard events, or press controls directly through Accessibility, and either way it presses Approve exactly like you would — on the very card that exists to stop it. Human-Presence Approvals, in the same Remote Control & Lock pane, closes that route with two levels.

Real keyboard & mouse only examines the press behind every approval. A genuine click or keypress is delivered by macOS with no posting process behind it; a synthetic event carries the posting app's identity, and an Accessibility press arrives with no input event at all. Anything that isn't real hardware input is rejected: the approval card stays open, a note on it says what happened, the event is recorded in the Change Log (naming the posting app when it can be identified) and a notification tells you an automation just tried to approve something.

Real input + Touch ID adds the proof that settles it: every approval also asks for Touch ID (or a paired Apple Watch), with no password fallback — a password is exactly what a synthetic keyboard can type, while a fingerprint is the one thing software on the Mac can never post. Touch ID is asked for even when a security key is enrolled, deliberately: a key left plugged into the Mac sits within reach of the software running on it, and your fingerprint doesn't. Only a Mac with neither Touch ID nor a Watch falls back to a touch of an enrolled security key.

The gate covers every approval decision — script cards, security confirmations, external tool grants, AI-proposed fixes and the App Lock password — and denying never needs proof, so the protection can only ever stop an approval, never keep something running. Two side effects are deliberate and worth knowing: input injected by Screen Sharing, VNC or a KVM counts as synthetic (approve at the machine itself, or use the Touch ID level, which works over Screen Sharing via the Watch); and key remappers such as Karabiner-Elements, or assistive tools that press controls through Accessibility, are treated as synthetic too.

10.22.5KeyRotate: the master copy of your keys

KeyRotate, Enfour's Mac App Store key manager, pairs with FrontierStack at the Companion app (credentials only) level and then holds the master copy of the keys FrontierStack uses: AI provider keys, Cloudflare, hosting, email lists, agent tokens, CLI Proxy's client key, and the key of every service pane and SaaS monitor that takes a single key, such as Firecrawl, Supabase, Shopify or PagerDuty. The Stripe monitor's restricted key and the GitHub, GitLab, Gitea and Bitbucket tokens link only when you choose to, because they are usually narrower than an app's key. While paired, KeyRotate sends each of those keys to FrontierStack and keeps it current, and a key you type into FrontierStack goes back to KeyRotate a few seconds after you stop typing. KeyRotate then rewrites every file it writes that key to. That transfer is a single-use ticket for one account, valid for two minutes, that only the signed companion can redeem. The link that carries the ticket names the account and never contains the value. Script Secrets sync the same way, except any you have sealed to a security key, which are never sent to KeyRotate. Names that change how a script runs, such as PATH, never sync, and a secret you delete in FrontierStack stays deleted.

The first time KeyRotate opens while FrontierStack is running, it offers to import FrontierStack's keys. FrontierStack shows which keys would go to which app, with Deny as the default, and Allow then needs Touch ID whenever the Mac can use it, with no fallback to the password. Only a Mac without usable Touch ID accepts an Apple Watch, an enrolled security key, or failing those the login password. FrontierStack does not have to be open: hidden, or quit to Only Background, its background service starts the app when KeyRotate calls. A phone can never make this request, even at Full control, and every send is recorded in the audit log.

Rotations through KeyRotate. When the AI Administrator rotates a key with the credentials tool and KeyRotate is paired, it asks KeyRotate to do it by default, so the new key reaches every file KeyRotate writes it to rather than only FrontierStack. FrontierStack opens a keyrotate://rotate link that carries only the account name and a single-use ticket; KeyRotate acts only after confirming that ticket over its signed, pinned connection. KeyRotate applies its own rules — an active subscription, and Touch ID when it is locked, with the prompt naming FrontierStack as the asker — sends FrontierStack the new key, rewrites its other target files when its automatic-update setting is on, and reports back to the waiting tool. The old key is never revoked. Pass via: frontierstack to rotate here instead. Any stored key can be rotated: automatically where the vendor’s API issues a replacement (with the key itself or a stored admin key), otherwise by hand — FrontierStack or KeyRotate opens the vendor’s key page and verifies the new key you paste. When a stored key appears in a prompt to the AI Administrator, it offers to rotate it; outside AI tools over MCP and the CLI (frontierstack keys, frontierstack rotate <service>) are told to offer the same when they see a leaked key.

NoteKeyRotate only pairs with a FrontierStack that is running and signed by Enfour. It asks before accepting a pairing link it did not request, because any app can open a keyrotate:// link.

10.20Agent login with auth.md

Passwords are the worst credential to automate, so FrontierStack never asks you to paste a long-lived one for a third-party service. Instead it discovers auth.md — an open specification (originated by WorkOS) that a service can publish at https://<host>/auth.md to tell AI agents how to sign in on your behalf. A service's Connect ▸ Login Automation (auth.md) disclosure, and the AI's check_authmd tool, fetch that public file and summarise the advertised flows (agent-verified or user-claimed), scopes and OAuth endpoints — or report that none is published. The grant itself happens at the service and issues a short-lived, revocable, scoped token; FrontierStack stores no password. Cloudflare and Firecrawl publish an auth.md today, with more services appearing.

10.21The signed-request trust model (FS1)

FrontierStack's own control surfaces — the local control server, the MCP server, and the remote fsagent — are protected by a bearer token over TLS. A token alone, though, is a shared secret: replayable, and no proof of who is calling. The FS1 signed-request scheme adds a second factor on top. Every request is signed by an approved per-device Ed25519 key; the server keeps an allow-list of public keys and rejects anything signed by a key it has not explicitly approved. A leaked token then controls nothing on its own — this is the HTTP equivalent of the SSH keys your fleet already trusts.

Each request carries the device's key id, a timestamp, a random nonce and a signature over a canonical string. The server verifies the key is approved, the timestamp is within a 60-second window, the nonce is unseen (claimed only after the signature checks out, so a bad signature cannot burn nonces), and the signature is valid. The same scheme is implemented identically in the macOS app, the Go agent and the iOS client, pinned by a cross-language test.

You manage devices in the Paired Devices pane, in the Overview group of the sidebar (it used to live inside this Security pane). Each paired phone or tablet shows its label, key fingerprint, last-seen time, a scope picker and a Revoke button. Pairing is meant for one or two people with a couple of devices each — enrolment is capped at four — and each device carries a scope:

ScopeRead status & logsRestart servicesFleet opsTools / CLI / scripts
readOnlyYes———
restartYesYes——
operateYesYesYes—
fullYesYesYesYes

The same section holds the per-surface Require request signing switches for the control and MCP servers. Roll-out is deliberately gentle: the servers accept a token or a signature while signing is optional, with a bootstrap exception so you can enrol the first key with the token you already hold — turning on enforcement can never lock everyone out.

Two further per-device controls sit on each row. Allow AI Administrator (on by default, at any scope) governs whether that one phone may talk to the AI at all — you can let a trusted handset chat while blocking another, and the switch only ever restricts: even with it on, the AI still requires the app unlocked, a signed device, and a full-scope "Allow changes" for anything that mutates. Allow remote shell is offered only at full scope and is off by default; it is the explicit grant a phone needs to open a command-line shell and to install its own SSH key on your servers for direct access when this Mac is offline. If a handset is lost, Secure lost phone blocks the device and its older queued actions at once, closes its sessions, strips its direct-SSH keys from reachable servers and deactivates its push token; offline servers stay listed so you can finish the cleanup when they return.

Bluetooth pairing fallback. When a new phone cannot reach this Mac over Wi-Fi or Tailscale — a locked-down guest network, client isolation, a captive portal — enrolment can still complete over Bluetooth. Turn on Allow Bluetooth pairing (off by default) and the Mac advertises a short-lived GATT service only while the Pair dialog is open; the phone scans the same one-time QR code and runs the identical signed-enrolment handshake, just carried over BLE instead of HTTPS. Because the FS1 signature is transport-agnostic, the Bluetooth path inherits the same trust guarantees without a TLS channel.

Reaching the Mac from anywhere. Out of the box, a paired phone reaches the Mac only while both sit on the same network. If no Tailscale is detected on the Mac, the Paired Devices pane recommends installing it: with Tailscale on the Mac and the iOS Tailscale app on the phone or iPad, both signed into the same tailnet, pairing keeps working from anywhere — the Mac keeps a stable private address, traffic stays end-to-end encrypted, and no router ports are opened.

SecurityPair each device at the lowest scope that does its job — a phone that only needs to bounce a stuck service should be paired at restart, not full. Once every device is enrolled, turn on Require request signing for both servers (and require_sign on agents). After that a leaked or screenshotted token controls nothing, because the caller must also hold an approved private key. Revoke a device the moment a phone is lost or a person leaves.

10.22Hardening the headless Mac

A display-less server has its own security trade-offs, and the Headless Setup tool (covered fully in Chapter 8 and Chapter 17) surfaces the one that matters most here: its System Status section warns when FileVault is on, because an encrypted Mac with no keyboard or screen cannot be unlocked at boot — it will sit at the FileVault prompt instead of coming back online. For a headless box you generally choose between full-disk encryption and unattended restart, and FrontierStack makes that choice explicit rather than letting you discover it after the next power cut. Enabling Screen Sharing or Remote Login on such a host is exactly the kind of exposure the Open Ports watch will then keep an eye on.

Headless Mac Setup: the current state of FileVault, Time Machine and every sharing service, with a warning where a setting would stop an unattended Mac coming back after a power cut.
Figure 10.4. Headless Mac Setup: the current state of FileVault, Time Machine and every sharing service, with a warning where a setting would stop an unattended Mac coming back after a power cut.
11

Chapter 11

Monitoring & Alerts

A continuous health sweep watches every service, device and subsystem you care about, and turns the first sign of trouble into a message on the app you already check.

A control panel that only lets you change things is half a tool. The other half is knowing when something has gone wrong — ideally before it becomes an outage. FrontierStack runs a continuous monitor sweep across everything you have told it to watch and turns the first sign of trouble into a message on whatever channel you choose. This chapter covers the Local Health board that summarises it all, the Alerts pane that raises and delivers warnings, the messaging gateways that carry them, and the specialised monitors for cloud services, project tools, power and storage.

11.1The Local Health board

Open Overview ▸ Local Health for the single screen that answers "is anything broken right now?" Every monitored service, device and subsystem appears as a row marked UP or DOWN, grouped by area — web and database services, the fleet, sites and certificates, disks, UPS and SNMP devices, connected cloud accounts. At the top sits a one-line summary in the form X up / Y down, so you can take in fleet-wide status in a glance without reading every row.

Groups are collapsible, but any group containing a failed item opens automatically. Select the history button on a row for its last 30 checks, measured response-time sparkline, exact rolling observed uptime over 24 hours, 7 days and 30 days, and recent transitions. Coverage sits beside each uptime value: app-off, paused and out-of-network time is unknown, never guessed as healthy. Fleet-wide Events retains at most 1,000 first observations, outages and recoveries for 31 days without storing endpoints, credentials or response bodies.

The board is the same data the AI Administrator reads through its get_server_health tool: ask it "what's down?" and it reports exactly what this screen shows, then offers to investigate before suggesting a fix (see Chapter 13). The sweep runs about every sixty seconds; each DOWN item is also attributed to the pane that owns it, which is why a red count capsule can appear on a sidebar row and on the Dock icon — you are told where the trouble is, not just that there is some.

screenshot to be added
Figure 11.1. The Local Health board: grouped UP/DOWN rows with an "X up / Y down" summary at the top.Capture: open Overview &#9656; Local Health with a mix of healthy and one or two down items across services, fleet and certificates

11.2The Alerts pane: what is watched

The Alerts pane: monitoring of critical services switched on, intrusion alerts, the reboot-grace window that suppresses alerts during a quick reboot, optional &ldquo;back to normal&rdquo; notifications, and Maintenance Windows that hold notifications during planned work.
Figure 11.2. The Alerts pane: monitoring of critical services switched on, intrusion alerts, the reboot-grace window that suppresses alerts during a quick reboot, optional “back to normal” notifications, and Maintenance Windows that hold notifications during planned work.

The Local Health board shows status; the Alerts pane (Overview ▸ Alerts) decides what is worth a message and sends it. Switch on "Monitor critical services and alert me" and the sweep starts raising alerts. What it watches:

  • Site & service health — HTTP/loopback checks, TCP ports, and deeper protocol probes (an SMTP/IMAP login, a database SELECT 1, an LDAP bind) so a service that is listening but actually broken still trips. The MySQL probe additionally reads the connection pool (current use vs max_connections and the "too many connections" refusal counter): it alerts when the pool passes 90% or when clients were refused between sweeps, and every sweep is charted as Connection Health History in the Database Health pane — pool % over time with red lines marking refusal bursts and outages.
  • Linked servers — every fleet host's SSH endpoint is reachability-checked each sweep (a bare TCP connect, no login attempt), so a server that is completely off raises a plain "Server down" alert — and a "Server recovered" when it returns. This is separate from the SSH cool-down notice, which fires only when a host is up but rate-limiting connections.
  • Certificates & domains — TLS expiry across the whole fleet, plus registrar / DNS / SSL checks that warn you days ahead rather than on the morning a domain lapses (Chapter 7).
  • Disks filling up — a volume crossing its free-space threshold, surfaced from the Disk Health monitor below.
  • Security exposure — a new open port or unexpected listener, a VPN tunnel drop, or a critical SSH-hardening failure while SSH is reachable from the network.
  • Failed payments & billing — connected paid services (OpenAI, Anthropic, Cloudflare, Google Cloud) returning insufficient-quota, low-balance or auth errors — the symptom of a lapsed card.
  • Connected cloud services — live monitors for Stripe, Shopify, Freshdesk, SendGrid and more, firing when a metric you chose crosses its threshold.

Most checks are threshold-based, so you decide what "trouble" means: alert when a certificate is within N days of expiry, when open tickets pass a number, when a disk crosses a percentage. Conservative thresholds turn a post-mortem into a heads-up. The pane also offers "Alert on intrusions" — new fail2ban/CrowdSec bans, high-severity Suricata signatures and notable Wazuh alerts (level ≥ 7) are messaged as they happen, and existing history is never re-alerted.

SwitchBot devices. Pinning a SwitchBot device watches it through the SwitchBot cloud. Plugs are read every 2 minutes and get the Wi-Fi-unstable warning; locks, sensors, curtains, Bots, lights, Hub 2/3 and other devices that report status are read every 10 minutes and alert when SwitchBot says the device, or the hub it connects through, is offline. Cameras and Hub Mini report no status and are never shown as offline. To stay inside SwitchBot's 10,000-calls-a-day quota the intervals lengthen automatically when many devices are pinned; the quota is per account, so each account is budgeted separately. A pinned SwitchBot device's dot is green only after its own status check has answered, and stays grey while it is unchecked or has no status. Turn on Receive SwitchBot webhooks in the SwitchBot pane and give it Internet access (Cloudflare Tunnel, Tailscale Funnel or a router forward), and Indoor Cam and Pan/Tilt Cam report each motion detection, shown as last active. Pan/Tilt Cam 2K and the Plus models send no webhooks. A quiet camera is never reported offline.

Several SwitchBot accounts. A token only lists the devices added to its own account, so a home someone else owns and shares with you is reached through their token. Add it under Other Accounts in the SwitchBot pane. Commands and checks for each device use the account that lists it. SwitchBot's API has no rooms, so Group by sorts devices by the hub they connect through, by the Place you pinned them to, or by account.

TipThree settings keep alerting low-noise. When something recovers, FrontierStack by default removes the warning notification it answers rather than adding a second "back to normal" banner beside it — so a CPU spike that has passed stops showing a stale warning instead of leaving you two notifications to dismiss. The recovery is still written to the alert log and the change log, still closes any on-call page, and still goes out over your gateways; turn on "Show back to normal notifications" if you would rather see an explicit all-clear on this Mac. A reboot grace means a target must stay down for the grace period before a "down" message is sent, so a server that is merely rebooting never pages you; reboots you trigger from inside the app are paused automatically for about ten minutes. And if several VPN-dependent services drop together while the VPN is down, you get one "VPN down" message instead of a flood. Use Send Test Alert and Check Now to confirm both wiring and thresholds before you rely on them.

11.3Messaging gateways

An alert is only useful if it reaches you. The Alerts pane lets you enable several gateways at once and list multiple recipients per channel, so the right people are reached on the app they already have open. Paste a bot token or webhook URL, send a test, and you are live. With KeyRotate paired, the Telegram bot token and the LINE channel access token stay in step with it: a token rotated in KeyRotate is used for the very next alert, and KeyRotate can issue LINE's 30-day tokens by itself. The AI Administrator can enumerate the enabled gateways with get_messaging_channels and send through them with send_notification (Chapter 13).

GatewayBest for
TelegramA bot token; multiple chats per gateway. Fast, free, reliable phone push.
LINE (Messaging API)Reaching people who live in LINE, especially in Japan and Korea.
Slack / DiscordIncoming webhooks into a team channel; route ops alerts where the team already talks.
ntfySimple phone push via the public server or your own self-hosted ntfy.
AppriseOne extra hop that fans out to 80+ destinations (Pushover, Matrix, Gotify, Microsoft Teams, PagerDuty and many more).
Email (SMTP)Anything that must land in an inbox; also carries the scheduled AI evaluation reports.
SMS / WhatsAppReaching a phone directly, via Twilio or the WhatsApp Business Cloud API.
Slack/Discord webhooksPersistent team-visible history of every alert and recovery.
KakaoTalkA "send it to me" alert for KakaoTalk users.
iMessage (Apple Messages)A native "send it to me" alert straight from your Mac — no external service.
PagerDuty / Opsgenie (paging)Real on-call paging with escalation — see below.

11.18.1Paging the on-call (PagerDuty, Opsgenie, urgent ntfy)

The message gateways above are fire-and-forget text. The paging channels are different in kind: they are stateful. When a monitored item goes down, FrontierStack triggers an incident keyed to that item — PagerDuty (an Events API v2 routing key) or Opsgenie (a GenieKey) then runs your escalation policy, pushing, texting or phoning whoever is on call until someone acknowledges. When the item recovers, FrontierStack resolves the same incident automatically. Because the incident is keyed per item, a flapping service updates one incident rather than paging the rotation over and over, and nobody is woken for an outage that has already ended. Without an on-call service, the ntfy gateway's Page on down toggle sends "down" alerts at ntfy's maximum priority — a louder, repeating tone that overrides many phones' quiet settings — while recoveries and reports stay at normal priority. Each paging channel has a Send Test Page button that triggers a real incident and auto-resolves it about ten seconds later, proving the whole escalation path end to end.

11.18.2Telling someone else: contacts, presets and escalation

The channels above reach you. Many incidents also need someone else: a supervisor who wants an email, a second support person, or the technician who has to go to the site. Alerts ▸ Contacts & Escalation handles this in three parts.

PartWhat it is
ContactsPeople other than you, each with a name, a role (Supervisor, On-site technician…) and the addresses you will use: email, mobile number (texts and phone calls), WhatsApp, Telegram chat ID, Messages handle, ntfy topic or LINE user ID.
PresetsReusable recipes that say who gets told, by what method, and when. Each step names a contact, one or more methods, a delay, and whether it is urgent. A preset can also carry instructions added to every message, such as “Go to the server room, B1 rack 3”.
RulesWhich alerts use which preset: every alert, a category (Storage, Network & Routing…), a location, or one monitored item. Every matching rule applies, and anyone named by two rules is told once.

For example, the preset Email the supervisor, page the on-site tech sends the supervisor an email and gives the technician a text and a phone call that reads the alert aloud. Tech now, supervisor if not fixed in 30 min is an escalation: the supervisor's step runs only if the item is still down 30 minutes later and nobody has pressed Acknowledge. Pending escalations are listed in the section and in the Alerts palette (Ack), and each one is cancelled automatically when the item recovers. People who were told something broke are told when it is fixed; nobody gets a phone call for good news, so an all-clear goes by text instead. Choose New Preset ▸ Start from a template to use a ready-made preset. It adds a blank contact for each role you don't have yet. Test sends every step at once, marked TEST, with delays ignored. On a pinned camera, router or other device, the offline-alert switch has a Who else gets this alert… button: it lists who besides you is told, and opens this section with a rule for that device already filled in, so you only pick the preset.

Contacts use the gateways you have already set up, with their own address in place of yours. Emailing a supervisor uses your SMTP account, and texts and calls use your Twilio number, which must be able to make voice calls. Those gateways can stay switched off for your own alerts. Each message states the contact's role, the location, and the preset's instructions, so the person understands why they received it. A missing address or an unconfigured gateway appears in Delivery Errors as, for example, SMS → Alex (On-site technician). A network failure is retried twice, two minutes apart, before it is reported.

IFTTT. Turn on IFTTT (Webhooks) in Messaging Channels to fire an IFTTT applet on every alert: value1 is the title, value2 the message and value3 is critical for a down alert or info otherwise. Give down alerts their own event name to trigger something louder, such as flashing lights, than a recovery does. A contact can also have their own Webhooks key, so a preset step fires an applet on their account. IFTTT's Webhooks service needs an IFTTT Pro plan.

Tokens and webhooks live in the macOS Keychain and never leave your Mac. You can also send a scheduled AI Evaluation Report: the AI Administrator composes a summary from your live monitored health (running read-only diagnostics) and emails it daily or weekly, or pushes it to all enabled channels — with an optional fuller report whenever two or more critical items are down at once.

SecurityAlert delivery is one of the few things FrontierStack does entirely on your Mac. Bot tokens, SMTP passwords and webhook URLs are stored in the Keychain; iMessage and KakaoTalk go through your own logged-in account. Nothing about your fleet's health is relayed through a FrontierStack server.

11.4Delivery errors and how to fix them

A monitor is worthless if its alerts silently fail to send. FrontierStack verifies every send: when a gateway fails, it is recorded in the Delivery Errors section of the Alerts pane with plain-English fix-it guidance, the raw error underneath, and a Fix button that scrolls straight to the misconfigured channel's settings. A red badge appears on the sidebar's Alerts row and on the Dock icon so you actually notice, and it stays until you clear it. The AI Administrator reads the same list through get_alert_errors, so you can simply ask "why aren't my alerts arriving?"

The common causes are mundane and quick to fix:

SymptomLikely cause & fix
Email rejected at sendA blank SMTP From address, or a missing recipient — fill both in the Email channel.
Email connection refused / times outWrong port or transport; match your provider (587 STARTTLS or 465 SSL) and host.
Telegram / Slack / Discord 401 or 404A bad or revoked token / webhook URL — paste a fresh one and send a test.
Reports never arriveReport delivery is set to "Email only" but no Email channel is configured — switch to "All enabled channels" or set up Email.
NoteDelivery-error capture covers the curl-based gateways (Telegram, Slack, Discord, ntfy), Email and Apprise. WhatsApp, KakaoTalk and iMessage are best-effort: they may not surface a precise error, so test those explicitly with Send Test Alert after setup and after any account change.

11.5The on-host Service Watchdog & database health

The monitors above run on your Mac. For a critical server you also want a watchdog that lives on the box itself, so it keeps working when your Mac is asleep, offline, or simply not the machine that failed. FrontierStack's Service Watchdog is deployed with the host monitor (Chapter 8): it health-checks a service on a short interval, restarts it when it fails, and — as a last resort, and only when you have allowed it — reboots the machine, with a minimum-interval guard so a still-broken service can't cause a boot loop. Each watch has a check type: a process check, an HTTP or TCP probe, or a purpose-built MySQL or PostgreSQL check. When the whole server wedges while each service still looks fine — SSH stops answering or the network is lost — Lockup reboot in the same panel reboots it from the inside; see Chapter 8.

11.18.3A recovery ladder for pinned servers

The pinned server's Service Watchdog panel can add two opt-in steps after ordinary on-host service recovery. Reboot from FrontierStack lets the Mac issue one verified reboot after a new Recovery exhausted event. You choose the delay. If a controllable outlet is linked in Power Control, the next step can power-cycle the server after it remains completely unresponsive for the chosen period. FrontierStack waits 90 seconds after the reboot attempt before judging the host, and the power timer has a five-minute minimum.

The hard-power test is deliberately stricter than a failed SSH login. The Mac must have a healthy network path, and the server must have no SSH response, no healthy monitor report, no ping or ARP evidence, and no response on the common service ports. Any sign of life cancels that incident. A power cycle runs once, then the ladder stops. Old watchdog events are marked handled when you enable the policy, and watchdog_reboot_suppressed remains final, so the app cannot defeat the helper's boot-loop protection.

11.18.4Keep watching while the Mac is closed

A wedged server cannot reliably operate its own smart plug. Choose a different enrolled server under Recovery observer to put the last step on that machine's helper. The observer keeps probing the target by private IP, ping, and several TCP ports even when FrontierStack is closed. It first confirms that the private power controller answers its status request, persists an anti-loop receipt, cuts power for the configured dwell, restores power, and performs no second cycle until it has seen the target alive again. A persisted 30-minute cooldown also survives an observer restart.

SecurityThe recovery observer must be a different, always-on server with an updated directly enrolled helper. The delegation confirmation enables Allow actions and Allow reboot within that helper's locally installed authority ceiling; setup stops if either authority is unavailable. Delegation sends only the target's private IP, probe ports, timer, and selected power-controller settings. It sends no shell access or target-helper credential. For Home Assistant, the observer needs the selected entity and its token; the helper stores that narrow policy in its protected root or system state. Generic HTTP controllers also need a status URL, because the observer will not cut power unless the controller itself proves the observer's network path is working. Target and controller addresses must be literal private, link-local, or VPN IP addresses. Test the setup during a maintenance window before treating it as unattended recovery.
NoteDisk repair is an automatic safety hold. Disk Utility First Aid, fsck, xfs_repair, chkdsk and similar filesystem tools can temporarily stall every service on the system disk. Both the local Service Guardian and the on-host Service Watchdog recognise those repair processes and pause automatic recovery — including service restarts and remote reboot escalation — without changing your saved policy. Failure counters are cleared, and recovery waits another 60 seconds after repair ends before starting fresh. The desktop and phone show the hold. A manually confirmed service control remains available if you deliberately need it.

The database Heartbeats catch failures a process/port check misses. A MySQL Heartbeat asks for SELECT 1 without a password. Success or “access denied” proves that MySQL answered; a refused, timed-out or saturated connection is unhealthy. No MySQL password is stored and no tables are read. A blank probe name becomes the non-root fs_watchdog, which need not be a real account. A PostgreSQL Heartbeat uses pg_isready without a database username or password. With error-log early-warning switched on, the watchdog also tails the database's own error log and raises a critical event the first time it sees a corruption signature. Because all of this runs on the server, it can alert you autonomously over ntfy or a webhook even while your Mac is off; turn that on with Alert me directly from this server in the host's Service Watchdog panel.

NoteBecause the Heartbeat connects without a password, MySQL denies the login and counts every check in Aborted_connects — about two a minute, several thousand a day. Nothing is wrong: the server is healthy and the check is doing its job. But the counter fills with the Heartbeat's own traffic, which can hide a real signal such as a brute-force attempt or a misconfigured app. The MySQL Heartbeat panel offers an optional fix: create fs_watchdog@localhost and [email protected] with an empty password and no privileges at all (USAGE only — the account can read nothing and cannot connect from off the server), so the probe logs in cleanly and is counted as an ordinary connection. FrontierStack creates it only when you ask, using the MySQL administrator password you saved in Database Health, and shows the exact CREATE USER statements before running them; you can copy the SQL and run it yourself, or remove the account later from the same panel. Leaving it alone is a fine choice — the count is cosmetic.
SecurityThe password-free MySQL Heartbeat is fully configured, but it does not check tables. For scheduled mysqlcheck integrity scans, verified backups and optional auto-repair, choose Open table checks & auto-repair in the watch or open Database Health, then expand the database's Scan & repair settings. Use a dedicated account such as frontierstack_health@localhost, never root. Grant USAGE for login and SELECT 1; add PROCESS only for fleet-wide connection visibility and SELECT only on schemas you explicitly inspect. Restrict the account to localhost or the monitor's exact private address. FrontierStack runs the client on the server, so there is no reason to expose MySQL to the wider network.

To create a check-only account, replace your_database and the example password:

CREATE USER 'frontierstack_health'@'localhost' IDENTIFIED BY 'use-a-unique-random-password';
GRANT SELECT ON `your_database`.* TO 'frontierstack_health'@'localhost';

Save that login in Database Health. Leave auto-repair off until both a manual check and verified backup succeed. If a complete backup or repair needs another privilege, add only the schema-scoped privilege MySQL names; never use *.*. For a monitor connecting from another machine, replace localhost with that one exact private address.

The pinned server's Services row shows a green DB checker: On dot while scheduled table scans or server self-heal are active, Paused when a target exists but neither is running, and an orange Needs login instead of green when a selected MySQL scan has no database password. Database Health and the Heartbeat are complementary: the former checks tables on a slower schedule, while the latter detects outages quickly and can restart MySQL on the server.

When a database isn't down but is slow or stuck, the Why slow/stuck? button on each target in the Database Health pane answers it on demand: it reads the server's live activity (SHOW FULL PROCESSLIST on MySQL, pg_stat_activity on PostgreSQL), groups the running queries by shape so a burst of the same query collapses to one line with a count, and states the verdict — a single query hammered in a burst, a long-runner blocking others, connections waiting on a lock, oversized result sets streaming to clients (the bandwidth cost), or connections near the ceiling. A useful subtlety: if the load is bursty it may read idle between spikes, and the tool says so and tells you to re-run during one, rather than falsely reporting all-clear. Remote targets are probed over SSH, so no database port need be exposed.

WarningThe local Service Guardian (Overview ▸ Service Guardian) is a different thing: it guards services on this Mac only, and only while the app is running. For a remote server, use its on-host Service Watchdog — the Guardian pane says so and points you there.

11.18.5Database replicas (slaves)

If a pinned server's database copies its data from another server, Database Health watches the copy. Each database has a Replication section, and each MySQL/PostgreSQL row on a pinned server has a Replication menu. Choose Detect automatically (the default, checked hourly), Replica (slave) of another server, or Not a replica. A replica is checked every two minutes: MySQL with SHOW REPLICA STATUS (the login needs REPLICATION CLIENT), PostgreSQL through its WAL receiver and logical subscriptions, and Redis with INFO replication. When a replica stops, can't reach its source, or falls further behind than its limit (300 seconds by default), a Replication alert goes out on your messaging channels. In the sidebar, the replica's database icon becomes a stack with a dotted copy, and turns orange when the replica is out of sync and red when it is broken. Hover over any icon on a server row to see what it is.

You don't have to create the MySQL login yourself. When none is saved and FrontierStack can be root on the server, it creates a read-only account, frontierstack_health, with a random password kept in the Keychain. The latest result appears under the database on the pinned server's page. If a replica stopped with Temporary file write failure, a big ALTER ran out of room in a small /tmp: Fix Temp Space… opens a script that moves InnoDB's temporary files to the data disk and restarts the replica.

11.18.6When this Mac has no internet at all

A Mac that wakes from sleep before Wi-Fi has rejoined, or that has simply lost its connection, would otherwise see every device, server and site fail at once and raise an alert for each. Before every sweep FrontierStack confirms that the internet answers, by checking that well-known hosts respond on TCP 443 and retrying once a few seconds later. If nothing answers, it shows a single No internet connection notification and pauses all device and service checks. It re-checks every 30 seconds and resumes on its own when the connection is back, then removes that notification rather than posting another. Device states are held as they were, so nothing flips to down and back. The pause and resume are written to the alert log.

11.18.7Pausing checks for maintenance

A watchdog that restarts things is exactly what you don't want while you are deliberately taking a service down. Rather than switching protection off — and relying on yourself to remember to switch it back on — use Pause Checks… in the Guardian's header, or the pause button on an individual service row. Choose a window from 15 minutes to a day.

While paused, the Guardian stops health-checking and stops restarting whatever you paused, so your work doesn't fight it. Nothing is disabled and no setting is lost. Keep Alive, Auto Recover, thresholds and intervals are all left exactly as they are, and checking resumes on its own when the window ends — or immediately, if you press Resume Now. A pause never survives its own window, even if you quit and reopen the app.

TipThe same pause is available from your phone, in the companion app's Checks screen — useful when you are working on a machine and not sitting at the Mac. Pausing counts as a change, so the paired device needs permission to control services; a read-only device cannot silence a watchdog.

11.6Case study: the High Sierra Server.app serviceproxy wedge

Old Macs still running macOS Server (Server.app) on High Sierra have a well-known failure: the web front proxy — the launchd job com.apple.serviceproxy, which binds ports 80/443 in front of the real backend — occasionally wedges. It keeps accepting TCP connections but never answers them, so every website behind it goes dark while every process check still looks healthy. There is no fix from Apple; the stack is end-of-life. The Service Watchdog was built with exactly this case in mind.

How to set the watch up. On the server's pane, add a watchdog entry for the service name serviceproxy and — this is the important part — give it an HTTP check with the target http://127.0.0.1/, not a process check. The HTTP probe is the only check that sees the real failure (connections accepted, no answer); on failure the watchdog heals it with launchctl kickstart, which is precisely the manual fix an admin would type. Any HTTP status below 500 counts as alive (a 403/404 from the proxy still proves it is answering); each probe times out after 6 seconds, so a wedged proxy fails the check by timing out. The backend behind the proxy can be watched the same way as server-httpd.

Timings that work well. Check every 30 seconds; restart after 3 consecutive failed checks; try up to 3 restarts; leave the post-restart grace at its default (~20 s, generous enough for Apache on old hardware). That confirms a wedge for ~90 seconds before acting — long enough that one slow response or a momentary load spike never triggers a kickstart, short enough that sites are back about two minutes after a real wedge, hands-off. If the sites are critical, tighten to a 15–20 s interval with 2 failures (≈40 s to confirm) — going tighter than that mostly buys false restarts, because a genuinely slow old box can take a few seconds to answer under load. Leave “Reboot the server if recovery still fails” off unless the machine is truly unattended: a kickstart resolves the wedge in practice, and reboot-as-last-resort on a box like this mostly adds downtime (the anti-boot-loop guard enforces at least 30 minutes between watchdog reboots regardless).

Why not a process check? There is no process named serviceproxy — the job runs as httpd with a special config — and monitors older than v1.6.1 read a healthy proxy as permanently “down” because of that, restarting it over and over and, if reboot escalation was allowed, rebooting a healthy machine on a schedule. From v1.6.1 the monitor asks launchd for the job's real state instead, so a process check now tells the truth; the HTTP check remains the one that catches the actual wedge. If an older server of yours has been rebooting with no visible cause, check its monitor version first — and note that “Why did it reboot?” attributes watchdog-initiated reboots explicitly (with the reason, on v1.6+ monitors; older monitors leave a stamp that is still reported).

NoteThe permanent fix is to retire serviceproxy altogether: the Migrate Setups ▸ Apple Server (Chapter 8) inventories a Server.app machine and moves its websites to a plain Apache on a supported system, taking the wedge-prone proxy out of the serving path. Until then, the HTTP watch keeps the old box honest.

One guarantee closes the loop on delivery: an alert is never silent. On top of the messaging gateways, every state-change alert also raises a native macOS notification and push, independent of the gateways — so even with email off and every channel disabled, a service going down still reaches you on the Mac. Database recovery — running mysqlcheck/pg_amcheck and the AI-guided rebuild — is covered in Chapter 5.

11.7Incidents, on-call and status pages

For teams that already run formal incident response, FrontierStack connects to the tools you use rather than replacing them. Each has a live pane reached from its catalog entry: paste a read-only API key and it shows current state.

  • Incident management & on-call — PagerDuty (open and high-urgency incidents, who is on-call, services), Opsgenie (open/unacknowledged alerts, with a US/EU region toggle), incident.io and Rootly (active incidents).
  • Status pages — Statuspage (unresolved incidents and components that are down) and Better Stack (monitors up / down / paused).

Set up the key in each pane (for example PagerDuty ▸ Integrations ▸ API Access Keys) and the pane confirms the connection. These feed the same monitoring picture, so an open PagerDuty incident or a down status-page component shows alongside your own health.

11.8SaaS live monitors & project-management panes

FrontierStack does not stop at infrastructure. A config-driven SaaS live monitor watches connected cloud accounts and refreshes every few minutes. Each service has a credentials form, live metric tiles, an "Alert me" toggle and a threshold; alarmable services raise a DOWN alert when the metric crosses the line, and the rest are watched for reachability. Live monitors include Stripe (disputes needing response, balance), Shopify and WooCommerce (open orders), Adobe Commerce and Magento — on-premises, on Cloud Infrastructure and as a Cloud Service, all through the same V1 REST orders API (orders awaiting action; the Cloud Service authenticates through Adobe IMS) — Freshdesk and Zammad (open/pending/overdue tickets), SendGrid, Mailgun and Postmark (bounces and blocks), GitHub Copilot (inactive seats), and identity providers Okta and Microsoft Entra ID. Pin a service to make it always-on-Local-Health regardless of its alert setting.

Engineering and compliance services are covered the same way: Sentry (new unresolved issues in the last 24 hours), Grafana and Grafana Cloud (firing alert rules), Honeycomb (triggered triggers), New Relic (active issues), Make (invalid scenarios and incomplete executions), MongoDB Atlas (open alerts), Vanta and Drata (failing compliance tests), CircleCI and Buildkite (failed builds in the last 24 hours), and Netlify and Render (a site or service whose latest deploy failed). Each needs only a read key; the pane says which permission to give it.

Ahrefs (API v3, Lite plan or higher) is watched without spending your allowance: the monitor reads only the free usage endpoint and alerts when this month’s API units pass 90%, and fetches Domain Rating once a day if you give it a domain.

The GMO group’s services have their own monitors. Color Me Shop (カラーミーショップ) reads today’s, this week’s and this month’s sales with an OAuth token from an app you register at developer.shop-pro.jp, feeds the Sales Channels dashboard, and alerts when orders pile up waiting to ship. GMO Trust Login is checked through its SCIM endpoint — give the monitor its own SCIM IDP entry, because generating a credential on one that Entra ID already uses breaks that sync. GMO Aozora Net Bank shows account balances and can alert below a yen floor; with the OAuth client ID, secret and refresh token it renews its 30-day access token itself, and the free sunabar sandbox lets you try it first. GlobalSign needs no key: it watches the Atlas ACME directory, GlobalSign’s status page and a domain’s live certificate.

Microsoft and Veeam on your own network. The Active Directory monitor watches on-premises domain controllers without an agent. It finds them in DNS and checks their Kerberos, LDAP and SMB ports, their sync state, the clock difference from this Mac and their LDAPS certificates. With a plain domain user it also reads each DC’s inbound replication and counts locked-out accounts, over LDAPS or StartTLS only. Microsoft Entra ID alerts when Entra Connect stops syncing, when an app registration’s secrets are about to expire, when a subscription lapses and on Microsoft 365 service interruptions; the same app registration imports users in the Accounts pane. Veeam Backup & Replication, Veeam Backup for Microsoft 365 and the Veeam Service Provider Console show job results and alert on failed jobs (and, for Backup & Replication, repositories under 10% free). A self-signed Veeam certificate is refused, and nothing is sent, until you approve its fingerprint.

The dedicated GitHub pane adds account and repository totals, Actions-related work, PRs, requested reviews, assigned issues, unread notifications, API requests remaining and release-asset download counts from the five most recently updated repositories. Its Installed app permissions section watches the GitHub Apps you name (GitHub won’t let a token list them) and raises a Security alert when one asks for more access than you last reviewed — a new permission, read-only raised to read & write, or a new owner. It is read-only: accepting or declining stays on github.com. Anthropic account/model monitoring and GitHub Copilot seat usage need only their API credentials; no host or port is invented for a cloud-only service.

AppSignal has a dedicated read-only live connection. Enter the application ID and a personal API token; the token is stored in Keychain and FrontierStack uses AppSignal’s GraphQL API to show open error incidents, active uptime alerts, the latest deploy and available last-hour error/latency metrics. The alert threshold combines open incidents and uptime alerts. AppSignal requires its API token in the GraphQL URL, so FrontierStack constructs the URL privately and never writes the authenticated URL to logs. For deeper investigation, add the AppSignal preset in MCP Servers: it opens AppSignal’s hosted MCP through a version-pinned OAuth bridge, without copying the monitoring token into an AI client. Keep AppSignal access read-only until you have reviewed any write-capable tool.

Paessler PRTG has a dedicated live connection for both a self-hosted PRTG core and PRTG Hosted Monitor. Open the PRTG service, enter its HTTPS base URL, and create a Read access scripting key under Setup ▸ Account Settings ▸ API Keys. FrontierStack stores the key in Keychain, reads a bounded sensor-status table, and shows Up, Down, Warning, Paused and other sensor totals. Turn on Alert me when this needs attention to feed Down sensors and sensors without a connected probe into Alerts. The integration never acknowledges alarms or changes devices, sensors or probes. PRTG Network Monitor and Enterprise Monitor run their core service on Windows; use the linked Windows server and vendor installer, or use Hosted Monitor. Remote Windows probes and multi-platform probes extend collection into the rest of the fleet.

NinjaOne, Atera and Site24x7 also have dedicated read-only live connections. NinjaOne uses a Client Credentials application with Monitoring scope to summarise devices, offline endpoints, active alerts and running jobs. Atera uses a targeted API key limited to Agents and Alerts. Site24x7 exchanges a read-scope Zoho refresh token in the account's regional data centre and reads current monitor states. Their secrets remain in Keychain, responses are size-bounded, and none of these connections patches endpoints, runs jobs, closes alerts, starts maintenance or changes vendor configuration.

NoteFrontierStack already handles recurring scripts, scheduled app actions, maintenance windows, live CPU/memory/disk/load, service health, incident connectors and protected credentials. The current release does not yet provide an RMM-style patch approval ring, long-range capacity forecast, full VM lifecycle console or fleet-wide credential-expiry inventory. Those are product-roadmap items rather than capabilities hidden behind these vendor connections.

The same pattern gives project-management tools live token-login panes: Jira (open / unassigned / blocked / in-sprint counts), Linear, monday.com, OpenProject, Plane and Taiga. These are dashboards rather than alert sources, but they put your team's workload in the same window as the servers that run it. Email delivery has its own unified Email Delivery pane that combines transactional-provider metrics with SPF/DKIM/DMARC checks (Chapter 7).

11.9Queue Operations

Queue Operations is a read-only dashboard for RabbitMQ, Kafka, NATS/JetStream, Redpanda, AWS SQS, Azure Service Bus, Google Pub/Sub, Celery/Flower, Redis Streams, Apache Pulsar and Apache RocketMQ. Add one monitor for each broker, namespace or cloud account. FrontierStack shows queue or consumer-group names, ready and in-flight counts, consumer counts, lag, dead-letter counts and oldest-message age when the provider exposes them. It never reads or stores message bodies.

Client and administration ports are kept separate. For example, RabbitMQ clients use AMQP on 5672 while its management API normally uses 15672; NATS clients use 4222 while monitoring normally uses 8222; Pulsar clients use 6650 while its HTTP admin API uses 8080. Keep monitoring endpoints private. Use TLS and a monitoring-only account whenever the dashboard is not reached through the on-host FrontierStack monitor.

For a linked server, select its installed monitor and FrontierStack asks the credential-free helper for bounded summaries over the signed connection. Cloud providers use their normal local CLI profiles or a scoped credential saved in Keychain. Critical thresholds join the Alerts sweep, the same sanitised summaries are available in the iPhone/iPad app, and the AI Administrator can answer queue-health questions through the read-only get_server_health tool. The dashboard has no purge, delete, publish, acknowledge or replay action.

SecurityDo not expose RabbitMQ Management or the NATS monitoring port directly to the public Internet. Restrict them to localhost, a private network or a protected reverse proxy. Queue credentials belong in Keychain; message content does not belong in FrontierStack at all.

11.10UPS monitoring and SNMP devices

Open Power Control and use its UPS section for battery-backup monitoring. FrontierStack reads USB UPS devices directly from macOS power sources, queries NUT with upsc, and queries APC devices through apcupsd with apcaccess. These paths cover APC, Eaton, CyberPower and Vertiv, including Liebert models, as well as other devices supported by macOS or NUT. NUT can also expose serial and network UPS devices.

NUT is free, open-source software and requires no subscription. Status reads need no API key, so the NUT service pane intentionally has no API-credential or Plan & Cost card. A dedicated NUT command login is only needed when you opt into reviewed UPS controls; paid support or hosted dashboards are separate products.

The same pane supports switchable Raritan / Legrand Xerus PDUs. Add the private HTTPS address, the number printed on the outlet, and a dedicated account limited to outlet control; its password stays in Keychain. FrontierStack reads the exact outlet state and genuine active-power sensor when present, supports On and Off, and uses Xerus's atomic cyclePowerState method for Cycle. It refuses public addresses, embedded credentials, redirects and arbitrary JSON-RPC methods. Off and Cycle show a fresh destructive-action confirmation, and the AI Harness receives the same confirmation gate.

Aviosys IP Power units (9258 family, 9820, 9850, 9858, 9255) ship with Windows-only utilities, but every model answers the same local web commands those utilities send, so FrontierStack drives them from the Mac with nothing to install. Add one as Aviosys IP Power with its address, the outlet number printed on it and its login; the password stays in Keychain and is sent in a header, never in a URL. You get status, On, Off and the unit's own timed power cycle, which restores the outlet even if it powers the network path back to this Mac. The original 9258 firmware numbers its outlets from P60; FrontierStack recognises it from the unit's reply and switches the right outlet. Change the factory login (admin / 12345678) — the unit's web commands accept whoever knows it.

Each row shows the readings supplied by that model: charge, estimated battery runtime, load, real power in watts, input and output voltage, battery voltage, frequency and temperature. A watt value reported by the UPS is shown directly. If the device reports rated real power and load percentage but not current watts, FrontierStack shows a value marked estimated. It does not treat volt-amperes as watts.

Turn on Alerts, then set the charge, runtime and load thresholds. Utility-power loss, low runtime, low charge, high load, a battery-service warning, forced shutdown and communication loss are tracked separately. This means a falling-runtime alert can arrive after the first on-battery alert instead of being hidden by the existing outage. A disconnected unit remains visible as Comms lost. Pin a UPS to keep its overall health in Local Health and on the Places map. The NUT and apcupsd install buttons add those optional tools when needed.

Battery shutdown rules can now carry out the whole orderly sequence: wait until the UPS has been on battery for a chosen time or falls below a charge threshold, stop named managed services and VM services in order, verify each stop, and shut down the protected host last. A failed verification halts the ladder with the host still running; returning utility power cancels the unfinished stages. If PowerChute Network Shutdown should be running on the host, FrontierStack can detect common service names or accept a manual declaration, alert separately when it disappears, and either stop or continue the configured fallback.

NoteSaving and enabling a battery-shutdown rule authorises it to act automatically during an outage. Test the entire sequence with the actual UPS and protected services before relying on it.

A scan waits for NUT and apcupsd to answer. While it is running, Stop abandons the wait, keeps readings already found and pauses automatic refresh until you press Refresh.

A server or ordinary pinned device has two separate setup dialogs in its Power section. Add power control… is for the switchable path: a SwitchBot Plug, a configured Home Assistant, Shelly, Tasmota, private HTTP, Raritan PDU, Anker SOLIX, TP-Link Tapo / Kasa, Meross or Smart Life / Tuya outlet, a command-based PDU, or a power-capable Remote KVM. The dialog also links directly to the SwitchBot, Home Assistant, Anker SOLIX and TP-Link Kasa/Tapo provider panes; providers configured natively in Power Control open there. Add backup power… is for a pinned monitored UPS, Mini DC UPS, or Unmanaged / dumb UPS. Treat a PDU as a controller: assign every physical outlet its printed number in Power Control, then select that named, numbered outlet for the server or device. A pinned PDU is also offered for command-based control, whose exact outlet number and commands are entered directly in the server's Power section. SwitchBot remotes and sensors are excluded. A protected device may have both a smart plug and a dumb UPS. A device marked as a Smart Plug is itself a power controller, so its pane omits the entire Power section rather than offering another controller. A linked monitored UPS contributes real battery, runtime and warning status. Unmanaged choices take maker and model notes and remain inventory-only, so FrontierStack and the AI Harness expose no invented readings or controls. TREEDIX is available for its 5 V Raspberry Pi UPS controller as a Mini DC UPS.

Smart-plug brands. TP-Link Tapo and Kasa plugs and power strips are added in Power Control as TP-Link Tapo / Kasa and switched on the local network: enter the plug's address and the TP-Link ID it was set up with, then choose Find outlets — each strip outlet is its own entry. TESSAN, BN-LINK, Edison Smart, OHMAX and MEAPUXIN plugs and strips are white-label Tuya devices: connect the Smart Life pane, then add a Smart Life / Tuya outlet and pick the device and outlet (plugs set up in a brand's own app must first be re-added in Smart Life). A Smart Life power-cycle also starts the outlet's own countdown, so it powers back on even if it feeds the router. Onvis and Matter Amazon Basics plugs are reached by sharing them to Home Assistant's Matter integration and adding the Home Assistant switch. Shelly plugs of every generation (Gen 1 relay API and Gen 2/3/4 RPC) switch directly.

Meross plugs and strips. Add an outlet of type Meross with the plug's private IP address. Meross signs every local request with the account's device key, so enter the Meross account email and password and choose Get key from Meross account once: FrontierStack signs in to the Meross cloud, keeps the key in Keychain and signs out again, and the password (and any verification code) is never saved. You can paste a key you already have instead. Then choose Find outlets. MSS110, MSS210, MSS305, MSS310 and MSS315 plugs and MSS420, MSS425 and MSS620 strips are switched on the local network — on, off and power-cycle, watts on the metering MSS305, MSS310 and MSS315, and one outlet or a whole strip (strip watts are for the whole strip). Device Discovery recognises Meross plugs; the plug's device pane has Add to Power Control.

Shelly relays, plugs, strips and meters. Add an outlet of type Shelly with the device's private IP address. Every generation works: Gen 1 (Shelly 1/1PM/2.5, Plug S, EM, 3EM) and Gen 2, 3 and 4 (Plus, Pro, Mini, Plug S Gen3, Plug US, Power Strip, Pro 3EM). If the device has a password, enter it — Gen 1 also takes its login name, Gen 2+ always use admin — and it stays in Keychain; Gen 2+ authenticate with HTTP Digest, so the password itself never crosses the network. Find channels reads the model, generation, firmware, each channel's name and whether Matter is on; channels count from 0. A meter without a switch (Pro 3EM, PM Mini) is watched for watts but not switched. Power-cycles arm the device's own flip-back timer with the “off”, so power returns even when the outlet feeds the router this Mac reaches it through. A Gen 4 Shelly can be in Apple Home through Matter at the same time; FrontierStack keeps using the local interface and both stay in step. A Shelly with no password gets a warning. Device Discovery recognises Shellys by MAC block, _shelly._tcp or name and offers Add to Power Control.

Battery alerts. SwitchBot locks, keypads and sensors, Nuki locks with their keypads and door sensors, Seam locks and Zigbee devices report their battery. Each one shows the level and alerts twice: when the battery gets low (20 % by default) and again when it is almost dead (5 %). Set both levels in Alerts ▸ Device Batteries, which also lists every level FrontierStack has read. A pinned SwitchBot Hub Mini, Hub or Hub Plus alerts when it goes offline, checked through a device that connects through it.

Outlet reachability. In Power Control, edit an outlet and turn on Alert when this outlet is unreachable. FrontierStack checks the outlet every 2 minutes with a read-only probe and alerts after 2 missed checks in a row. It does this only while this Mac is on the same physical network, identified by the router's hardware address, where the outlet last answered. A laptop away from home, or on a network that reuses the same addresses, is never told its plugs are dead. For plugs this Mac can't reach, use the Shelly Cloud pane (IoT). Paste the authorization cloud key and server address from the Shelly app, add each device ID, and turn on the bell for offline alerts. When a Shelly is watched both ways, the local check wins while you are on its network.

  1. In Power Control, add one outlet record for each physical PDU socket you want to use. Give it a useful name and enter the number printed beside that socket; for example, Rack server · Outlet 4.
  2. Open the pinned server or device, expand Power, and choose Add power control…. Configured outlets appear by name and physical number. Select the exact outlet feeding that device.
  3. If no configured outlet is available, choose Add a smart plug or PDU in Power Control…. FrontierStack opens the setup pane so you can supply the controller's private IP address or URL and add its outlets; it does not create an empty PDU link.
  4. If a PDU with an address is already pinned but has no native FrontierStack outlet integration, select it under Command-based PDU / powerboard. Enter that device's outlet number plus the reviewed On and Off commands in the server's Power section. The commands are configured there, not in the selection menu.
  5. Choose Add backup power… separately for a UPS. A pinned UPS appears there because it describes the device's backup supply; it is not the switchable PDU outlet.

Do not link the server to the PDU as a whole when individual outlets can be identified. FrontierStack includes the outlet number in the row label and in destructive-action confirmations, so the operator can verify the physical socket before an Off or Cycle action.

11.11Remote KVM platforms and power

The Remote KVM pane records multiple PiKVM, JetKVM, TinyPilot, NanoKVM, Raritan Dominion, ATEN, Vertiv Avocent, Lantronix Spider/SpiderDuo, Adder, GL.iNet, AWERAY and generic KVM-over-IP appliances. Each record keeps its exact model or firmware, can be pinned, and opens its private browser console; AWERAY records launch the selected companion app.

Power control is exposed only when a reviewed path is configured. PiKVM uses its documented local ATX API and checks that ATX is enabled, idle and in the expected current state before sending a hard action. JetKVM uses the shared MQTT connection with one exact base topic: it reads the retained ATX state before a short or long press, while its DC extension uses explicit ON and OFF messages; commands use QoS 1 and are never retained. TinyPilot and NanoKVM power hardware, and the enterprise vendors' PDU integrations, differ by model and firmware, so those records remain console/inventory-only unless an explicit private endpoint is supplied. A Raritan PDU associated with a Dominion target should use the reviewed Xerus entry in Power Control. KVM Off and Cycle require fresh confirmation in both the pane and AI Harness.

11.12Home Assistant entity monitors (Beta)

If Home Assistant already runs your building, FrontierStack can watch what it sees. Open the Home Assistant service pane, enter its URL and a long-lived access token, and the Entity Monitors section appears. Press Load Entities from HA, pick an entity, and give it a rule: numeric (is above / is below) for a temperature, humidity or power reading, or text (equals / is not) for a binary sensor's on/off, wet/dry or home/not_home state. Each watch becomes an ordinary Alert, checked on the usual sweep.

This is the right home for the sensors that can never be pinned as devices. A Zigbee leak sensor under the server-room floor, a Z-Wave door contact on the rack, a Bluetooth thermometer — none of them has an IP address, so none can be pinged. Home Assistant already speaks their protocols, so their readings arrive through it. Home Assistant 2026.9's shared Modbus bus access extends the same idea to solar inverters, PDUs and energy meters: HA polls the bus and FrontierStack reads the named values, rather than the two products fighting over one serial connection.

Two deliberate behaviours. An entity reporting unavailable or unknown raises its alert instead of being skipped — a leak sensor that has gone quiet is exactly the one you need to hear about. And the monitor is read-only by construction: it never calls Home Assistant's service API, so it can read your building but cannot switch a light, unlock a door or open a valve. Switching stays in Power Control, where every action is explicit and confirmed.

Unavailable devices. Rather than watching entities one by one, turn on Alert when any device becomes unavailable. Once a minute FrontierStack reads every entity in the domains you choose and alerts on any that Home Assistant marks unavailable. An entity that is merely unknown (no value yet) doesn't count, and nothing is reported offline while Home Assistant itself is unreachable. Alert after (default 10 minutes) keeps short blips and HA restarts quiet. If many entities fail together (more than 30% or more than 50), you get one alert, "Home Assistant: N devices unavailable", instead of dozens, because the cause is usually the same: HA restarting, a Zigbee/Z-Wave bridge down, or the network. Use Exclude (or the button on each row) for retired devices you haven't deleted from HA.

The same connection powers Import from Home Assistant in Device Discovery: the network devices HA tracks, listed with the names you gave them there, pinned in one click — individually or all at once. Imported devices behave exactly like scan results, with health checks, Places and licence limits applying as normal, and anything already pinned filtered out. Both features are marked Beta while Home Assistant 2026.9's device-registry API settles; importing full registry detail (areas, models) waits for that.

For anything else that speaks SNMP — managed switches, printers, network UPSes, NAS units — the SNMP / OIDs section of a device's detail pane queries it directly. Choose legacy SNMPv2c or SNMPv3; the recommended v3 profile uses SHA authentication with AES privacy. Passphrases remain in Keychain and are passed to net-snmp through an owner-only temporary configuration file, never command arguments. Pick a built-in template (System, Host Resources, Interfaces, Printer RFC 3805, UPS RFC 1628, Synology, QNAP, APC PowerNet) and press Query for a label-and-value readout, or fetch a single custom OID by hand. You can also watch an OID: set a comparison and threshold and FrontierStack polls it and raises an alert when the condition is met.

11.13Eve accessories

Eve (Eve Systems, formerly Elgato Eve) makes the Eve Energy smart plug and sensors such as Eve Room, Weather, Degree, Door & Window, Motion and Water Guard. Eve has no cloud or network API, and macOS keeps HomeKit to Apple's own apps, so FrontierStack reads Eve accessories through the same Home Assistant connection. Add them to Home Assistant with the HomeKit Device integration, or share them from the Eve or Home app as Matter devices; they stay in Apple Home either way. The Eve service pane then lists every Home Assistant device made by Eve, with on/off and watts, temperature, humidity, air quality, door, motion, water and battery.

Add to Power Control turns an Eve Energy into a Home Assistant outlet. You can switch it (with confirmation), see its watts, and link it to the server it powers for power-cycle recovery. The alert-rule menu on each accessory adds one-click rules, such as above 35 °C, water detected or battery below 15 %, as entity monitors. The bell raises an alert when the accessory drops off the network or its battery runs low. Reading Eve devices uses Home Assistant's template API, which needs a token from an administrator account.

11.14Zigbee and Z-Wave devices

Offline alerts. On the Zigbee pane, click the bell on a device (or Alert on All) to be alerted when it drops off the mesh. With Zigbee2MQTT this needs availability turned on in Zigbee2MQTT's settings. Without it the pane shows an orange note, because FrontierStack can't tell a quiet device from a dead one, and it never guesses. deCONZ reports reachability for lights. Watched devices are checked every minute, even with the pane closed.

The Zigbee pane also watches Z-Wave nodes driven by Z-Wave JS UI. In Z-Wave JS UI, enable the MQTT gateway (Settings ▸ MQTT) on the same broker Zigbee2MQTT uses and keep Retain on. Then turn on Z-Wave JS UI via MQTT in the pane's Z-Wave section and enter the same prefix (default zwave). Each node shows as alive, awake, asleep or dead; ring its bell to be alerted when it goes dead. A sleeping battery node is normal and counts as up. If the gateway is offline, has not reported, or the last read is more than five minutes old, every node shows as unknown and no alert fires — FrontierStack never reports an unknown state as offline.

The same SNMP profile is used by Device Discovery, Network Path and PoE monitoring. PoE writes use SNMPv3 when the configured user has write permission; SNMPv2c keeps its separate per-switch write community. The AI Harness can inspect the non-secret profile, read numeric OIDs from pinned devices and list PoE state. Its write tool has no arbitrary OID operation: it is limited to reviewed PoE on/off/cycle actions, needs changes enabled and pauses for a fresh visible manual confirmation.

SMLIGHT coordinators. Network Zigbee/Thread coordinators from SMLIGHT (SLZB-06, SLZB-07, the SLZB-MR series) run SLZB-OS on an ESP32 and can't host FrontierStack's monitor, so the Zigbee pane reads them over the LAN instead: add the coordinator's IP address or .local name. Every two minutes it reads the model, firmware, radio role, connection, temperatures and uptime, and alerts when the coordinator stops answering, when it runs hot, or — the failure that matters most — when no Zigbee2MQTT, ZHA or Thread border router is connected to its radio socket, the state in which the box looks fine but every sensor in the house is about to go unavailable. SLZB-OS has no HTTPS, so it is only read on private addresses.

11.15Music Assistant

Music Assistant is the Home Assistant team's music server: streaming services and local files in one library, played on AirPlay, Google Cast, Sonos, Squeezebox, Snapcast and DLNA speakers. When it fails, nothing crashes — a streaming login expires, an upgrade breaks a speaker integration, a speaker drops off the network — and nobody notices until the music doesn't start. Open the Music Assistant service pane (Home Automation), enter the server URL (usually port 8095) and a long-lived access token from Music Assistant ▸ Settings ▸ Profile.

On every Alerts sweep the monitor checks three things: that the server answers and accepts the token; that no music or player provider has failed to load or needs signing in again; and that the speakers you switched to Alert when offline are still available. Speakers are opt-in because phones and laptops come and go all day. The monitor only sends list commands, so it can never start playback, change volume or edit settings.

Service Scan and Discover Services recognise a Music Assistant server on port 8095 from its /info response and show its version, rather than guessing from the port alone.

11.16Disk, RAID and SMART health

Drives fail with warning if you are listening for it. The Disk Health pane (a built-in monitoring tool) combines several layers. Volume space and Time Machine status are always shown. With smartmontools installed (a one-click Install button), each physical drive is enriched with deep SMART attributes — health, temperature, power-on hours, reallocated and pending sectors, and predicted-failure flags — visible per drive with a Check button and a Details sheet for the raw report. A drive trips an alert on a SMART failure or on concerning attributes (reallocated/pending sectors or a predict-fail), not only on outright death.

Software AppleRAID sets (mirror, stripe, concat) appear in their own section with level, status and per-member state; an alert fires when a set is degraded or a member drops offline. Under Alerts & Thresholds, switch on disk alerts and they route to your channels exactly like every other monitor.

NoteOld hardware Apple RAID Cards are not supported by current macOS — those disks present as a single drive, so FrontierStack cannot see the array. The pane states this so you are not misled into trusting a card-based mirror it cannot monitor. Internal NVMe drives may also return no SMART data without elevated access.

Taken together, these monitors give you one board to glance at, one pane to tune, and one set of channels to reach you on — and an AI Administrator (Chapter 13) that reads the same health and sends the same notifications on your behalf. The host monitors that feed fleet-wide CPU, memory and GPU metrics into this picture are covered in Chapter 8.

11.17Packages & containers that misbehave

Package managers install things that then run on their own — a Homebrew service, a global npm tool, a pip-installed server, a Docker container — and nothing tells you when one of them starts eating a core or keeps falling over. FrontierStack watches them on this Mac every 30 seconds. It works out which package each busy process belongs to from where its program lives (Homebrew's Cellar, node_modules, site-packages, gems, ~/.cargo/bin), reads docker stats and each container's last exit, checks macOS crash reports and brew services, and flags:

  • Too much CPU or memory — over your thresholds (CPU counts like Activity Monitor, 100% = one core, summed over all of a package's processes), or a container at 90% of its memory limit;
  • Crashes recorded in the last 24 hours, and containers killed for running out of memory or exiting with an error;
  • Restart loops, failing health checks, and brew services stuck in an error state.

Problems appear in a Needs Attention section at the top of the Docker, Homebrew, Node.js, Python, Ruby and Rust panes, with a badge on the package's own row, and in the Server Activity window on This Mac's Overview, where the tile also tints. The Activity window's Processes tab names the package each process belongs to, and its Docker tab flags troubled containers on every server, not just this Mac. Ignore stops watching one package.

To be told rather than having to look, turn on Alerts ▸ Packages & Containers. Choose the CPU and memory thresholds, how many minutes high use must last before it pages (a build pegging a core for a minute is normal), and whether resource use, failures or both should alert. Alerts then travel through your channels, contacts and escalation rules like any other, appear in Local Health under Packages & Containers, and badge the pane that owns the package.

NoteThe watch only looks; it never stops, restarts or uninstalls anything. Use the pane's own buttons, or the Activity window's Processes tab, to act on what it finds.

11.18The Server Activity window

When you want to watch every box at once rather than configure one, open Monitors ▸ Server Activity Window (⇧⌘A, or the gauge button in the toolbar). It is a separate window holding only your pinned servers and the pinned devices that can report live state — routers and firewalls, UPS units, PoE switches, mining rigs, KVM consoles and smart plugs — and none of the rest of the app. Each tile shows the metrics you asked for with a sparkline and a status dot, and turns orange or red when something needs attention.

Layouts decide what is on the board: the built-ins are All Servers, Macs, a compact Cluster grid sorted by CPU, Mining Rigs & GPUs, Network & Power, AI Agents, Durable Objects and Everything. Customise a copy or make your own — kinds of target, a server filter, individual members, the metrics and their order, tile size, grouping, sort and the sampling interval. Readings come from the FrontierStack monitor where one is installed and otherwise from one SSH round-trip; sampling runs only while the window is open.

TabWhat you can do
OverviewKPIs, usage charts (live, or 24 h / 7 d from the monitor), network and temperature charts, system facts, top processes, posture chips.
ProcessesSort, search, kill or force-kill.
Servicessystemd / launchd / OpenRC / FreeBSD rc.d: start, stop, restart, enable, disable.
DockerContainers with live CPU, memory, network and block I/O; logs; start, stop, restart, remove; images; Create Container… and Install Stack….
PodmanShown where the server has Podman. The login’s rootless containers and, when FrontierStack can use sudo, root’s containers, each marked with who runs it: live CPU, memory and network, logs, and start, stop, restart and remove.
containerdShown where containerd runs with nerdctl or ctr (on a Docker host only when nerdctl is installed or the server is a Kubernetes node). Every namespace except Docker’s own. With nerdctl: live stats, logs, start, stop, restart and remove; with ctr alone, the list and each container’s state. Kubernetes’ k8s.io containers are read-only with logs, because the kubelet owns them. containerd answers only root, so save the server’s sudo password or allow passwordless sudo.
Apple ContainersApple's container CLI on a Mac host: what is running, start and stop, logs. Hidden on Linux and Windows hosts, where the CLI does not exist.
KubernetesRead-only cluster health where the host has kubectl: nodes and pods with a dot each, and the context they came from.
FilesBrowse, edit text files, drag-and-drop upload, download files or folders, new folder, delete.
Ports · Logs · TerminalListening ports and connections; the log viewer; an in-window terminal with several sessions.
Users · Packages · Cron · FirewallThe same remote-management tools as the server pane. On a Mac the Packages tab is named Homebrew, since that is what a Mac actually uses. On FreeBSD, Packages uses pkg; OPNsense and pfSense are upgraded only through their own updaters.
PowerReboot (or reboot via the monitor when SSH is wedged), plug / PDU / KVM power, PDU commands, linked UPS, Wake-on-LAN.
screenshot to be added
Figure 11.3. The Server Activity window: pinned servers as tiles with CPU, memory and network sparklines, grouped by server type.Capture: capture: Monitors ▸ Server Activity Window with the All Servers layout, at least six servers sampled for a minute so sparklines have data, one tile showing an orange warning tint. 1400x900, light mode.

The window is meant to be driven from the keyboard. Arrow keys move the selection through the board or the list, with up and down stepping a whole row of tiles; ⌘↑ and ⌘↓ jump to the first or last target; ⇧⌘0 returns to the board; and esc steps back out — detail, then board, then closing the window. ⌘1 to ⌘9 switch straight to a layout, ⌥⌘← and ⌥⌘→ cycle through them, ⌘E edits the current one and ⌘⌫ hides the selected target from it. ⌘F focuses the filter, ⌘R samples now, ⌥⇥ moves between a server’s tabs, ⌘T opens a terminal window, ⇧⌘O opens the selection in the main window, ⇧⌘K runs one command on every server, and ⌃⌘S shows or hides the list. Press ⌘/ for the full map at any time.

Run on All… runs one command across every server in the layout. Devices have their own detail: gateways and IDS alerts for a router, battery and voltages for a UPS, per-port control for a PoE switch, hashrate and shares for a rig, console and power for a KVM, state and watts for a plug.

A server’s Web Traffic tab, next to Overview, is the Web Traffic pane for that one server: FrontierStack finds its Apache or Nginx access logs over SSH and shows requests, visitors, error rate, top pages, referrers and bots for the range you pick. The same view is in the main window — choose the server in the Web Traffic pane’s Host picker, or press Traffic on the Apache or Nginx row of a server’s Services. Root-only logs need the server’s password saved under SSH & root access.

The Web Traffic pane reading a sample Apache access log: requests, unique visitors, data served and error rate for the chosen range, then requests per day &mdash; with top pages, referrers, visitors and bots further down.
Figure 11.4. The Web Traffic pane reading a sample Apache access log: requests, unique visitors, data served and error rate for the chosen range, then requests per day — with top pages, referrers, visitors and bots further down.

The AI Agents layout puts every agent runtime you've set up that has a status API on the board — T3 Code, OpenClaw, Hermes, Paperclip, Octop, LangGraph and others — with agents working, and tokens and cost today. T3 Code, once connected read-only, adds the threads waiting for you (the tile turns orange until they're answered) and the CPU and memory of its whole process tree, as a share of this Mac. Its detail lists the threads waiting, working and failed, usage by model and the busiest agent processes. T3 Code workers that the fleet check finds on servers appear as presence-only tiles.

The Durable Objects layout shows celld — the Deno team's self-hosted runtime for Cloudflare Workers and Durable Objects — with one tile per fleet node added on the celld pane and per celld dev server running on this Mac. Each tile shows resident and owned cells, CPU and memory; it turns orange when the node signals it needs capacity (memory pressure, shedding or cells waiting for residency) and red when its operator API stops answering or its health route reports it draining. The detail lists WebSockets, the restore backlog, the deployment version, cell phases and the resident cells, with Open Worker, Refresh and, for a server on this Mac, Stop.

A connected Proxmox VE cluster adds one tile per node to the All Servers, Cluster and Everything layouts, with CPU, memory, disk and uptime sparklines and a count of running VMs and containers. Its detail lists every guest with start, shut-down, reboot, stop and reset controls, the node's storage and the cluster's quorum, and offers Boot an ISO… into the Boot Media pane. Connecting a cluster is covered in Chapter 8.

The AWS layout (and All Servers) needs nothing set up in FrontierStack: if the aws CLI has credentials, the window scans every profile in ~/.aws and every Region the account has enabled, and shows each EC2 and Lightsail instance as a tile with CloudWatch CPU and network (5-minute points) and its uptime. Two profiles for the same account are scanned once, GovCloud and China accounts work, and a stopped instance is shown neutral rather than as an outage. The detail page starts, stops and reboots it (stop and reboot ask first), opens it in the AWS console, and either opens the server it already is or offers Add to Servers — filled in with its address, the login Lightsail set up (or the usual one for the image), and the key pair’s file in ~/.ssh when it is there.

For an instance that is one of your servers, the Disk growth box (also on the server’s own page) handles a filling disk. When the root disk passes the Alerts threshold, FrontierStack works out the grow — the new size, by a step you set, never beyond your cap, and the extra monthly cost — and either asks you (the default) or, if you chose Grow automatically for that server, goes ahead: an optional EBS snapshot, modify-volume, then growpart and resize2fs or xfs_growfs over SSH, with no reboot. Grow Disk… does the same on demand. EBS volumes can only grow and AWS allows one change per volume every six hours, so the cap matters; LVM, Windows and Lightsail get instructions rather than automation.

Three controls sit in the window's own titlebar. Appearance makes this window alone dark or light — useful for a monitoring board you want dark while the rest of the app stays light — cycling follow-the-app, dark, light. Tab layout moves a selected server's tabs between a strip above the content and a vertical list beside it, which suits a tall window and shows every tab at once. Keyboard opens the shortcut list. Both toggles are also in the layout editor, and on ⇧⌘D and ⇧⌘L.

SecurityServers beyond your licence's server limit are not available here. They appear locked, are never sampled, and their tools, terminal and power controls all refuse — the same rule the sidebar and the monitoring sweep already apply, so this window is not a way around the cap.
screenshot to be added
Figure 11.5. One server in depth: usage charts over the live window, with tabs for processes, services, Docker, files, ports, logs, a terminal and power.Capture: capture: In the Server Activity window select a server that has been sampling for a few minutes, stay on the Overview tab so the usage chart has a line, and make sure the tab bar is visible. 1400x900, light mode.
NoteThe Activity window never changes what is monitored or alerted — that stays in the Alerts pane. It is a live console; close it and the sampling stops.

Part IV

IV
Automation & AI

Scripts and schedules, the AI Administrator, MCP, and the AI stack — the four chapters that turn FrontierStack from a control panel into something that works on its own.

12

Chapter 12

Scripts, Cron & Automation

Save the commands you run all day, schedule them on real system cron, and wire FrontierStack into Apple Shortcuts, Siri and the rest of your Mac — from a one-click script to a hands-free voice command.

A good server administrator does the same handful of things over and over: run a backup, warm a cache, restart a backend the right way, check a vhost is actually serving what you think. FrontierStack lets you capture each of those as a saved script, run it with one click, and — when you trust it — hand it to cron so it runs unattended. From there it reaches outward, into Apple Shortcuts, Siri, the frontierstack:// URL scheme and scheduled actions the app performs on its own.

This chapter covers the mechanical side of automation: scripts, schedules and the macOS automation surfaces. The intelligent side — an AI that writes, saves and schedules these scripts for you — is Chapter 13. Everything here is something the AI Administrator can drive through its own audited tools, so the two chapters describe the same machinery from two ends.

12.1The Scripts & Cron pane

Open Scripts & Cron from the sidebar. It is your saved-script library and your scheduler in one place. The Saved Scripts section at the top lists every script you have kept, each with its name and the first line of its body. For each one you get four buttons: Run (execute it now), Schedule (hand it to cron, below), Edit (open the editor), and a trash icon to delete it. Press Add Script… to write a new one.

A saved script is a genuine executable file on disk — shell, PHP or Python — not a fragment the app interprets. Give it a clear name and a note describing its purpose, so that six months later (or the AI Administrator, scanning your library) can tell at a glance what it does and pick the right one. Because the saved file is exactly what runs, what you test by hand is exactly what runs on a schedule.

Each script can target This Mac by default, a local Docker container, or a linked server over SSH by name. Where a script needs a credential, it references a named secret from the local .env vault as an environment variable ($DB_PASSWORD, "$SSH_SUDO_PASS"); the app injects the real value at run time and never lets it reach a cloud model (Chapter 13).

screenshot to be added
Figure 12.1. The Scripts & Cron pane: the saved-script library on top, with Run / Schedule / Edit buttons, and the cron jobs below.Capture: capture: open Scripts & Cron with three or four saved scripts visible and one or two cron jobs listed
The Scripts palette
Toggle Palette next to any script to add it to the floating Scripts palette — a small, always-on-top window of just your palette-tagged scripts, each with a Run button. Keep it beside your editor and pop it open any time. Press Open Palette in the pane to summon it.

12.2Scheduling with cron

The Cron Jobs section is a friendly front-end onto your real system crontab — not a separate scheduler the app invents, but the same cron that has run unattended work on Unix for decades. Each row shows a job's name, a plain-English description of its schedule (FrontierStack translates the five-field syntax for you), and the command it runs, with a switch to enable or disable it and buttons to Run it now, Edit it, or delete it.

Press Schedule on a saved script, or Add Job… for an arbitrary command, to open the schedule builder. Pick a cadence — hourly, daily at a time, weekly — and FrontierStack writes the crontab entry, tagging its own jobs with a # AC: comment so it can find and update them by name later. The same applies through the AI Administrator: list_cron reads your jobs, and schedule_cron creates or updates one (updating in place if a job of that name already exists).

WarningA scheduled cron job runs automatically, without further approval. Unlike an interactive script or an AI tool call — which show you an approval card before anything happens — once a job is on the schedule, it fires on its own, every time, unattended. Schedule only commands you have tested and trust, and review the Cron Jobs list periodically so nothing keeps running that you have forgotten about.

For full control, expand Edit raw crontab at the bottom of the pane. This is the standard crontab in a text editor; FrontierStack-managed jobs appear as # AC: comments so you can see which lines it owns. Edit by hand and press Apply.

Script triggers
Below the script library, Script Triggers run a saved script when an event happens rather than at a clock time — you arrive at or leave a location, a device appears or disappears on the network, or a disk mounts or unmounts. These fire only while the app is running, and the script receives context (FS_TRIGGER, FS_LOCATION, FS_DEVICE, FS_DISK…) as environment variables. Cron handles time; triggers handle events.

12.3The bundled sample scripts

FrontierStack ships a small read-only library of proven, battle-tested admin scripts. They are not your scripts — you cannot edit them in place — but you can read any one's full source, learn from it, and copy it into your own library to adapt. They encode real-world quirks of a Mac web stack (especially the old macOS Server backend), so reading one before writing your own saves you the surprises. The AI Administrator reads them first too, via list_sample_scripts and read_sample_script, so its scripts inherit the same hard-won knowledge.

ScriptWhat it does
apache_real_docrootDiscovers the document root a vhost is actually serving — not what the config claims, but what Apache resolves at run time.
apache_url_matrixReports the HTTP status for a list of paths on a vhost, tested over the real host header, so you can see at a glance which URLs are healthy.
fleet_file_diffCompares one file's checksum across your fleet to find configuration drift — where a machine has quietly diverged from the rest.
macos_httpd_vhostsDumps the macOS Server backend's vhost → docroot map, so you can see exactly what that legacy stack is serving.
macos_web_restartRestarts the macOS Server web backend the right way — the correct sequence, not a blunt apachectl.
node_healthcheckA fleet drift / health check for one vhost across nodes.
php_opcache_checkReports OPcache status for both the CLI and the web SAPI, which are configured separately and easy to get out of step.

12.4Apple Shortcuts, App Intents & Siri

FrontierStack ships native App Intents — actions that appear in the macOS Shortcuts app, in Spotlight, and (for several of them) as built-in Siri phrases you can speak. Drop them into a Shortcut you trigger from a hotkey, the menu bar or a Folder Action; they work from Automator too, since Automator can run Shortcuts and AppleScript. The shipped actions:

ActionWhat it doesBuilt-in Siri phrase
Run Server ScriptRuns one of your saved scripts by name.—
Start / Stop Service GroupStarts or stops every service in your group at once.“Start my servers with FrontierStack”
Restart ServiceRestarts Apache, Nginx, MySQL or PostgreSQL.“Restart a service with FrontierStack”
Restart Docker ContainerRestarts a named container.—
Get Local HealthReturns the Local Health summary (services up / down).“Check server health with FrontierStack”
Apply Sidebar PresetSwitches the sidebar to a saved preset.—
Flush DNS CacheFlushes the macOS DNS resolver cache.—
Send NotificationSends a notification through your alert channels.—
Ask Server AssistantSends a plain-English question to the AI Administrator and returns the answer into your workflow.“Ask FrontierStack…”

The catalogue is wider still — Get Server Status, List Servers, List Docker Containers, Check a Website and more are all available to build Shortcuts with, even where they carry no stock Siri phrase.

On macOS 15 and later, FrontierStack also places its servers, websites, mining rigs, Kubernetes clusters, saved scripts and sidebar presets in the Spotlight index (App Intents IndexedEntity). Siri and Apple Intelligence can then resolve “check the staging server” or “run my nightly backup script” to the right item, and each shows up in Spotlight with a live subtitle. Only what Shortcuts could already read is indexed — names, hostnames, OS and status, never credentials or notes — and the index is emptied while the app is locked or unlicensed.

TipPrefer voice? With the built-in phrases you can simply say “Check server health with FrontierStack”, “Start my servers with FrontierStack” or “Ask FrontierStack…” from any Apple device signed into your iCloud and your stack answers, hands-free.

12.5Driving the app from a script

Because the App Intents are real Shortcuts actions, you can call them from a shell step with the macOS shortcuts command-line tool — useful inside a saved script, a cron job, an Automator “Run Shell Script” action or any launcher. Wrap a FrontierStack action in a one-line Shortcut, then invoke it with shortcuts run "My Shortcut", chaining it with anything else your script does.

The AI Administrator can do this assembly for you. Ask it for an automation script that drives the app through Shortcuts and it calls list_app_intents to see the available actions and the exact shortcuts run invocation for each, then authors the script with save_script (or schedules it with schedule_cron). You get a finished, runnable script rather than a hint.

12.6Scheduled app actions

A cron job runs a shell command. A scheduled app action is different: it is a task the app itself performs on a schedule, using its stored credentials and the same audited tools you and the AI Administrator use — not a raw shell command. Use an app action to reboot a linked server, start, stop or restart a local service the app controls, or flush DNS on a timetable. They are managed through schedule_app_action and listed by list_app_actions, and they appear under Scheduled App Actions in the pane. The natural way to create one is to ask the AI Administrator — “reboot web-03 every night at 3am” — and approve it.

There is one important difference from cron: an app action only runs while FrontierStack is open. It performs the action through the app, so it catches nothing that falls due while the app is closed. Cron, by contrast, runs at the system level whether the app is open or not. Choose cron for things that must happen no matter what, and app actions for things the app must do with its own credentials and tools.

NotePause something for a window with two actions, not one. To pause a service between 2am and 5am, schedule a stop action at 2am and a start action at 5am. App actions are point-in-time triggers, so a window is simply its two edges.
WarningScheduled app actions perform real changes — reboots, service stops — on their schedule with no approval prompt at the moment they fire, exactly like cron. They require “Allow changes” to have been enabled when created. Review the Scheduled App Actions list the same way you review your crontab.

12.7The frontierstack:// URL scheme

Every pane, server, site, container and Cloudflare zone has a frontierstack:// deep link. From AppleScript, an Automator shell step, a launcher or any script runner, a single line such as open frontierstack://pane/Security brings the app forward and jumps straight to that pane. It is the fastest way to wire FrontierStack into an existing workflow when you want the app on screen at a particular place rather than running an action headless. The complete URL-scheme reference is in Chapter 18.

12.8Auto-export of backups, logs and the change-log

The last piece of routine automation is getting FrontierStack's own generated files off the Mac on a schedule. In the Backups overview, the Auto-export to a folder section copies generated artefacts to any folder you choose — a Dropbox folder for off-site safety, or a folder watched by Hazel to drive your own downstream rules. Three feeds are built in:

  • Settings backup — a zip of your configuration backups, which also carry the sidebar pins, Setups, Locations and a copy of the app's preferences.
  • Change-log — the running record of changes made through the app.
  • App logs — a zip of FrontierStack's own logs.

For each feed you set an interval (hourly, 6-hourly, 12-hourly, daily or weekly), pick the destination folder, and optionally turn on Empty after export to rotate the source after each copy (handy for the change-log and app logs, so they do not grow without bound). Export now runs a feed immediately, and each feed shows its last result. Files land as FrontierStack-<feed>-<timestamp> in your chosen folder.

NoteAuto-export runs while the app is open and checks roughly every few minutes, exporting any feed whose interval has come due. Like app actions, it is an in-app schedule, so pair it with a Mac that stays awake (Chapter 17 covers keeping a headless Mac from sleeping) if you need it to run around the clock.

You now have the full mechanical toolkit: scripts you save and run, cron and app actions that run them on a schedule, Shortcuts and Siri that trigger them by hotkey or voice, a URL scheme that jumps anywhere, and auto-export that ships the results off-box. The next chapter introduces the operator who can author and wire all of this for you — the AI Administrator.

13

Chapter 13

The AI Administrator

A tool-using assistant that can see your servers, diagnose what is wrong, and fix it on your approval — with your secrets kept out of the model.

The AI Administrator — the AI Harness — is what makes FrontierStack more than a control panel. It is a tool-using assistant with a live, accurate picture of your setup. You describe a problem in plain English; it investigates with read-only diagnostics, explains what it found, and proposes a fix that you approve before anything runs. It works on this Mac and on every server you have linked over SSH, and it never sees your passwords. This chapter explains how it thinks, what it can do, and how to keep it safe.

The AI Administrator on first run: model selection, trust controls, Prompt Firewall, the local <code>.env</code> secret vault and long-term memory.
Figure 13.1. The AI Administrator on first run: model selection, trust controls, Prompt Firewall, the local .env secret vault and long-term memory.

13.1Choosing a model

The Administrator is not tied to one vendor. At the top of the pane you choose the model that drives it:

  • FrontierStack AI — the default Harness engine when its zero-retention service is available. It needs no API key of your own and runs Qwen3 through Enfour's AI Cloud. Use of FrontierStack's AI servers is free for users for now and may become a paid service later. The upstream key and provider endpoint stay on Enfour's server; prompts are deterministically redacted before upload and the service must attest zero retention. Because this final Harness engine is already zero-retention, FrontierStack skips the separate cloud Prompt Firewall pass instead of sending the same text twice. Tool restrictions and approvals remain unchanged.
  • A cloud model — the most capable option for hard diagnosis and multi-step work. You supply an API key (stored locally). With an OpenAI key, the picker offers GPT-6 Astra for the hardest work, GPT-6.1 Sol (and GPT-6 Sol) for complex coding and professional work, GPT-6.1 Terra for fast, low-cost everyday work, and GPT-6 Luna for focused high-volume tasks, plus the earlier GPT-5.6 family (Sol, Terra and Luna). When a provider adds a model after this version shipped, it appears in the menu under Newly listed (not yet reviewed). FrontierStack takes these from the list the provider gives your key, refreshed with the key check every six hours or when you press Test. It never switches to one by itself, and it hasn't checked their tool support or prices. A curated model the provider no longer lists is marked (not listed). OpenRouter and other hosts that list hundreds of models are left out.
  • A Korean model — Upstage Solar (Solar Pro 4, Solar Mini 4) and NAVER HyperCLOVA X through CLOVA Studio (HCX-007, HCX-005, HCX-DASH-002) are cloud providers like any other: add the key in AI Models (for CLOVA Studio, the nv-… test or service key). The open-weight families run on your Mac from the Ollama pane’s Download a model list: EXAONE (LG AI Research; non-commercial licence), Kanana (Kakao Kanana-2) and A.X (SK Telecom A.X 4.0 Light). SK Telecom’s much larger A.X K1 and K2 need a GPU server running vLLM or SGLang, added as a network endpoint.
  • Perplexity — add a Perplexity API key in AI Models, then choose Sonar, Pro Search, Deep Research or Advanced Deep Research. FrontierStack uses the Agent API, giving the Administrator web search, URL reading, source citations and its normal guarded tools. Model and research usage is billed to your Perplexity API account.
  • A local model — Ollama, LM Studio, or any OpenAI-compatible server on your Mac (LocalAI, Jan, llama.cpp), plus Apple Intelligence: the on-device Foundation Model on Apple silicon with macOS 26, used natively or via Apfel (a one-command install the AI Models pane sets up, runs, and can start at login or app launch for you). Local models keep work entirely offline — nothing leaves the Mac, so the pre-send screening below isn't needed and is hidden. FrontierStack gives a local model a shorter prompt, fewer tools per request and a 32K-token context window, so the rules and the conversation both fit. See Chapter 15 for running local models.
  • Your own subscription tool over MCP — drive the whole app from Claude Code, Claude Desktop or Cursor on the flat plan you already pay for, with no per-token bill. This is covered in Chapter 14.
TipFor everyday questions a fast model is fine; switch to your most capable model when you are chasing a subtle production problem. The Administrator keeps the conversation when you change models.

13.2Let a vision model inspect a pane

When a setting is visible in FrontierStack but the Administrator's tools cannot inspect that control, click Attach Screenshot… above the prompt. This is a model capability, not a Qwen-only feature: FrontierStack sends the appropriate image format to compatible OpenAI-style, Anthropic and local Ollama vision models. A custom or routed model whose capability is unknown can be tried, although its server may reject the image.

FrontierStack never captures your screen automatically. You select one image and review the exact prepared preview. The app limits it to 1,800 pixels, strips metadata by re-rendering it, and uses macOS text recognition locally to black out lines containing known stored credentials, personal account names, private fleet identities or secret-like tokens. OCR is defence in depth, not a guarantee: crop to the relevant pane and check the preview before sending.

SecurityFor an external model, image pixels require their own per-image approval because the text Prompt Firewall cannot inspect pixels. A local model keeps the image local. The upload copy exists in memory for the current tool loop only, is removed before the next turn and is never written to Saved Conversations. The original screenshot remains your file.

13.3How a conversation works

You type a request the way you would brief a colleague — “why is the site throwing 502s?”, “check whether the certificate on shop.example.com is about to expire”, “restart Postgres on db-02”. The Administrator then works in a loop:

  1. It grounds itself. Before acting it discovers what you actually run — the service catalog, your linked servers and devices, the current health board — so its answers match your machine, not a generic guess.
  2. It investigates read-only. It reads logs, runs diagnostics, checks ports and certificates, and inspects config files. None of this changes anything.
  3. It explains, then proposes. It tells you what it found and, if a change is needed, shows the exact command or file edit it wants to run.
  4. You approve. Nothing that changes the system runs until you click approve on that specific action. It then runs the fix and re-checks to confirm.

You never have to wait for a turn to finish. Type another message while it works and it joins the running conversation at the assistant's next step — the Administrator reads your new instruction alongside its tool results and adjusts course mid-task, the way you would redirect a colleague. Messages that miss the turn are sent right after it, in order, and survive a Stop so nothing you typed is lost. And when a tool call hangs — an unreachable SSH host, a wedged service — press Skip beside the progress indicator: the assistant continues immediately and is told that tool may be broken, so it works around the failure instead of retrying into it.

13.4The trust model: read-only by default

This is the most important section in the chapter. The Administrator is built so you can hand it production servers without losing control.

SettingWhat it unlocks
(default)Read-only. The assistant can look at everything — logs, health, config, diagnostics — but cannot change anything.
Make changesPermits mutating actions (restart a service, write a file, issue a certificate, open a firewall port). Each one still shows an approval card.
Run scriptsPermits the general shell tool and saved-script execution. The script and a plain-English explanation are shown for approval before it runs.

Two principles sit on top of these toggles:

  • Per-action approval. Even with changes enabled, every mutating step is shown to you first — the actual command or diff — and nothing runs until you approve that action. There is no “approve everything” mode for ad-hoc changes.
  • Remote actions need their own consent. Controlling a linked server through its monitoring helper additionally requires that server's own “Allow actions” switch, set in its Host Monitor pane (Chapter 8).
  • Destructive database actions need a high-end model. Repairing, restoring or rebuilding a database is irreversible enough that FrontierStack hard-gates those steps to a frontier model — a small or on-device model can still read the log and diagnose, but is refused the destructive tool until you switch to a capable model (Claude Opus/Sonnet, GPT-4o/o-series, Gemini Pro).
SecurityApproval cannot authorize permanent user-data deletion. MySQL DELETE, TRUNCATE, database/table drops, unscoped updates, file-removal and overwrite primitives, disk wipes, and destructive saved scripts, cron jobs or event triggers are refused before approval. Structured file writes preserve the previous file. vhost_remove disables one Apache/nginx vhost reversibly while preserving its document root. An intentional restore from a named backup remains available only through the separately gated local recovery workflow.
SecurityThe Administrator, the privileged helper and every remote capability are off until you enable them. A fresh install can answer questions and run diagnostics, but cannot touch anything until you deliberately turn on Make changes and, for shell work, Run scripts.

13.5The secrets vault

Real administration needs credentials — a database password, an SSH sudo password, a Cloudflare token. FrontierStack keeps these in a local .env vault so the model never sees them.

You add named secrets in the Administrator's Script secrets (.env) bar — for example DB_PASSWORD, CF_TOKEN, SSH_SUDO_PASS. When the assistant writes a script that needs one, it references the name, not the value:

mysql -u root -p"$DB_PASSWORD" -e "SHOW DATABASES;"

At run time the app injects the real value as an environment variable — locally, or over SSH on the target server — and injects only the names a script actually references. The model is told the secret names (so it can write correct scripts) but never the values, and command output is secret-redacted before it is sent.

  • Shell: $NAME / "$NAME"
  • PHP: getenv('NAME')
  • Python: os.environ['NAME']
NoteThe vault is a flat set of names, so you can keep several of a kind — PROD_DB_PASSWORD, STAGING_DB_PASSWORD, a per-server BALTHAZAR_MYSQL_PW. The assistant picks the name that matches the target; if the mapping is unclear it asks rather than guessing.

13.6Import from a repo, and frontierstack run

Some developers keep their network settings in a repo for their agents — an SSH config, an Ansible inventory, .env files full of API keys. FrontierStack deliberately doesn't export credentials to a repo: a repo is copied to every clone, CI run and agent sandbox, and its history keeps a secret after the file is deleted. It does import one you already have.

Open Migrate Setups ▸ Servers ▸ Import from a Repo… (also in the Script secrets bar). Choose a folder, or paste a git address to clone it into a temporary folder that is deleted when the window closes.

Found in the repoImported as
SSH config: Host, HostName, User, Port, IdentityFileServers in the fleet; a key inside the repo is copied to ~/.ssh/frontierstack
Ansible inventory (INI or YAML) with group_vars / host_varsServers with their environment (production, staging…); a become password becomes the server's sudo password
.env, .env.*, .envrcScript Secrets; well-known names such as CLOUDFLARE_API_TOKEN can also fill that service's own slot
SOPS, Ansible Vault, age, git-crypt filesDecrypted with your own tools and keys, in memory only
A Markdown inventory such as COMPUTERS.md (a table with name and address columns)Servers; machines marked retired or offline, and hosts only seen in an ssh user@host command, start unticked
export NAME=value lines in setup scriptsScript Secrets
AGENTS.md, CLAUDE.md, HOW_TO_*.md runbooks and scriptsCopies in your Knowledge Folder (Runbooks, Recipes), with secret values replaced
A FrontierStack Network Repo (frontierstack-network.json or .yaml)Read exactly; the secret names it expects are listed
Server templates (templates/*.yaml) and boxes/<name>/box.yamlTemplates saved to FrontierStack; a box with an address becomes a server that follows its template
Anything else (a routers.yml, Terraform variables)Interpret with FrontierStack AI

The AI step always uses FrontierStack AI's main model, and it never sees a value. Every secret-looking value is replaced by a placeholder such as ‹V7›; the model answers with placeholders, and the real values are filled in on your Mac only when you click Import. Show What the AI Sees… displays the exact text that is sent.

After the import, FrontierStack lists the files that are in the repo's git history, offers Replace Key for services whose API can issue a new one, and can save a .env.frontierstack reference file — names only, safe to commit:

DB_PASSWORD=fs://DB_PASSWORD
CLOUDFLARE_API_TOKEN=fs://CLOUDFLARE_API_TOKEN

Turn on Let frontierstack run use these secrets in the Script secrets bar, and your agents can run commands with the values without ever holding them:

frontierstack run -- ./deploy.sh
frontierstack run --secret API=CLOUDFLARE_API_TOKEN -- terraform plan

The values are injected as environment variables for that one command and masked in its output (--no-masking for interactive programs). It works with the app closed, respects App Lock, can't open secrets encrypted with a security key, and records each run — names only — in the change log.

A SOPS-encrypted .env, JSON, YAML, INI or mise .env.toml file can be the source instead: frontierstack run --sops-file secrets.enc.env -- ./deploy.sh sets its top-level values the way sops exec-env does, masked the same way. FrontierStack opens it with your age key (the one sops or mise would use); a file encrypted only to PGP or a cloud KMS goes to your own sops tool. The import above also decrypts SOPS and age files itself when those tools aren’t installed.

13.7Prompt Firewall

Prompt Firewall is an optional semantic check on top of FrontierStack's always-on deterministic redaction. Choose On this Mac to use an Ollama or supported local OpenAI-compatible model, or explicitly choose Enfour's AI Cloud. It can warn and ask, automatically redact what it finds, or block the send.

On-device screening keeps the check entirely on this Mac. Enfour's AI Cloud receives only text after FrontierStack has removed known credentials, usernames, private addresses and secret-shaped patterns. It is free for users for now. The cloud service must attest zero retention on every response; if that assurance or the service disappears, screening returns an unverified result and Block mode stops the send. Enfour's upstream provider key and endpoint never reach the app, allowing Enfour to change the trusted provider later without distributing a new key or remotely configuring the app to call an arbitrary address.

SecurityCloud Prompt Firewall is still a third party: already-redacted text leaves your Mac. Select it only if you accept that boundary. The default cloud screener uses a GPT model through Enfour's AI Cloud and a configuration that does not persist prompt or generated text; token-count metadata may still be recorded for delivery and abuse control.

13.8What the Administrator can do: the tools

The assistant acts only through a fixed set of audited tools. Each is guard-railed: read-only tools always work; mutating tools need the toggles above and an approval. Grouped by job:

AreaRepresentative tools
Discover & groundapp_capabilities (what FrontierStack can manage), search_app_help (current Help for FrontierStack settings and controls), list_targets (servers & devices), get_server_health, get_location, get_sidebar_state
Diagnose (read-only)diagnose (ping, dig, curl, netstat, df, ps…), read_logs/tail_log (incl. the Wi-Fi event log), get_location (with live Wi-Fi radio detail), security_audit, port_check, cert_expiry_check, whois_lookup, ip_analysis, metrics_snapshot, php_test/python_test
Control servicesservice_action (Homebrew services), repair_service, reload_webserver, restart_app, monitor_action (via a server's helper), reboot_host
Web & databaseslist_sites/read_site_file/write_site_file, vhost_create/vhost_remove, list_databases/run_sql, db_dump/backup_now/restore, issue_certificate
Network & perimeterfirewall_rule, flush_dns, dns_record (Cloudflare, DNSimple, GoDaddy, Hostinger, ConoHa, DNSPod), cloudflare_dev_mode (Development Mode, under_attack, email_status, web_vitals, rules, rule_update, rule_create, security_events, cache_hosts, workers, plan_usage, bot_fight), router_info (status, health & security signals), reboot_router, open_web_ui, discover_devices/pin_device, internet_speed
Mail securityemail_auth_dns (SPF/DMARC/DKIM), harden_mail_postfix, test_open_relay, generate_dkim_key, install_mail_cert
Security testingstrix_status (read the Strix install, scan history & findings), strix_scan (run an authorised penetration test), strix_control (stop, re-run, restart, silence) — the two acting tools are local-only
Files & the shellread_remote_file/write_remote_file/upload_file, and run_script — general shell on this Mac or any linked server
Scripts & scheduleslist_scripts/run_saved_script/save_script, schedule_cron, schedule_app_action, list_sample_scripts
Messagingget_messaging_channels, send_notification, get_alert_errors
E-commerceecommerce — every connected shop, marketplace and payment channel: today/week/month sales per currency, orders waiting, warnings such as a Rakuten RMS licence key about to expire, and the e-commerce catalogue (read-only)
Knowledgelist_skills/load_skill, list_notes/read_note, obsidian_search/obsidian_read_note, remember/list_memory/forget
Vendor MCP servershosted_mcp — provider=zapier (your Zapier MCP actions), supabase (Supabase's official MCP server), hostinger (Hostinger's official MCP server; reads unless Allow writes is on in the Hostinger pane), stripe, github, neon, posthog, datadog, pagerduty, resend, planetscale, n8n, grafana (each with the key saved in its pane; same rule), about two dozen more through a browser sign-in in their pane (atlassian, linear, vercel, sentry, notion and others), or cloudflare (Cloudflare's official MCP server: docs and API-spec search, plus approved API calls when execute is allowed in the Cloudflare pane). For every provider, tools that return or create credentials are refused and credential values in results are redacted
The app itselfopen_pane, set_pane_visible, manage_palette, set_services_visible — the assistant can navigate and reshape the sidebar for you

The general-purpose run_script tool is the assistant's shell: anything the fixed tools do not cover, it does by writing a small, readable script and showing it to you for approval. On a remote server it works in two passes — a read-only test script to find the problem, then a minimal fix, then a re-test to confirm.

13.9Skills, notes and memory

Three features let the Administrator work from your knowledge rather than generic defaults.

13.12.1Skills

Skills are curated, multi-step playbooks — a fleet security audit, a web-stack restart procedure — managed in the AI Skill Manager. The assistant lists them cheaply (names only) and loads one's full instructions on demand, so a task follows your approved procedure instead of improvising.

13.12.2Notes shared with the AI

The Notes pane (Chapter 3) holds credentials, runbooks and instructions, each behind a per-note lock that is off by default. The assistant can read only the notes you have explicitly unlocked with Share with AI; it sees their titles to know what exists, and reads a body only when a task needs it.

13.12.3Long-term memory

Tell the assistant “remember that LINE is my preferred channel” or “never send messages on weekends” and it saves the rule to a durable memory.md so it honours it in future sessions. You can list and forget memories at any time, from the chat (“what do you remember?”, “forget the donkey rule”) or the Memory bar at the bottom of the pane.

“Never” rules are enforced. Say “remember to never change the NAT setting on the router called ‘donkey’” and FrontierStack works out what the rule protects — anything quoted, and any server or device it names, under every spelling (name, IP, MAC, the pseudonym an online model sees). Any change that names it then waits for your approval with the rule shown on the card, even if the model has forgotten the rule; read-only looks are never held. Automations, agent jobs and external tools have nobody to ask, so the change is refused and they are told why. Matching is by name, not by setting, so you decide whether a held change really touches the rule.

Infrastructure notes and your own files. Facts about how your network is built — addresses, VLANs, which server does what, device quirks — live in infrastructure.md, sent with every request so a check starts from what is already known. Both files are yours to edit: write sections of your own with any headings, lists or tables, or click Import… in the Memory bar to add a Markdown file (an Obsidian note works) as a new section. FrontierStack writes only under its own heading — Learned by the assistant or Added in FrontierStack — and never rewrites yours; edits made in another editor apply from the next message, and text inside <!-- --> comments is never sent. Your sections are always sent; of the learned facts, the first part is sent and the assistant searches the rest when it needs them.

13.12.4Knowledge Folder, Obsidian and Perplexity Brain

The Knowledge Folder pane accepts any local Markdown folder. FrontierStack keeps managed inventory, incidents, changes, SOPs, runbooks, prompts and recipes under its FrontierStack/ subfolder. Obsidian is an optional editor; installed vaults appear as shortcuts, but no Obsidian installation is required.

External models cannot read the full local folder. For Perplexity Projects and Brain, click Prepare Perplexity Folder. The generated Perplexity Export contains only a redacted inventory and capabilities by default, omitting addresses, MAC addresses, account names, credentials, private notes and journals. Sharing procedures or journals has a separate opt-in. Review the folder, attach it to a Perplexity Project, then enable Brain if your plan offers it.

SecurityBrain is a cloud-hosted research-preview feature, not a documented external note-storage API. The local Knowledge Folder remains the source of truth, and redaction is a safety layer rather than a substitute for reviewing what you attach to a cloud service.
SecurityLocked notes are never readable, and a note you have not shared returns a refusal — so the assistant cannot reach a credential you have not chosen to give it. Never paste a secret into the chat; add it to the vault or a shared note instead.

13.10This Mac and your fleet

Almost every tool takes a target. Omit it and the tool runs on this Mac; set it to a linked server's name and the same diagnostic, log read, script or fix runs there over SSH (read-only tools stay read-only). So the same conversation can move fluidly from “check this Mac’s disk” to “now do the same on web-01 and edge-03”. Linking servers and the host-monitor helper are covered in Chapter 8.

Before privileged work, the harness reads a non-secret access status for the selected target. A linked server reports whether its SSH/root/sudo password is saved locally in FrontierStack's Keychain; only the fact that access is available reaches the model, never the value. This Mac reports whether the approved privileged helper is ready or whether a supported action will show the normal interactive macOS administrator-password prompt. When access is available, the assistant should try the bounded tool after your approval instead of stopping at instructions. Free-form AI scripts are not automatically given a server's saved password.

When a linked server stops answering, list_targets still describes it from what FrontierStack last saw while it was up — OS, hardware, addresses including stable IPv6 and Tailscale, DNS resolvers, connection, the services that were running, any OS-scheduled reboot, and the monitor’s settings — each marked as last seen with its date, so the assistant never presents an old reading as live. The record stays on this Mac and never contains tokens or alert URLs (Chapter 8).

13.11Custom instructions and history

The Custom Instructions editor (Chapter 17) lets you shape the assistant's standing behaviour — house style, what to summarise, defaults you always want. Past conversations are kept in the history menu so you can return to an investigation, and the assistant can pick up where it left off.

13.12A worked example

To see the pieces together, here is a typical exchange — “the shop is down with 502s.”

The assistant calls get_server_health and sees Apache up but PHP-FPM down on web-01. It reads the PHP-FPM log with read_logs (target web-01) and finds the pool failing to start after a config edit. It shows you the offending lines, proposes a one-line fix to www.conf via write_remote_file, and — once you approve — reloads with reload_webserver and re-checks the site over loopback. Green. If you ask, it sends a one-line all-clear to your team with send_notification.

Throughout, no password reached the model, every change waited for your approval, and the whole thing is something you could have done by hand — just faster.

TipKeep an eye on spend with the AI cost monitor (Chapter 15): this month's total against your budget, broken down by provider and subscription. If you drive the app from your own subscription over MCP, there is no per-token bill at all — see Chapter 14.
14

Chapter 14

FrontierStack in Agentic Workflows

Use FrontierStack as the guarded infrastructure authority behind coding agents, autonomous coordinators and human/agent workflows — without moving server credentials into the model.

Chapter 13 covered the AI Administrator inside FrontierStack. This chapter covers the other direction: placing FrontierStack inside an agentic workflow you already use. Hermes Bots, Codex, Claude Code, Cursor, Gemini CLI, Grok-powered coordinators and other MCP clients can investigate your real fleet and request work through FrontierStack, while the credentials and final authority remain on the Mac.

14.1The role FrontierStack plays

An agentic system normally has a coordinator that decides what should happen and a set of specialists that know how to do particular work. FrontierStack fills one stable specialist role: Server Administrator. It is also the authority boundary between probabilistic model output and production infrastructure.

The distinction matters. A coding agent may understand a deployment and propose a restart, but it should not carry the SSH key that makes the restart possible. A manager agent may assign an incident, but its message is not authorization. FrontierStack accepts the request, authenticates the caller, narrows the tool set, applies local policy, resolves credentials at execution time, asks a person when required, acts, verifies the observed result and records who requested it.

NoteMCP — the Model Context Protocol — connects an AI client to tools and data. It is a transport and discovery standard, not an infrastructure authorization system. FrontierStack implements the server side and supplies the missing server-administration boundary.

14.2One request, end to end

  1. The coordinator describes a bounded job. For example: “investigate certificate failures on web-02” or “restart the queue worker if it is stopped”.
  2. FrontierStack authenticates the caller. A local client uses the owner-only Keychain bridge. A network caller must use the explicitly enabled, paired, signed and scoped path.
  3. Tool discovery is filtered twice. frontierstack_find_tools finds tools relevant to the assignment, then the caller’s current scope removes anything it may not use.
  4. Policy is applied at execution. Read-only defaults, App Lock, destructive-data restrictions and approval cards are checked again when the chosen tool is called. Discovery never grants permission.
  5. Credentials are resolved locally. SSH keys, sudo passwords, database credentials, router logins and cloud tokens stay in the Keychain or linked vault. The model receives neither the value nor a reusable credential-bearing command.
  6. The target performs a bounded operation. FrontierStack acts on this Mac or the selected Linux, Windows or Mac host through its reviewed local, SSH or helper path.
  7. Completion is verified. A successful process exit is not enough for important changes. FrontierStack checks the app-observed postcondition, writes the audit event and returns an attributable result or durable receipt.

14.3Choose an agentic workflow pattern

The usual starting point is interactive MCP from a coding agent. Add durable tasks, events or mobile supervision only where the workflow needs them.

Integration surfaces

Team shapeUseWhat FrontierStack provides
A coding agent or manager needs a bounded server operationMCP (recommended)Live, caller-filtered tools and resources through the existing local policy and approval boundary.
A shell script, local automation or CI runner needs a stable interfaceFrontierStack CLIMachine-readable discovery and the same guarded calls as MCP, with credentials supplied by the owner-only Keychain bridge rather than copied into scripts.
An agent needs a map of the fleet before it connectsAgent Skill / AGENTS.mdA portable, credential-free description of servers, roles, services and operating rules.
A coordinator delegates long work or hands over an incidentA2A 1.0 previewA durable task ID, progress, cancellation, input or approval-required states, artifacts and a terminal receipt. It is private and off until enabled.
An MCP client supports deferred workMCP Tasks previewThe same durable task engine projected through the experimental Tasks extension. Both sides must opt in.
An incident or CI/CD system raises workCloudEvents previewSelected authenticated events can start read-only triage and carry correlation information. An event never grants permission to make a change.
An operator needs to supervise agents away from the MaciOS Agent ActivityBounded status, runtime, job and durable-session metadata from the paired Mac, without copying prompts, transcripts, terminal contents or credentials to the phone.

Keep the tool list small

Do not load FrontierStack’s complete tool catalog into every model conversation. Some AI harnesses impose a 128-tool ceiling, and a long irrelevant catalog also makes tool choice less reliable. FrontierStack’s default catalog therefore exposes a small bootstrap pair: frontierstack_find_tools finds only the tools relevant to the current task and caller, and frontierstack_call invokes the selected tool. Use frontierstack tools --full only for inspection or a client that explicitly needs the complete permitted catalog.

TipAsk the coordinator to start with a concrete assignment such as “find the cause of certificate failures on web-02”. FrontierStack can then return the certificate, log and host-health tools needed for that job instead of asking the model to choose from the whole product.

Install a credential-free setup kit

In the MCP pane, export an Ecosystem Setup Kit, or read frontierstack://ecosystem-kits over MCP / run frontierstack ecosystem-kits. The generated recipes cover OpenClaw/Hermes-style specialists, Buzz or other human/agent teams, OpenAI-style managers and handoffs, Microsoft workflows, LangGraph, CI/CD, Slack/Teams approval handoffs and a generic future adapter. A kit contains role and endpoint metadata, instructions and safe placeholders — never a password, private key, bearer token or API key.

  1. Choose the recipe closest to the coordinator you use and give FrontierStack the Server Administrator role.
  2. Connect through localhost, or through FrontierStack’s paired HTTPS path when the coordinator is on another approved device. Do not publish the local MCP port directly.
  3. Start read-only. Test discovery, fleet health and help/manual search before enabling any changes.
  4. When a change is needed, approve the exact action in FrontierStack. A message in a group chat, an agent card, a prompt or a claimed approval is not authorization.
  5. Use the task view to follow progress, cancel work and retain the final verification receipt.

The trust boundary does not move

  • Credentials remain local. Server passwords, SSH keys, AI keys and vault values are resolved at execution time and are not exported to the coordinator, setup kit, remote helper, callback or model prompt.
  • Discovery is not permission. A role profile, Skill, event, chat identity or tool description says what FrontierStack may be able to do; it cannot enable a tool or widen a caller’s scope.
  • Changes pass one gate. MCP, A2A, the CLI and events all use the same App Lock, per-caller scope, destructive-data guardrails, local approval and audit trail.
  • Remote helpers stay constrained. The monitor/helper on a server is FrontierStack’s deterministic hands and eyes. It does not host a model, store AI-provider credentials or accept arbitrary MCP work from the network.
  • Completion means verified. Durable mutating tasks finish only after FrontierStack records an app-observed postcondition, not merely because a command returned zero.
NoteThe app contains a fail-closed foundation for future SPIFFE/OAuth workload identity and private catalog publication, but those are not active sign-in or interoperability options yet. Do not configure a coordinator as though they were available until FrontierStack exposes and documents the finished adapters.

Observe agents without exposing their work

The Mac’s Agent Operations view is the operational console for worker-host reachability, detected runtimes, active jobs and durable terminal sessions. The iPhone and iPad companion’s Agent Activity view presents a deliberately smaller status surface from the paired Mac. It can show which workers are reachable and which jobs or sessions are active, but it does not send prompts, transcripts, command lines, environment variables, terminal contents or credentials to the phone.

For long-running work on Linux and other fleet hosts, Servers › Host › Terminal Sessions inventories tmux, GNU screen, Zellij and Rex sessions. Rex sessions attach only from the Rex app. A phone with the required scope can open a direct SSH terminal and attach to a selected session; ending one is a separately confirmed full-control action.

14.4Enabling the MCP server

FrontierStack can discover the common AI clients installed on the Mac and configure its own MCP entry without exposing a reusable credential:

  1. Open the MCP Server pane. The server is on by default and binds to localhost; you can turn it off there.
  2. Review Detected AI clients. FrontierStack recognizes Amp, DeepSeek Harness Alpha, Hermes Bot Mode, Grok, Codex CLI, Cursor, Gemini CLI, Claude Code, Claude Desktop, Xcode (26.3 and later), T3 Code and Rex. Use Set Up Detected, or configure one client from its individual control. T3 Code has no MCP settings of its own: setting it up adds FrontierStack to the Codex, Cursor and Grok configs its sessions read, and gives you the claude mcp add --scope user command for Claude Code; then restart the agent session in T3 Code. Rex likewise has no MCP settings of its own: setting it up does the same for the agents in its terminals; start a new agent session in Rex afterwards.
  3. Amp setup runs amp mcp add and adds only FrontierStack's owner-only local bridge. It does not enable Amp remote thread creation, start a runner or expose a remote-control terminal.
  4. DeepSeek Harness (Alpha) uses a configuration-only plugin bundle for the Harness web profile. It activates Harness's own MCP client and points it at FrontierStack's owner-only bridge. The bundle contains no bearer token, server credential, DeepSeek key or network endpoint. Because DeepSeek Harness is still a developer preview, FrontierStack does not install or repair this Alpha plugin at launch; choose Add Alpha Plugin explicitly and update it with FrontierStack when the supported Harness release changes.
  5. Hermes stores each Bot as an isolated profile. Automatic setup repairs only Hermes’ main profile; Set Up Bots is a separate, explicit opt-in for the existing roster. Hermes records the bridge as untrusted, and FrontierStack still applies its read-only default, change and script switches, App Lock, approval and audit rules.
  6. Enable Set up detected AI clients at launch if FrontierStack should repair only its own frontierstack entry whenever a stable detected client changes. Other MCP entries are preserved, and Alpha integrations are skipped.
  7. The generated entry launches FrontierStack’s owner-only bridge. The bridge retrieves the MCP credential from Keychain when it starts; the bearer token is not serialized into the client’s configuration.
  8. For another stdio MCP client, install the FrontierStack CLI and use the command returned by frontierstack mcp.
  9. Start read-only. Run frontierstack discover, list fleet health and try a help search before allowing changes or scripts.

14.16.1Xcode

Xcode 26.3 and later (including Xcode 27 on macOS 27) hosts coding agents and speaks MCP in both directions. Add to Xcode writes FrontierStack’s owner-only bridge into ~/Library/Developer/Xcode/CodingAssistant/mcp-servers.json, the list of MCP servers the Claude, Codex and Gemini agents inside Xcode may use. An agent working on your app can then ask FrontierStack about the server, database or site it is targeting, and request bounded work under the same read-only default, change switch, approval and audit rules as any other client.

In the other direction, the AI Administrator’s xcode tool talks to Xcode’s own MCP server through xcrun mcpbridge: list schemes and targets, build, run all or some tests, read the build log, render a SwiftUI preview, search or edit project files, create a project from a template and drive a simulator. Turn on Xcode › Settings › Intelligence › Model Context Protocol › Allow external agents to use Xcode tools and keep the project open; Xcode shows an alert when FrontierStack connects. Xcode’s read-only tools run freely, while builds, test runs, edits and scheme switches require Allow changes. For a project that is not open in Xcode the tool runs xcodebuild in the in-app console instead. Do not run both against the same project at once: two builders can corrupt Xcode’s build database. The pane also shows the claude mcp add … xcode -- xcrun mcpbridge command that gives Claude Code the same Xcode tools.

14.16.2Grok Bot

Choose Add to Grok to add FrontierStack’s owner-only bridge to ~/.grok/config.toml, or export the project kit when one repository should carry its own Grok instructions. The bridge reads the MCP credential from Keychain at runtime; the TOML file contains no bearer token. Keep a local Grok workflow read-only until its health and help calls behave as expected. A cloud Grok Bot cannot reach the loopback listener. Remote use requires the TLS-protected network path, a paired caller identity and an explicit scope. Never solve discovery by copying the bearer token into bot memory or a project file. Grok Bot needs no key of its own in FrontierStack; the xAI API key in AI Models is separate and only chooses a Grok model for the AI Administrator. Search “Grok Bot” (⌘F) to jump straight to this setup.

14.16.3SlackBot, Slack handoffs and Buzz

Slack support has three separate parts. The Messaging Gateway sends alerts through a Slack incoming webhook. The ecosystem kit describes a Slack or Teams handoff for an existing bot workflow. Full Fleet also includes the Slack Server Admin Agent Beta, which lets FrontierStack itself join the workspace as a server-administrator teammate.

In Messaging Gateways, copy the supplied private Slack app setup, install it to the workspace, and save the xapp- Socket Mode token and xoxb- bot token in Keychain. No public inbound endpoint is opened. Mention @FrontierStack in an invited internal channel or message the app directly. Replies stay in the Slack thread, carry bounded thread context, and can use the AI Harness with FrontierStack's server, service, network, monitoring, and installation tools.

FrontierStack verifies that the requester is a full member of the connected workspace and refuses guests and Slack Connect conversations. An optional channel-ID list narrows the scope further. Read-only investigation is the default. If an owner enables change requests, the model can select only typed FrontierStack actions; credentials, arbitrary shell, recovery secrets, and self-administration remain unavailable. Every change still passes the Full Fleet gate, App Lock, External changes policy, local approval, audit, task receipt, and outcome verification. A Slack message, reaction, role claim, or button is never approval.

FrontierStack can install or connect the hosted or self-hosted Buzz stack and monitor its relay and dependencies, and it can also join a Buzz team as an agent. Turn on MCP Server ▸ Buzz ▸ Answer in Buzz, click Add to Buzz Desktop, then create an agent in Buzz Desktop and choose FrontierStack Server Admin as its runtime. Buzz’s buzz-acp harness launches FrontierStack’s helper (frontierstack-core acp), which hands each @mention to the AI Administrator and posts the answer in the thread. With a self-hosted relay and no Buzz Desktop, set BUZZ_ACP_AGENT_COMMAND and BUZZ_ACP_AGENT_ARGS as the pane shows.

Channel text is untrusted: FrontierStack fences it as data, never offers credential, shell or settings tools to a Buzz turn, and redacts stored secrets from replies. Buzz decides who the agent answers (only its owner by default). The agent reads and diagnoses out of the box. Allow changes requested from Buzz lets it restart services or change configuration, and every such change waits for your approval in a panel on the Mac. Approval in chat never counts, because Buzz’s harness answers ACP permission prompts itself.

The installed frontierstack CLI also uses stateless MCP by default. Run frontierstack discover for machine-readable protocol and capability information; frontierstack info reports both the preferred stateless revision and the supported legacy revisions.

An unfamiliar client can read the frontierstack://manual resource or call search_app_help to learn app-authored procedures without exposing arbitrary files.

The separate MCP Servers pane can manage other servers in either generation. Its Automatic setting tries server/discover first and falls back to legacy initialize only when necessary. A green Stateless mark appears in the server list only after the HTTP server proves support; a stateless stdio server can be marked explicitly because the external client owns that process and handshake.

For example, the AppSignal preset connects to AppSignal’s hosted MCP endpoint through a reviewed, version-pinned mcp-remote bridge. The bridge performs AppSignal’s browser OAuth flow, so no AppSignal token is placed in the preset, client configuration or process arguments. This agent connection is separate from FrontierStack’s deterministic AppSignal health monitor: use the personal API token and app ID in the AppSignal service pane for Local Health and alerts, and use OAuth MCP only when an agent needs a deeper investigation. Start with read-only AppSignal access and review any write-capable tool before delegation.

The same bridge serves the vendor-hosted servers listed in Claude’s connector directory: Vercel, Railway, Hostinger, Neon, PlanetScale, Sentry, Honeycomb, PostHog, PagerDuty, incident.io, Rootly, CircleCI, Buildkite, GitLab, Postman, Atlassian (Jira), Linear, monday.com, Notion, Stripe, Square, PayPal, Zapier, Make, Intercom, Mixpanel, Amplitude, Vanta and Drata. Each vendor’s pane has an Add MCP server button for its own address, and the MCP Servers pane groups them under All Presets ▸ Vendor-Hosted Servers (Claude Connectors). You sign in to the vendor in the browser; no key is copied into the preset.

When the AI Administrator itself uses a vendor’s MCP server (the hosted_mcp tool), every provider follows the same rules: a tool whose name says it returns, creates or rolls a credential — an API key, token, password or connection string — is refused before it runs, and credential values in results are replaced with [redacted by FrontierStack]. Clients connected to FrontierStack’s own MCP server get the same rules, and a listing or a read-only tool does not ask them for approval.

Several vendor panes also have an AI Access section that connects the AI Administrator to the vendor’s official MCP server with the key already saved in that pane: Stripe, GitHub, Neon, PostHog, Datadog, PagerDuty, Resend, PlanetScale and Hostinger. The n8n and Grafana panes do the same for your own servers (n8n’s instance-level MCP server and a self-hosted mcp-grafana). Read tools run freely; everything else is refused until you turn on Allow writes there, and then needs Allow changes and your approval. With writes off, GitHub, Neon and PostHog run in the vendor’s own read-only mode. Stripe’s server accepts only agent-tagged restricted keys from 31 October 2026 — save one in the Stripe section’s Agent key field.

Another two dozen vendors are reached through a browser sign-in rather than a key: Atlassian (Jira, Confluence, Bitbucket), Linear, monday.com, Vercel, Railway, Square, PayPal, incident.io, Airtable, Sentry, Honeycomb, Make, GitLab, Notion, Mixpanel, Amplitude, Rootly, CircleCI, Buildkite, Postman, Intercom, Vanta, Drata, Grafana Cloud, GitCafe and MongoDB Atlas (which reads FrontierStack’s published client description instead of registering). Their AI Access section has a Sign in button; FrontierStack registers itself with the vendor, you approve it in the browser, and the tokens stay in the Keychain. Which tools only read comes from the vendor’s own server when the tools are listed, so every call counts as a write until they have been listed once.

Services with no API key or automatic sign-in — dashboard-only hosts, and Shopify, Slack, HubSpot and Box — have an Account ▸ Sign-in account section instead. The email or username and password are kept in the Keychain, with Copy Password (cleared from the clipboard after 60 seconds) and Open Sign-in Page. FrontierStack never types them into a website and never shows them to the AI. The Channel Manager also keeps an optional Lodgify account, reserved for a planned automated extraction of guest data from Lodgify’s paid add-on services.

SecurityA cloud agent cannot find a private Mac merely because FrontierStack is installed. Network-open MCP is an explicit choice: enable the supported network path, use TLS over LAN, Tailscale or a deliberately configured tunnel, then pair and scope the caller. Never publish the local MCP port or put its bearer token in a URL, shell history, process argument, repository, setup kit or agent memory.
The MCP Server pane: serving on a loopback port, started at launch, and kept answering MCP and CLI calls &mdash; and monitoring &mdash; while FrontierStack is closed.
Figure 14.1. The MCP Server pane: serving on a loopback port, started at launch, and kept answering MCP and CLI calls — and monitoring — while FrontierStack is closed.

14.5Setting up FrontierStack for agent platforms

Connect AI Tools. The first time FrontierStack opens — and once on installs that never saw it — it asks before telling the AI tools on this Mac about itself. It lists the harnesses, coding agents and agent engines it found (Claude Code, Codex, Cursor, Gemini CLI, Grok, Hermes, OpenClaw, Amp, T3 Code, Rex, Intent, Xcode, Claude Desktop), all ticked; untick any to leave alone. Tell Them About FrontierStack adds the MCP connection to each and, where the tool reads them, the FrontierStack skill (~/.claude/skills for Claude Code, added at user scope; ~/.agents/skills for Codex, Gemini CLI and OpenClaw). It can also add FrontierStack to Hermes' Bot Mode profiles and turn on the public connector for cloud assistants such as Grok Bot, ChatGPT, Claude and Gemini. Run it again from Settings ▸ General ▸ Connect AI Tools…. Google's Gemini app for Mac can't load a local server, so it has its own checklist in the MCP pane: the public connector, a custom connector on gemini.google.com, and a ready-made skill pasted into Customize ▸ Skills.

An agent platform can use FrontierStack in one of three ways. A coding agent calls it as an MCP tool server, as described in the previous section. An orchestrator can employ it as a worker that takes assignments: a Paperclip heartbeat or an A2A task. And any agent that has a shell can drive the frontierstack CLI. Whichever route you pick, FrontierStack plays the same Server Administrator role, and the same App Lock, read-only default, approvals and audit log apply.

PlatformHow it connectsWhere to set it up
Claude Code, Codex CLI, Cursor, Gemini CLI, Claude Desktop, Amp, Grok, Hermes, Xcode, T3 Code and Rex (through their agents)MCP, through FrontierStack’s owner-only local bridgeMCP Server ▸ AI clients ▸ Set Up Detected
OpenClawMCP through the local bridge, added with OpenClaw’s own openclaw mcp add, plus the FrontierStack skill in ~/.agents/skillsMCP Server ▸ AI clients ▸ OpenClaw ▸ Add to OpenClaw
BuzzFrontierStack itself as a Buzz agent (ACP), or a local agent (Claude Code, Codex or goose) using that harness’s MCP entry and the skill in ~/.agents/skillsAdd to Buzz Desktop in the MCP pane’s Buzz section; for another agent, set up its harness and export the skill
Claude (chat, Cowork, Claude Code)The FrontierStack plugin: both skills, the local bridge for Claude Code and Cowork on this Mac, and the cloud gateway as a connector for Claude on the web, desktop and phone (sign in with your FrontierStack account; needs ChatGPT access on)In Claude, Customize ▸ Plugins, or /plugin marketplace add richardnorthcott/frontierstack-claude-plugin in Claude Code. Remove any earlier claude mcp add frontierstack entry
Claude Code (fleet context)The Fleet Skill, ~/.claude/skills/fleet/SKILL.mdFleet Skill, with auto-update on (see below)
OctopFrontierStack joins expert teams as an Octop expert whose tools are the local MCP bridgeOctop pane ▸ Join Octop teams
PaperclipFrontierStack is hired as a company agent; Paperclip’s process adapter runs it once per heartbeatPaperclip pane ▸ Work as a Paperclip agent
OpenClaw, Hermes supervisors, LangGraph, Microsoft and OpenAI-style managersA2A 1.0 delegation, or the matching ecosystem kitMCP Server ▸ Accept delegated A2A tasks; Ecosystem Setup Kit
CI/CD, shell scripts, n8n, any agent with a terminalThe frontierstack CLI, or CloudEvents for incident triggersMCP Server or Remote Control & Lock ▸ Command Line ▸ install the CLI
ChatGPT, Codex, and cloud assistants that take a custom MCP connector (such as a cloud Grok Bot)The FrontierStack plugin at https://frontierstack.app/plugin/mcp: sign in with your FrontierStack account; this Mac answers over an outbound connectionMCP Server ▸ ChatGPT access (the app must be running). Paid plans only; a licence with no FrontierStack account uses Link to Account there
Other cloud agents (Devin, Manus)Only the paired, TLS-protected network path with a scoped identitySigned requests and device pairing (next section)

14.16.4Paperclip: hire FrontierStack as the company’s system engineer

Paperclip runs a team of agents as a company, with an org chart, budgets, goals and approvals. FrontierStack can join that company as its system engineer and network administrator. It takes the infrastructure issues assigned to it, investigates them with its own tools and reports back on the issue.

  1. Install Paperclip on this Mac, as your own user: npx paperclipai onboard --yes. Heartbeats run FrontierStack locally, so Paperclip can’t live on another machine.
  2. Open the Paperclip pane in the Agent Operations section. Under Connection, check the endpoint (http://127.0.0.1:3100 by default). If Paperclip runs in authenticated mode, paste a board API key as the token.
  3. Under Work as a Paperclip agent, turn on Accept Paperclip heartbeats and click Install heartbeat command. This writes ~/.frontierstack/bin/frontierstack-paperclip.
  4. Open Hire FrontierStack into a company, click Load companies, choose the company and click Hire as DevOps agent. This creates an agent titled “System Engineer & Network Administrator” that uses the process adapter. You can instead click Copy adapter config and paste it into an agent you create in Paperclip yourself.
  5. Assign it an issue in Paperclip, for example “find out why mail from web-02 is bouncing”. Its progress appears in Paperclip’s run transcript.

On each heartbeat, Paperclip runs the heartbeat command with a short-lived run token. If FrontierStack isn’t running, the command starts it hidden in the background (a cold start can take up to two minutes). FrontierStack then checks out the assigned issue, investigates, comments and sets the issue to done, blocked or in review. If another agent already has the issue checked out, FrontierStack leaves it alone. The run token is sent only to the Paperclip server set in the pane.

Let Paperclip request changes is off at first, so the agent only investigates and recommends. When you turn it on, each typed change still follows App Lock and your External changes setting: it runs, waits in the pane with Approve once, Allow for 5 minutes and Deny, or is refused.

screenshot to be added
Figure 14.2. The Paperclip pane’s “Work as a Paperclip agent” sectionCapture: capture: Paperclip pane scrolled to Work as a Paperclip agent, with heartbeats accepted, the heartbeat command installed, a company loaded in the Hire section and one change waiting for approval
SecurityA Paperclip approval, budget or board decision never counts as a FrontierStack approval, and Paperclip never gets shell access or credentials. The heartbeat always goes through the app, so it starts FrontierStack even when the background service is keeping MCP available.

14.16.5Octop: put FrontierStack on an expert team

Octop, from Tencent Cloud, is a self-hosted assistant for several users. Its experts work alone or as a team, where a host expert hands work to the members. Team members must be Octop experts, so FrontierStack joins as one: an expert whose tools are FrontierStack’s MCP server. Octop’s model does the reasoning and FrontierStack does the work.

  1. Install Octop on this Mac, as your own user (python3 -m pip install --user octop, then octop init and octop run). Octop starts FrontierStack’s bridge as a local command, so an Octop in Docker or on another machine can’t join.
  2. Turn on the MCP Server.
  3. Open the Octop pane in the Agent Operations section and check the endpoint (http://127.0.0.1:8088 by default).
  4. Under Join Octop teams, sign in with your Octop username and password, then click Set up expert. FrontierStack adds a frontierstack MCP server to your Octop connectors, checks that Octop can start it and shows how many tools Octop sees, then creates and starts an expert named FrontierStack.
  5. Click Join next to a team. Octop needs at least two members on a team, so create the team in Octop’s dashboard first (Experts ▸ My Teams).

The password is used once to sign in and is never stored. The session ends when you sign out, lock FrontierStack or quit; the expert and its team places stay in Octop.

SecurityOctop can be reached from IM channels and by other people on the same Octop. Anyone who can message the team’s host can indirectly ask FrontierStack for work, with your MCP settings. Leave Allow changes off unless you trust everyone who can reach the team; a message from the host or another expert is never a FrontierStack approval.

14.16.6A2A supervisors and manager agents

A coordinator that speaks A2A 1.0, such as an OpenClaw or Hermes supervisor or a LangGraph manager, can hand FrontierStack a durable task instead of calling tools one at a time. In the MCP Server pane, turn on Accept delegated A2A tasks (off by default). An agent on this Mac connects over localhost. An approved remote coordinator uses the paired, certificate-pinned HTTPS route. The Agent Card only describes FrontierStack; it grants nothing. A natural-language assignment is always read-only. A change must be sent as a typed FrontierStack request, and it then passes the usual scope, App Lock, approval, audit and verification checks. Progress streams over SSE, and optional callbacks must go to public HTTPS addresses. Export the matching Ecosystem Setup Kit for a ready-made, credential-free recipe.

14.16.7Agents with a shell, CI and scripts

Install the CLI from the MCP Server pane or Remote Control & Lock ▸ Command Line. An agent can then run frontierstack discover to see what’s available, frontierstack role to read the Server Administrator profile, and frontierstack call <tool> '<json>' to run a tool. Give it credentials with frontierstack run (see Credentials for agents), never by pasting them into the prompt. If the platform works on a schedule or at night, turn on the background service so read-only checks work with the app closed (Working with the app closed).

Tell the agent to add --json to every command. Each answer is then exactly one JSON object, an error is {"ok":false,"error":{"code","message"}} with a message that says what to do next, and the exit code says what kind of failure it was (2 usage, 3 not found, 4 refused, 69 FrontierStack not answering). frontierstack help --json lists every command as a schema. The server commands (status, server, service, docker, website, kube) run the same tools an MCP client calls, with the same approval card, so both routes give the same answers. docker rm only says what it would remove until the agent adds --yes. To let Claude Code run the read-only commands without asking each time, press Allow Read-Only Commands in Claude Code in the MCP Server pane.

14.16.8Before a platform makes changes

  • Connect it read-only first. Check discovery, fleet health and a help search.
  • Give Claude Code the Fleet Skill so it knows your servers before it connects, and turn on auto-update so the skill follows fleet changes.
  • Turn on changes per platform: the MCP change switch, Let Paperclip request changes, or typed A2A requests. Keep approvals on the Mac or the paired iPhone.
  • Watch the work in Agent Operations ▸ Activity and the audit log. The iPhone’s Agent Activity view shows status without copying prompts or transcripts.

14.6Signed requests and device pairing (FS1)

The control and MCP servers add a per-device signed-request layer — FS1 — on top of the bearer token and TLS. Each paired device holds its own Ed25519 private key and signs every request; FrontierStack verifies the signature against the device you approved, so a leaked token alone cannot drive anything.

  • Per-device scopes. Each device is granted a scope from read-only up to full control, set on the Mac.
  • One-tap revoke. Remove a device and it is cut off instantly, without affecting the others.
  • This is the same mechanism the iPhone and iPad app uses to pair — see the Mobile Manual, and the trust model in Chapter 10.

14.7Agent keys and per-tool rules

Every local MCP client can share one bearer token, and then FrontierStack knows an agent only by the name it sends — which any program can claim. Agent keys give each agent its own credential. Open Permissions ▸ Agent keys:

  • Add Agent… issues a key for one agent, optionally with an expiry. It is shown once; FrontierStack keeps only its SHA-256 fingerprint, a short hint, the name and the dates. Give it to the agent as its MCP bearer token on this Mac’s loopback address.
  • The Add to Claude Code / Codex / Cursor / Gemini CLI / Claude Desktop buttons in the MCP Server pane make a key named after the client and set the bridge up with --agent. The key stays in the Keychain, never in the client’s config file. Turn on Use the shared token for new setups to keep the old behaviour.
  • A call made with a key carries that agent’s verified name, has its own rate limit and approval window, and every tool call is written to the change log with the key. The list shows when each key was last used and its recent calls. Revoke stops a key at once.
  • Require each agent to use its own key refuses the shared token, with a message that names the fix. The frontierstack command and Buzz get keys of their own; paired devices keep signing with FS1.

Tool rules. The coordinator, outside agents, each named agent and each agent key can have an Only these tools list and a Never these tools list. A pattern is an exact tool name, a glob such as fleet_* or *_status, or a regular expression between slashes such as /^dns_(read|list)/. The never-list wins. An only-list hides every other tool from the agent’s tool list, from frontierstack_find_tools and from frontierstack_call, and from delegated A2A work.

Rules keyed on a name can only narrow, because a name proves nothing. An agent key’s rules may instead replace its role’s rules, so a CI agent holding its own key may restart services while every other outside agent only reads. Even then nothing goes past the limit for everything outside the app, credentials and FrontierStack’s own settings stay out of reach, and turning it on needs a real click or key press.

NoteA key proves which credential made a call, not which program holds it. Keys kept in the Keychain for the bridge can be read by any program running as you, exactly like the shared token. For an agent you don’t fully trust, use Add Agent… and put the key only where that agent runs, and keep its rules narrow.

14.8External AI jobs

Beyond live MCP, FrontierStack can hand a job to a subscription AI CLI — package up a task and let your local Claude (or similar) work it under your plan, then bring the result back into the app. This is how heavier, longer-running analysis runs without a metered API bill, and it pairs with the Data Map (a per-location data-flow diagram) so the agent has the context it needs. External AI jobs are managed from the AI stack (Chapter 15).

14.9Skills, notes, memory and Obsidian over MCP

An external harness reaches the same knowledge surfaces as the built-in Administrator, subject to the same gates:

  • Skills — your curated playbooks are discoverable and loadable on demand.
  • Shared notes — only notes you unlocked with “Share with AI” are readable.
  • Long-term memory — the same memory.md of preferences and standing rules.
  • Obsidian — if you have linked an Obsidian vault, the agent can search your SOPs and runbooks and follow the documented procedure (Chapter 12).
TipBecause the external agent follows your skills, shared notes and Obsidian SOPs, it operates by your procedures — the same ones the in-app Administrator uses. Keep those up to date and both paths improve at once.

14.10The Fleet Skill — portable context for any agent

The MCP server lets an agent act on your fleet. The Fleet Skill is the other half: static context that teaches an agent your world before it touches anything. The Fleet Skill pane generates a SKILL.md — your servers and their roles, OS, services and how to reach them; your network locations; your KVMs and power sources; and a free-text block of your own rules and preferences — with every secret stripped out. An agent that reads it picks the right host, uses the right path, and respects your conventions instead of guessing.

It is written to ~/.claude/skills/fleet/SKILL.md, which Claude Code discovers automatically — the description: in its frontmatter tells the model when the skill is relevant. MCP-connected agents can pull the same content through the get_fleet_context tool, and you can optionally also emit ~/AGENTS.md for CLIs that read that convention. Turn on auto-update and the skill is rewritten a few seconds after your fleet, locations or KVMs change, so it never drifts from reality.

Think of it as the difference between a map and a remote control. The MCP is the remote control — live, authenticated, able to do things. The skill is the map — zero-setup, portable, safe to hand to any agent, and the thing that stops a capable tool from doing the wrong thing in the right way.

14.11Site skills — one website, ready for an outside agent

The Fleet Skill describes your infrastructure. A site skill describes one website in enough detail for an outside agent such as Claude Code or Codex to do development work on it: the project folder and its git remote, how the site is served (an Apache virtual host, a managed site, a Localhost server, a Cloudflare Tunnel), its Cloudflare zone and DNS records, when its certificate and registration expire, your hosting preferences, and which FrontierStack tools handle DNS, the cache, files on the server, certificates, the database and deploys. It is written to ~/.claude/skills/site-<domain>/SKILL.md, outside the site folder, because that folder is often the web server's document root and anything in it is public.

The credentials never leave FrontierStack. You choose which Script Secrets the site's commands may use; only their names reach the skill, together with a names-only .env.frontierstack. The agent runs a command with frontierstack run --env-file … -- <command>, which injects the values for that one process and masks them in its output. Cloudflare, the web server and the database are reached through FrontierStack's own tools, which use the credentials it holds.

A site skill is made automatically when a site is created by the AI or by the Apache New Site wizard, FrontierStack offers one when you link a folder to Apache, Nginx or a Localhost server, and you can make or edit one at any time with AI Skill in the Sites pane, an Apache site's menu or a Localhost server. Settings ▸ Site skills lists them all and turns the automatic behaviour off. Skills regenerate when a site's hosting changes; an agent connected over MCP can also read one with get_fleet_context action=site.

14.12The Network Repo — a repository an agent can act on

The Fleet Skill is a map an agent can read. The Network Repo pane goes further: it writes your whole network into a git repository that an agent such as Claude Code or Codex can be handed to set things up on its own — a new Mac mini brought to the fleet's standard, a site stood up on a server, every machine put on Tailscale.

FileWhat it holds
AGENTS.md (and CLAUDE.md)The ground rules: check the live state first, no secrets in the repo, plan and ask before changing production machines, routers, DNS or firewalls, your own operator rules
GOAL.mdYour job for the agent. Created once from a template and never overwritten
COMPUTERS.md, boxes/<name>/Every machine: role, OS, SSH target, LAN and Tailscale addresses, services, power; a target state and an idempotent setup.sh per box
NETWORK.mdLocations, routers and their firewall rules, LAN devices, the tailnet, Cloudflare DNS records, domains, pf rules
SERVICES.md, POWER.mdSites, dev servers, MCP servers, cron, the Script library; UPS, outlets, KVMs, PoE
HOW_TO_SET_UP_A_BOX.md, scripts/complete-setup.sh, tests/check-fleet.sh, BrewfileThe runbook for a new machine, the script that applies it (here or over SSH), a read-only check, and the Homebrew baseline
.env.frontierstack, frontierstack-network.json, snapshots/Secret names only; the whole map as data (Import from a Repo reads it back); a dated copy whenever it changes
frontierstack-network.yaml, boxes/<name>/box.yaml, templates/The same map as YAML, easier to read and edit; each machine as data; your server templates

Unlike the Fleet Skill, the repo uses your real names and addresses — an agent can't set up fleet-host-a1b2c3 — so keep it private. Secret values are never written. Every value is checked against your Keychain and Script Secrets before anything is saved, and the export stops if one would leak; scripts, cron jobs and MCP commands that look like they hold a credential are left out and listed. The agent gets credentials the way described below: frontierstack run or the MCP, on your Mac.

Each export is committed to git (only FrontierStack's own files), and Push sends it to a remote you name, using your own git credentials. Write the job in GOAL.md, then Copy Agent Prompt, or Open in Agent Jobs… to start from a prefilled job — you pick the agent and press Run.

SecurityA Network Repo describes every machine, address and firewall rule you have. It holds no secrets, but treat it like a floor plan of your office: private repository, trusted agents.
The Network Repo pane: choose a folder, pick what to include &mdash; live checks, router rules, Cloudflare DNS, cron jobs &mdash; and export a repository an agent can work from. Secret values never leave the Mac.
Figure 14.3. The Network Repo pane: choose a folder, pick what to include — live checks, router rules, Cloudflare DNS, cron jobs — and export a repository an agent can work from. Secret values never leave the Mac.

14.13Server templates — new servers like the ones you have

A server template is what a new machine of one kind gets. In the Network Repo pane, New from Server… reads a server you already run and keeps its role and OS, running services, packages (for this Mac, its Homebrew list), cron jobs, Tailscale, and the router firewall rules and Cloudflare DNS records that point at it. Its own addresses become {{ip}} and its name inside DNS names becomes {{slug}}, so a rule that let web1 reach the database becomes one for the next web server. Secret values are never kept.

Templates are YAML files you can open with Edit YAML, add from elsewhere with Import YAML…, and find with Show Folder; each export writes them to templates/. New Server… stamps a server from one: it's added to your servers and its boxes/<name>/ folder gets a setup.sh with the template's packages, cron jobs and setup steps, and a README listing the firewall rules and DNS records to add.

NoteA template's firewall rules and DNS records are a plan, not an action. FrontierStack never changes a router or DNS from a template, and never runs a template's setup steps itself: you (or an agent, with your OK) run setup.sh and make the network changes.

An agent can propose a machine the same way: it writes boxes/<name>/box.yaml with the new machine's name, address, user and template, and you add it with Import from a Repo.

14.14Credentials for agents, without a .env

Agents often need an API key or a password to run a command. Don't paste it into the chat, and don't keep it in the repo. Put it in Script Secrets (AI Administrator ▸ Script secrets bar), turn on Let frontierstack run use these secrets, and let the agent run:

frontierstack run --secret CLOUDFLARE_API_TOKEN -- terraform apply

The value is set as an environment variable for that one command and masked in its output, so the agent sees the command work without reading the value. A project can instead commit a .env.frontierstack of names only (DB_PASSWORD=fs://DB_PASSWORD); frontierstack run -- <command> in that folder fills it in. The agent guide, the exported skill and the Fleet Skill all tell agents to work this way. Already keep credentials in a repo? Import from a Repo… moves them in (Ch 13).

14.15Working with the app closed

FrontierStack does not have to stay open for agents to use it. Keep MCP and the CLI available when FrontierStack is closed is on by default (MCP Server pane, or Remote Control & Lock ▸ Command Line). A small background service then starts when you log in and owns the local MCP and CLI ports (8788 and 8799 by default). With the app closed, it answers discovery and a set of read-only checks itself: WHOIS, IP analysis, certificate expiry, port checks, the open-relay test, disk usage, top processes, a metrics snapshot, reading hosts files and remote files, and MySQL/PostgreSQL table checks, on this Mac or on your saved servers. For anything else it starts FrontierStack hidden and passes the request on. While the app runs, every request goes straight to it, so App Lock, approvals and the audit log behave exactly as before.

SettingWhat it adds while the app is closed
Keep MCP and the CLI available when FrontierStack is closedMCP and frontierstack keep answering; read-only checks run without the app, and everything else starts it hidden.
Keep monitoring while FrontierStack is closedYour watches, mail endpoints, TLS certificate and domain renewal dates, and linked servers keep being checked. Alerts go out through your channels. Only one side checks at a time, and the app takes over when it opens.
Let headless agents work while my security key is plugged inWith a security-key App Lock, read-only checks run while one of your enrolled keys is plugged in, and frontierstack run can open Script Secrets sealed to the key.

Check what is answering with frontierstack info ("answering": "app", "core" or "none") and frontierstack headless status. The service starts at login, not at boot. Turn on Automatic login in Headless Mac Setup if MCP should come back by itself after a restart or power cut. After an app update the service restarts itself on the new version once open requests are done. Paired iPhones and iPads keep reaching the Mac through the service, with no re-pairing: from the phone's dashboard, Start FrontierStack on the Mac starts it hidden and Open FrontierStack on the Mac opens its window. Alert pushes to the phone keep arriving while the app is closed.

SecurityWith a security-key App Lock, headless access is off unless you turn it on, and turning it on takes a touch. The service checks for the key before every call, so unplugging the key stops agents at their next call. Script Secrets sealed to the key need a touch per frontierstack run unless you turn that off, which also takes a touch. A key with a PIN can open sealed secrets only in the app. Changes always go to the app. frontierstack headless key shows whether an enrolled key is plugged in and answering.

14.16When to use which

Use…When…
The built-in AI Administrator (Ch 13)You want everything in one window, including the approval cards and the cost monitor, and you are happy to supply a model/key or run locally.
FrontierStack over MCP (this chapter)You already live in Amp, Claude Code or Cursor and want one guarded path for code and servers.
External AI jobs (Ch 15)The task is heavy or long-running and you want it handed to a subscription CLI rather than run interactively.

All three reach the same guarded tools and the same live app state. Pick by where you prefer to work; the safety guarantees do not change.

15

Chapter 15

The AI Stack

The other side of AI: not the assistant that runs your servers, but the AI infrastructure your servers run — agent runtimes, local models, sandboxes, GPUs and the bill for all of it, watched from one window.

The previous two chapters were about AI operating FrontierStack: the built-in Administrator (Chapter 13) and driving the app from your own tool over MCP (Chapter 14). This chapter is the reverse. It covers the AI infrastructure FrontierStack helps you run and monitor — agent platforms, local model servers, code sandboxes, browser automation, GPU fabric, ML tooling, governance, and the cost of all of it. These are services in the catalog like any other, grouped under the AI categories in the sidebar, but they deserve a chapter of their own because running AI is now a stack you operate, not a box you call.

15.1Agent Operations

Open Agent Operations from the sidebar for the server-first view of agent work. Every fleet host appears with reachability, environment, CPU and memory, detected agent workers, and buttons for host details and a contextual shell. The shell is local for this Mac and follows the host's configured SSH, mosh or SSH3 trust settings for remote boxes. Runtime health, local coding-agent processes, FrontierStack sessions and agent containers remain on the same board. The AI tool get_agent_platforms exposes runtime state to the Administrator, so you can ask "which agent runtimes are down?" in plain English.

The runtimes fall into two kinds. Some are CLI runtimes — detected by their command-line tool being installed and answering --version. These include Amp, DeepSeek Harness Alpha, Claude Code, Gemini CLI, OpenAI Codex and Factory's droid. Others are HTTP runtimes that expose a status endpoint and are polled for live metrics. A handful of cloud agent products (OpenHands, Manus, Devin, OpenAI Operator, E2B) appear lower down as catalog entries you connect rather than poll.

PlatformWhat it is
OpenClawSelf-hosted agent runtime, monitored for running state and model.
HermesAgent runtime polled over HTTP for status, model and sessions.
DeerFlowDeep-research / multi-step agent runtime.
PaperclipRuns a team of agents as a company (org chart, budgets, goals, approvals); port 3100. The pane counts companies and agents; add a board API key in authenticated mode. Work as a Paperclip agent (beta): install the heartbeat command and hire FrontierStack into a company as its system engineer and network administrator. Changes still need approval in FrontierStack.
LangSmith DeploymentLangChain’s Agent Server (formerly LangGraph Platform): langgraph dev on :2024 or a LangSmith deployment — assistants, threads and runs. The LangSmith service reads tracing projects’ runs, error rate, latency and cost with the same key and alerts on the error rate; LangChain (open source) detects the langgraph CLI.
CrewAI AMPA crew deployed to CrewAI’s hosted platform (formerly CrewAI Enterprise), watched through its own URL (https://<crew>.crewai.com) and the Bearer token on its Status tab. Crews you run yourself use the CrewAI (open source) service.
MastraTypeScript agents and workflows. The server from mastra dev / mastra start on :4111: agents, workflows, and running or suspended workflow runs.
Vercel eveVercel’s open-source TypeScript agent framework. Reads /eve/v1/info (model, tools, skills, subagents, schedules), or the public /eve/v1/health; :2000 for eve dev, :3000 for eve start.
Microsoft AutoGenMulti-agent conversation framework.
GensparkAutonomous agent platform.
Agent ZeroGeneral-purpose autonomous agent.
NVIDIA NemoClawNVIDIA agent runtime.
OpenAI Codex / Claude Code / Gemini CLI / Factory DroidCoding-agent CLIs; detected by install + version, shown as on-demand.
AmpCoding-agent CLI and headless runner. FrontierStack detects its version locally or over SSH and marks hosts with a running Amp process.
DeepSeek Harness (Alpha)DeepSeek's plugin-based developer-preview agent harness. FrontierStack detects the dsh CLI and running jobs locally or over SSH. Its optional FrontierStack plugin is installed explicitly from the MCP pane.
Docker AgentDocker's open-source runtime for YAML-defined agents and multi-agent teams with MCP tools (formerly cagent). FrontierStack reads its session store for sessions, tokens, spend and the last model, lists running agents and servers, runs, serves (A2A, MCP, chat API) and pulls/pushes agents as OCI artifacts on Docker Hub, ghcr.io or any registry, and checks pulled agents for updates. When Docker is installed without the docker agent plugin, the pane installs just the checksum-verified plugin — on this Mac or a linked server.
Unreal AgentUnreal Labs' open-source, async-first agent harness: tool calls run in the background while the model keeps working. Works with OpenAI, Codex, OpenRouter, Fireworks or Ollama. Install it with go install (Go 1.27+). FrontierStack detects unreal-agent-runner locally or over SSH and marks hosts where it is running.
Gemini API CLIGoogle’s experimental gemini-api, the tool other agents run from the shell for Gemini models, media generation, file analysis and managed agents. Detected locally or over SSH, with install, update and key commands; it reads GEMINI_API_KEY or its own saved key.
Qwen Code / Cline / Pi / Oh My Pi / Poolside / OpenCodeMore terminal coding agents (qwen, cline, pi, omp, pool, opencode), detected by install + version locally or over SSH, with install, update and sign-in commands in each pane. In the MCP pane, Factory Droid, OpenCode, Qwen Code, Cline, Oh My Pi and Poolside can each be given FrontierStack's credential-free bridge with one click; Pi has no built-in MCP client by design. Hermes Desktop appears in the Hermes pane (open it, or build it with hermes desktop) and shares Hermes' config, so the Hermes MCP setup covers it.
Antigravity CLI (agy)Google's successor to Gemini CLI for personal Google accounts (since 18 June 2026; Gemini CLI now needs a paid API key, Vertex AI or Gemini Code Assist). Detected locally or over SSH; the pane installs or updates it with Google's script and runs agy doctor and agy plugin import gemini. The MCP pane adds FrontierStack to ~/.gemini/config/mcp_config.json, shared by the CLI, the Antigravity app and the IDE.
Devin CLI / GitHub Copilot CLI / Kiro CLITerminal coding agents from Cognition (devin), GitHub (copilot) and AWS (kiro-cli), detected by install + version locally or over SSH, with install, update and sign-in commands. The MCP pane adds FrontierStack's credential-free bridge to ~/.config/devin/mcp_config.json, ~/.copilot/mcp-config.json and ~/.kiro/settings/mcp.json without auto-approving any tool. For OpenCode 2, which moved MCP servers to mcp.servers, FrontierStack writes the layout the installed version reads. The OpenCode pane shows running terminal UIs, servers (health, working sessions) and runs, recent sessions with model, tokens and cost from its read-only session store, and stops a process after asking.

Because configured runtimes feed the broader system, a runtime that goes down — or hits a token quota (rate-limit, 429, billing) — raises an Alert and appears red on the Local Health board, in the services group. You configure each runtime's endpoint and credentials once; from then on it is watched like any other service.

Agent Operations in dark mode: worker-host health, detected runtimes, local agent CLIs, sessions and containers.
Figure 15.1. Agent Operations in dark mode: worker-host health, detected runtimes, local agent CLIs, sessions and containers.
Note"Runtime" here means the engine that runs agents, not an agent you wrote. The agents you build yourself live in Agent Sessions (below) and are driven by the built-in Administrator. The two are complementary: this board watches third-party platforms; Agent Sessions runs your own goal-driven loops.

15.2Activity, Work, Runtimes & Routing

Four companion views break the agent fleet down by operator task, all reading the same live state:

  • Activity — the bell-shaped operator inbox. Needs You collects runtime failures, lost workers and failed sessions/jobs; Running shows current work; Recently Finished is a short run ledger. The toolbar bell opens it from anywhere.
  • Work — three tabs for the runtime queue, goal-driven Administrator sessions, and isolated Codex/Claude sandbox jobs. OpenClaw cron jobs, paused state, tokens and one-shot job status remain visible in Queue.
  • Runtimes — every configured local/HTTP engine, detected T3 Code worker, and cloud agent product, with reachability or credential state.
  • Routing & Integrations — model routing/provider keys and repository access in two tabs. GitHub, GitLab, Bitbucket and Cursor Origin credentials stay in the Keychain and receive a live API check.

Agent runtimes and connectors authenticate with credentials you save once. Like everywhere in FrontierStack, those tokens live in the macOS Keychain, never in the app's settings file and never sent to a cloud model.

15.8.1Cursor Origin (Early Beta)

Version Control ▸ Cursor Origin is a live dashboard for Cursor's Git forge. Enter the codebase name shown at cursor.com/codebase. FrontierStack lists up to 30 repositories and the open pull requests in the first 12. Repository rows open in Origin. The preferred personal login is Cursor's own origin auth login; FrontierStack calls origin api and never receives the user credential. For automation, the same pane and Repository Connectors can use a service-account API credential or a short-lived Origin installation token from the Keychain.

WarningCursor marks Origin and its API as Early Beta. Installation tokens start with oit_ and expire within 15 minutes. An Origin App installation cannot access a repository mirrored into Origin from GitHub, so use FrontierStack's GitHub connector for that repository. Review the connector after Cursor API or CLI updates.
SecurityRepository Connector credentials can grant an agent write access to your code. Scope each credential to the repositories it needs and no more, and revoke it at the provider the moment a runtime is retired. The connector's live check confirms the credential works; it does not narrow the provider-side grant. For Origin, prefer repository:contents:read until the agent must push, then add repository:contents:write only for the selected repositories.

15.3Work sessions, T3 workers & the built-in terminal

Work ▸ Sessions is the manager for goal-driven ops and SaaS loops you build yourself — one-shot or recurring. A session has a plain-English goal, title, step budget, and a switch for whether it may make changes. Each session drives the same guarded tools as the Administrator (Chapter 13) and streams every step to a transcript you can stop at any time; scripts are never permitted from a session loop.

FrontierStack identifies a T3 Code worker only when 127.0.0.1:3773/.well-known/t3/environment returns a valid environment receipt. A generic Node process or open port does not count. Discovery is read-only and loopback-only: it does not expose the T3 server, pair FrontierStack, or grant access to T3 threads and approvals. A T3 mark appears on that server in the macOS and iOS fleet lists. For a remote worker FrontierStack reports only that it is present.

15.8.2T3 Code on this Mac

The T3 Code pane in Agent Platforms follows ~/.t3/userdata/server-runtime.json to the local server, which moves up from :3773 when that port is taken, and reads its public environment descriptor: version, uptime and process id.

  1. Open the T3 Code pane. If T3 Code isn't installed, Install / run offers brew install --cask t3-code, npx t3@latest, a headless t3 serve and t3 service install for a background LaunchAgent.
  2. Click Connect read-only. FrontierStack runs t3 auth pairing create for a one-time credential that expires in five minutes, and exchanges it for a token limited to orchestration:read. If only the desktop app is installed, open Connect with a pairing link and paste a pairing link from T3 Code's settings instead.
  3. The pane now lists threads waiting for you (an approval or a question), working and failed, with project, provider, model and branch; today's tokens and estimated cost by model; and the CPU and memory of T3 Code and every agent it runs.

Threads waiting for you also appear under Activity ▸ Needs You, on the paired iPhone, and on the AI Agents board of the Server Activity window, where T3 Code gets a tile with CPU and memory like a server's. Approvals are answered in T3 Code itself.

SecurityThe token can read threads, usage and processes, but it can't start work, answer an approval, open a terminal or change access. FrontierStack refuses to keep a token that T3 issues with more than read access, and warns about a pasted token that can do more. The token is kept in the Keychain, sent only to that T3 Code server, and lasts 30 days. Forget token removes it; revoke it in T3 Code as well if it may have been copied.

15.8.3Rex

Rex is a terminal multiplexer from Superlogical, built on libghostty and currently in beta. One rex binary is both the server and the CLI. The Mac app has its own local server, and Linux and FreeBSD machines can run servers, so sessions keep running with nothing attached. The pane links to Rex's installers rather than piping one to a shell: get the Mac app from superlogical.com/rex, and follow Rex's Linux instructions, which let you review the installer first. Debian and Ubuntu ship an unrelated Perl tool also named rex; FrontierStack tells them apart and says so when it finds the other one.

The Rex pane in Agent Platforms reads a server with the rex command, on this Mac or, through its SSH field, on a linked server. It shows the server's version and uptime, its sessions, the programs that report they are waiting for you (an approval, an answer or a sign-in), working or failed, and the coding agents running under it with CPU and memory. Those programs also appear under Activity ▸ Needs You and Running, in the sidebar's attention badge and on the paired iPhone. The AI Agents board of the Server Activity window has a tile for this Mac's Rex and for each server running Rex, and the server's Overview gets a Rex card. Such a server carries a Rex server badge on the Mac and iPhone and appears under Rex servers in the Runtimes list. A stopped server is normal and isn't an alert: a personal server exits when its last session ends.

SecurityEvery check sets REX_AUTOSTART=0, so it never starts a server. FrontierStack reads session labels, block labels and the status programs report about themselves with Rex's status protocol (OSC 7501), so a program that doesn't use it won't appear. It never reads what's on screen, and it can't type into a terminal or answer a prompt: answer those in Rex.

From the pane you can create a session (rex new) and, after confirming, end one by its ID (rex kill). There is no rex attach command: only Rex's own app attaches, so open a remote server's sessions with Add Remote Host… in the Rex app. Set Up Rex for Agents runs rex skill setup in a visible console, only when you click it, and the pane shows rex skill status. That command adds Rex's skill and hooks to Claude Code, Codex, OpenCode and Pi on this Mac and changes those agents' settings files, so read its plan in the console. For FrontierStack's own tools, see the Rex row in the MCP chapter.

15.8.4Ghostty

The Ghostty service pane (Fleet & Remote) can make Ghostty the terminal for Open in Terminal. With Ghostty 1.3 or later, commands open through its AppleScript API and macOS asks once for permission to control Ghostty; older versions, or macos-applescript = false, open a script file, and Ghostty asks you to confirm each one. Use Ghostty's Theme in the In-App Console, also in Terminal Style as Use Ghostty's Current Theme, reads your Ghostty config and the theme it names, using its light or dark variant to match this Mac. Your config is only read.

A server that doesn't know xterm-ghostty shows “missing or unsuitable terminal” in tmux, vim and clear over SSH. Under SSH to servers, Install copies Ghostty's description to that login with tic -x (~/.terminfo, or system-wide for root) and changes nothing else. Or add shell-integration-features = ssh-env,ssh-terminfo to Ghostty's config and let it do this when you connect.

15.8.5Shells and durable terminal sessions

Every Agent Operations worker row has a shell button. FrontierStack opens a login zsh locally, or the server's configured SSH/mosh/SSH3 command remotely, inside the same SwiftTerm PTY used elsewhere in the app. Terminal Style imports iTerm2 (.itermcolors), Ghostty, Alacritty or Warp themes.

The adjacent Terminal Sessions button discovers durable tmux, GNU screen, Zellij and Rex sessions on that host, and shows which of those tools it has and their versions, and each tmux session's client count, last activity and folder. It uses a bounded, read-only inventory and never reads the terminal screen, scrollback, command history, process environment, or commands. You can attach in FrontierStack's real PTY (Rex sessions open from Rex's own app instead), or end one named session after confirmation. Session names and managers are strictly validated, tmux commands target the exact name so ending api can't hit api-staging, and an end is reported successful only after the host confirms that the session disappeared.

The same sheet starts a session: tmux with an optional folder, screen, Zellij or Rex. tmux sessions also offer Attach and Detach Others, Detach All Clients and Rename…. Where tmux is missing, Install tmux uses the host's package manager in a console, where you answer any sudo prompt. The tmux service pane (Fleet & Remote) lists this Mac and every linked server and opens this sheet for each.

On iPhone and iPad, More ▸ Agent Activity provides the paired Mac's status-only view of running agent processes, FrontierStack sessions and jobs, configured runtimes, and detected worker boxes. It deliberately omits prompts, command lines, transcripts, environment variables, terminal contents, and credentials. Servers ▸ Host ▸ Terminal Sessions lists the same durable sessions. Listing and ending use the paired Mac; full-screen attachment is offered only when Direct SSH has installed this phone's key and verified the server identity.

TipGive a recurring session a tight step budget and leave "allow changes" off until you trust it. A read-only loop that just reports ("alert me if disk crosses 90%") is a safe first agent; promote it to a fixing loop only once you have watched its transcripts.

15.4Running local models

You do not have to send anything to a cloud model at all. FrontierStack manages local inference servers and can point the Administrator at one of them. The big three local apps are first-class:

  • Ollama — the simplest local model runner; pull and serve models, and select one as the Administrator's engine.
  • LM Studio — the LM Studio pane detects the install, lists loaded models and what is downloaded via the lms CLI, and shows "N models loaded" or "no model loaded" in its header.
  • LocalAI — a self-hosted, OpenAI-compatible server you run as a catalog service on port 8080.
  • MLX pane: MLX-LM, oMLX and Splash — three ways to serve a model on Apple silicon from one pane. oMLX (jundot/omlx) is a full inference server with continuous batching and a RAM-plus-SSD KV cache, run from its menu-bar app or its own omlx start CLI; install the app from its GitHub releases or with brew tap jundot/omlx https://github.com/jundot/omlx then brew install jundot/omlx/omlx. The pane shows whether its server is up on port 8000, which models it serves, and opens its dashboard and chat. Splash (Inco AI) is installed with brew install incoai/tap/splash and started from the pane on port 8100, so it does not collide with oMLX on 8000; it serves both OpenAI and Anthropic APIs and needs an M3 or newer, macOS 26.4 and 36 GB of memory.

Beyond these, the AI / LLMs category carries the whole self-hosted-inference shelf — vLLM, llama.cpp, Apple's MLX-LM server, Jan, LiteLLM (a proxy fronting 100+ providers), Open WebUI, AnythingLLM, PrivateGPT and RAG/vector tooling. The point of running one locally is privacy and cost: when the Administrator's engine is a local model (Ollama, a loopback endpoint, or Apple's on-device model), nothing is redacted because nothing leaves your Mac — the secret-scrubbing that protects cloud engines simply is not needed.

SecuritySecret redaction only runs for external engines. A local engine sees your prompts and tool output in full — which is fine, because it runs on your own hardware. The privacy win of a local model is precisely that the data never leaves the machine; treat that as a feature, and keep the model host as trusted as the Mac itself.

15.5Code sandboxes & browser automation

Agents need somewhere safe to run code and a way to read the live web. FrontierStack manages both.

For code, the E2B pane manages secure cloud sandboxes via the e2b CLI: enter an API key (stored in the Keychain as E2B_API_KEY, or authenticate once with e2b auth login), then list, spawn from a template, and kill running sandboxes — with a Kill All for housekeeping and an "include paused" toggle. A green dot marks running sandboxes; orange marks paused. It is the disposable, isolated machine an agent uses so its code never touches your servers.

For the web, the AI category includes browser and crawl tooling: Browserbase (managed headless browsers), Crawl4AI, Firecrawl and Apify for turning sites into clean, model-ready text, plus Playwright for scripted automation. These give an agent eyes on pages that have no API.

WarningSandboxes you spawn keep billing until you kill them. After a burst of agent work, open the E2B pane, toggle Include paused, and use Kill All so nothing is left running on the clock. The same discipline applies to any cloud crawl service with per-request pricing.

15.6GPU infrastructure & clusters

If your AI runs on real GPUs, the GPU Fabric pane gives you read-only health of the hardware. Pick a linked server and run diagnostics over SSH: GPU inventory and temperature (nvidia-smi), NVLink status, the GPU topology matrix, NVSwitch Fabric Manager health, DCGM inventory (dcgmi), InfiniBand and RoCE/RDMA links, Slurm GPU allocation, and composable-fabric CLIs (WEKA, Liqid, GigaIO). The GPUs live on Linux hosts, so this targets a server in your fleet; on a non-GPU machine the tools simply report "not found". Run one check or Run All Checks at once.

GPU thermals and load on a host are also surfaced through the standard host monitors (Chapter 8) when an agent is installed, so a GPU box that overheats raises an alert like any other machine. For scale-out, the AI Clusters category carries Exo (run one model across several of your Macs), Petals, Distributed Llama, Ray, Slurm and Run:ai; the ML Workbench category carries the experiment-tracking and pipeline tools (MLflow, ClearML, Weights & Biases, Kubeflow, JupyterLab) for the training side of the house.

15.7AI governance & safety

Running agents in production means watching what they do and bounding what they can. FrontierStack catalogs the AI Governance & Safety shelf so these tools sit alongside the runtimes they observe: Langfuse, Helicone and Arize Phoenix for LLM observability and tracing; Promptfoo, Ragas and garak for evals and red-teaming; Guardrails AI, NeMo Guardrails and Lakera Guard for input/output validation and prompt-injection defence; and governance platforms such as Credo AI and Holistic AI. Install and monitor them as catalog services; they are the audit trail and seatbelts for the agents on the boards above.

Why a governance shelf
An agent that can act is only as safe as its guard-rails. Tracing (Langfuse) tells you what an agent did; evals (Promptfoo) tell you whether it still behaves after a change; a prompt-injection firewall (Lakera) stops a hostile web page from hijacking it. FrontierStack does not replace these — it gives them a home next to the runtimes, so the stack you run and the stack that audits it are one click apart.

15.8The AI cost monitor

Running an assistant, your own agents, several local models and outside harnesses means spend in several places. AI Model Costs pulls it into one view. The header shows this month's total and the percentage of budget; a colour-coded bar turns orange at 80% and red at 100%. The AI tool get_ai_costs exposes the same figures to the Administrator.

The dashboard tracks four streams together:

  • Metered API spend, per provider and model, computed from an editable price table (USD per million tokens), or entered directly from an invoice. Connect Accounts auto-pulls month-to-date spend from OpenAI, Anthropic, OpenRouter, DeepSeek, Fish Audio (worked out from its wallet: top-ups minus remaining credit) and a self-hosted LiteLLM proxy — several accounts per provider, each its own cost line. Apify sits beside them: its platform spend is read per day and summed for the calendar month, using the Apify pane's token unless you give the account one of its own.
  • Every recurring charge you have, not just AI. Presets cover the common AI plans, cloud and hosting (Cloudflare, Vercel, DigitalOcean, Hetzner, Backblaze…), SaaS tools (Apple One, Google Workspace, 1Password, Figma, Adobe…) and yearly costs like domain renewals, Apple Developer and TLS certificates — and you can type any name at all, so a service with no API is tracked exactly like one the app can query. Each entry is billed weekly, monthly or annual; the row shows what you actually pay while the totals normalise to a monthly figure. Entries group by category with their own subtotals, the header carries both monthly and annual totals, and toggling a row off excludes it from the totals without deleting it — useful when you are working out what to cancel. Your FrontierStack licence is added automatically, priced from your tier.
  • Local CLI usage — a one-click scan of this Mac's Claude Code and Codex logs sums the month's tokens per model as an estimate.
  • Decision models — TypeSafe's Jev, Cloudflare's Clef / Clef-flash and OpenAI Decisions (gpt-6-luna, using your OpenAI key) answer typed questions with probabilities rather than text and bill input tokens only. Their keys live in AI Models › Decision Models (never in the chat-model pickers); every call FrontierStack makes is logged here automatically from the token count in the response, one line per model per month, and the AI Models row shows this month's tokens and cost. KeyRotate syncs both keys.

Costs arrive in whatever currency each service bills — a US SaaS in dollars, a European registrar in euros, the FrontierStack licence in yen. Every entry keeps its native amount and currency, and the totals convert everything to your chosen display currency. Exchange rates are editable and dated, refresh on demand from the ECB daily fixing, and re-price history instantly when changed — budgeting estimates, not accounting entries. Most service panes also carry a Plan & Cost section, so you can record what you pay right where you manage the service and it lands in these totals immediately.

Any subscription can carry a renewal date. Once it has one it appears under Upcoming Renewals and raises an Alert when it enters the reminder window — seven days by default, adjustable per row — on the same path as domain and TLS expiry. An auto-renewing row rolls its date forward on its own, catching up even if the Mac was off for months; a manual one stays put and reads as overdue, because nothing charged you. Mark a row a free trial and it counts nothing toward the totals until the day it converts, then warns you before it bills. Mark one cancelled from a date and it keeps counting until that date and then stops, so the saving lands when it really lands; naming what replaced it nets the replacement off, so a $20 plan swapped for a $15 one reads as $5 saved rather than $20. Changing a price through the renewal editor records the old one, so a plan that has crept up is visible as having crept.

If you already track subscriptions in Wallos, the open-source self-hosted tracker, you do not have to type them twice. Add Wallos from the catalog, point the pane at your instance with an API key from its profile page, and Import into Spend & Billing copies its subscriptions in — price, currency, billing cycle, next payment and cancellation date — where they join everything else in one total and earn the same renewal alerts. Re-importing updates the rows it created rather than duplicating them, so it is safe to run whenever Wallos changes. FrontierStack only reads from Wallos; it never writes back, so a mistake here cannot touch your data there.

A by-provider breakdown (donut chart), a six-month trend with the budget line, and an Ask AI button that hands your spend to a cost-optimisation advisor round it out. A billing-health watcher probes connected paid services for out-of-credits, hard-limit, past-due or suspended states and raises an alert — catching a key that is about to stop working before it does. Spend-threshold alerts complete the picture: crossing 80% or 100% of the monthly budget raises an alert (recovery included), each synced AI account can carry its own monthly limit, and DigitalOcean, Vultr and Linode panes read this month's charges from the provider API with a threshold of their own.

Key Usage Watch (Spend & Billing) warns when an AI key is used by someone else. AI vendors never report where a call came from, so every 15 minutes it reads Anthropic, OpenAI and OpenRouter usage per key with the admin keys you already connected, and compares it with what this Mac sent: FrontierStack meters each call it makes per key (only a fingerprint of the key is stored), and can count local Claude Code and Codex use too. Usage nothing here accounts for — especially while the Mac was asleep — an hour far above a key's normal pattern, a model the key never used, any use of a key marked Idle, or usage on a key you don't store raises an alert with a Rotate key… button. KeyRotate reads the same metering from FrontierStack and also checks AWS Bedrock caller addresses in CloudTrail.

Each stored key is tied to the vendor's key list by matching the masked value the vendor shows. When a key reads as not matched, or two look alike, type its id into the key's Tracking ID field — OpenAI's Tracking ID (key_…) from the API keys page, or Anthropic's apikey_…. It is not a secret, and the field refuses anything shaped like a key. A paired KeyRotate keeps these ids in step with its own (by key fingerprint; the newest edit wins), and it can revoke a key's replaced keys by id at OpenAI, Anthropic, OpenRouter, Mistral, Fireworks, Linode, AWS IAM and Paddle.

screenshot to be added
Figure 15.2. AI Model Costs: month-to-date total against a colour-coded budget bar, a per-provider donut, the subscriptions list and the six-month trend.Capture: open AI Model Costs with several providers logged and a couple of subscriptions active, so the breakdown donut and trend chart are populated
TipSet a realistic monthly budget first — the bar and the budget line on the trend only mean something against one. Then connect your OpenAI and Anthropic admin keys for auto-sync, add your flat subscriptions, and the dashboard becomes a single honest answer to "what is AI costing me this month?"
SecurityCost auto-sync needs an org admin key for OpenAI/Anthropic (their cost APIs require it). That key is powerful — store it only here, in its account row under Connect Accounts (not in AI Models, whose fields take ordinary keys). It lives in the Keychain and is used only to read: spend, and the expiry countdown and rotation of that provider’s ordinary keys. With KeyRotate paired it is also kept in KeyRotate as an Admin key, both ways. Mistral’s admin API key and OpenRouter’s management key have their own fields under AI Models ▸ Admin Keys. Do not reuse an admin key as an agent runtime's inference key; give runtimes their own narrowly-scoped keys via the Model Router.

Part V

V
Business & Reference

Tailoring FrontierStack to a vertical, then the practical book-end: settings, licensing, updates, shortcuts and troubleshooting.

16

Chapter 16

Business & Vertical Solutions

FrontierStack already speaks the language of more than a thousand services. A preset reveals the handful that matter to your business — and a few panes turn them into a working back office.

The catalog in Chapter 6 is deliberately enormous. No single business runs a graph database, a render farm and a hotel channel manager at once — so the point of this chapter is not breadth but focus. FrontierStack ships with presets and saved Setups that hide everything irrelevant and surface the dozen or so services a particular line of work actually needs. This chapter walks the verticals the app is tuned for and shows which services each one reveals.

Think of it as a lens, not a new product. The web stack, monitoring, scripts and the AI Administrator you met earlier do not change; a preset simply decides what you see first.

16.1Presets, Setups and the vertical lens

Two mechanisms tailor the app. Presets are built-in starting points: choose Presets ▸ Drop-shipping or Presets ▸ Small Business and the sidebar reshapes to that trade — the right service categories appear, an opinionated set of monitor panes float, and the noise of the other 900 services recedes. Setups are your own saved snapshots of that view (which services are shown, which are pinned, the floating-palette layout, and an optional network location to bind it to). You build them in the Setups pane and flip between them from the Presets menu, exactly as covered in Chapter 3.

The workflow is the same for every business below: apply the preset, set up the two or three services you actually use (paste an API key, enable a channel), and save the result as a Setup so you can snap back to it after a detour into "show everything".

TipAsk the AI Administrator to do the tailoring for you. Tell it what your business is — "I run a short-term rental with three listings" — and it can reveal the matching categories, enable the relevant monitor panes, and explain what to connect. It reshapes the same sidebar you would edit by hand.

16.2The Small Business preset

This is the classic macOS Server use case, modernised: a single Mac mini running the back office for a shop, studio or practice. The Small Business preset reveals the categories a storefront depends on, every one of them self-hostable on the Mac in front of you, with the backups, monitoring and hardening from Parts II–III underneath.

NeedServices revealed
Point of saleSquare (built-in pane), Toast, Lightspeed, Floranext
CRM & loyaltySuiteCRM, EspoCRM, Odoo CRM (self-hosted); HubSpot, Zoho, Pipedrive; Square Loyalty, VoucherVault
E-commerce & CMSWooCommerce, Medusa, Saleor; WordPress, Drupal, Ghost; Stripe / PayPal / Square checkout
Mailing listsListmonk, Mautic (self-hosted); Mailchimp, Brevo, SendGrid
Mail serverThe built-in Mail Server pane, mailcow, Modoboa, with SPF/DKIM/DMARC tooling
CalendarsRadicale, Baïkal, SOGo (CalDAV/CardDAV); the Calendar Health pane
AccountingERPNext, Xero, QuickBooks, freee, Money Forward
HelpdeskZammad, osTicket (self-hosted); Freshdesk (live ticket counts)

Several of these are more than catalog entries. The CRM, helpdesk, store and mailing-list services with simple, key-based APIs surface live metrics in their pane — Freshdesk shows open/pending/overdue tickets, Shopify shows open orders, Mailchimp shows subscriber totals — and you can switch on "Alert me" with a threshold so a backlog reaches you on your usual channels (Chapter 11).

SecuritySelf-hosting your customer data on a Mac you own means the data-protection burden is yours too. Before you go live, walk Chapter 10: TLS on every site, the firewall closed to everything but what you publish, encrypted backups off the box, and the mail server locked against open relay.

16.3Hospitality & short-term rentals

For vacation rentals and small hotels, FrontierStack includes a built-in Channel Manager pane (category PMS) that turns your property-management platform into a live dashboard. It is the engine room of the hospitality preset.

Open Channel Manager and, under PMS Health, enable the one platform you run and paste its credentials — the field labels adapt per platform: an Account ID for Hostaway, an API key for Lodgify, a client ID + secret for Guesty, a Bearer token for Cloudbeds, an API token for Beds24, or an Application Access Key for a custom AppSheet app you built yourself. Check confirms the API endpoint is reachable; Sync pulls live reservations, and the Reservations (Platform API) section lists guests, channels, dates and totals, with revenue and an occupancy dial at the top.

Right below it, OTA Health lists every OTA — Airbnb, Booking.com, Vrbo, Expedia and the rest. OTAs offer no API without partner approval, so Check fetches the channel’s iCal export, confirms it is a real calendar and counts its reservations; with no iCal URL set it confirms the extranet responds instead. Every Sync Calendars refreshes these dots as a side effect.

Not every OTA needs a platform API. The Calendar Sync section ingests each channel's iCal export — point a channel at its iCal URL, or Import from ICS Feeds to pull in the Airbnb, Booking.com, Vrbo and Expedia feeds you added in the ICS Feeds pane — merges them into one calendar with no API key at all, and lets you Save or Copy the combined .ics to share to Apple, Google or Outlook.

Turnovers close the loop. The Cleaning & Turnovers — Turno section either connects Turno's API directly or, more simply, lets you Copy reservation iCal for Turno — add that calendar inside Turno and it auto-books a clean from every check-out.

Quiet hours can be watched too. Connect Minut noise and occupancy sensors in the Minut pane and FrontierStack alerts when a noise disturbance is in progress, when a sensor goes offline, or when its battery runs low. These alerts go through Alerts, so a contacts preset can reach the property manager on duty. Minut has to grant API access to your account first (it ties this to its Enterprise plan).

If your direct-booking site is built with Lodgify, the Lodgify Website Domain section points your own domain at it. Add the domain in Lodgify (Website Builder ▸ Settings ▸ Domains) and paste the DNS records Lodgify shows. FrontierStack detects where the domain’s DNS is hosted (Cloudflare, DNSimple, GoDaddy or Hostinger), sets the records after you confirm, and checks them against public DNS and HTTPS. On Cloudflare the records stay DNS-only so Lodgify can issue the certificate. Changes can take up to 48 hours to spread.

screenshot to be added
Figure 16.1. The Channel Manager pane: occupancy dial and revenue at the top, live platform reservations below, and the connection panel for Hostaway, Lodgify, Guesty, Cloudbeds, Beds24 or a custom AppSheet app.Capture: open Channel Manager with one platform enabled and a few synced reservations showing, occupancy dial visible

16.4Drop-shipping & e-commerce fulfilment

The Drop-shipping preset reveals five purpose-built categories — Sourcing & Suppliers, Print-on-Demand, Shipping & Fulfillment, Inventory Sync and Profit Analytics — alongside your e-commerce platform and SEO tools, and floats the Drop-shipping Health monitor.

StageServices revealed
Sourcing & suppliersAliExpress, Alibaba, CJdropshipping, Spocket, Zendrop, SaleHoo, DSers
Print-on-demandPrintful, Printify, Gelato, Gooten
Shipping & fulfilmentAfterShip, ShipStation, Easyship, Shippo, Pirate Ship
Inventory syncSkuVault, Cin7, Zoho Inventory, Katana, zaiko Robot
Profit analyticsTriple Whale, Lifetimely, BeProfit

The live piece is delivery tracking. Drop-shipping Health reads AfterShip's tracking API directly (store your key once) and tallies shipments by state — in-transit, delivered, pending, and a problem list of the ones stuck or exception-flagged — so a stalled package surfaces before the customer emails. The inventory, marketplace and profit sections are framed placeholders that light up as you connect their catalog services; AfterShip is wired live today, with the others reachable through their own panes.

NoteRun the storefront itself — WooCommerce, Medusa or a Shopify connection — mail, and analytics on the same Mac, all monitored. The preset is the lens; the rest of the manual is how you actually serve and secure those services.

16.5Education

Schools and campuses live across a different set of categories. There is no single "education preset" button, but the catalog groups the pieces cleanly, and a Setup pins exactly the ones your institution uses.

FunctionServices revealed
Student informationPowerSchool, Infinite Campus, Veracross; openSIS, RosarioSIS (self-hosted)
Learning managementCanvas, Schoology, Google Classroom; Moodle, Open edX, ILIAS, BigBlueButton
Digital libraryKoha, DSpace, Greenstone (self-hosted); EBSCOhost, JSTOR, ProQuest
Campus & school opsSlate & OpenApply admissions, FACTS tuition, StarRez housing, FET timetabling, ParentSquare

The open-source members of each row — Moodle, Koha, openSIS — are full self-hosted web apps you can run on the stack from Chapter 4, monitored and backed up like any other site. The cloud members are reached through their credential panes for at-a-glance status.

16.6Business messaging & customer comms

Reaching customers where they already are is its own category. Business Messaging collects the store-to-customer channels that matter region by region: WhatsApp Business, LINE Official Account, WeChat and Zalo official accounts, KakaoTalk Channel and AlimTalk, Messenger, Instagram DMs, plus inbox and bot tools such as Intercom, ManyChat, Respond.io, WATI and Gorgias.

Three of these carry a live reachability check today — WhatsApp Business surfaces its verified name and quality rating, Intercom and ManyChat confirm the token works — while the rest capture credentials and a deep link to their console. The AI Administrator can see this picture too: its get_messaging_channels tool reports which channels are connected and which alert gateways can actually send, so you can ask it to confirm where a broadcast could go.

16.7Calendars, Accounts & Apple services

A Mac-based business is also an Apple business. Several built-in panes manage the parts of Apple's ecosystem that touch your servers.

  • Calendars. Calendar Discovery scans common CalDAV ports (Radicale 5232, Apple 8008/8443, SOGo 20000, 80/443) and the /.well-known/caldav path; add an endpoint to Calendar Health to keep it watched. This is the path to keep an old macOS Server CalDAV alive, or to stand up Radicale or Baïkal fresh.
  • Accounts. The Accounts pane reads Open Directory and LDAP, and can migrate exported entries into a target directory via ldapadd — the bridge for moving users off legacy Apple directory servers.
  • Apple services. The Apple Services pane reports the signed-in Apple Account, which iCloud+ services are enabled, and Find My Mac status — a quick audit of what this machine is tied to.
  • Apple Home. Because HomeKit's database is private to system apps, the Apple Home pane drives it through the Shortcuts bridge: any scene or automation you wrap in a Shortcut with a Home action becomes runnable from FrontierStack, useful for tying premises automation to your ops. Its Home Hubs list shows which HomePod or Apple TV is running each home right now and which are on standby.
Why iCal beats an API
Calendar (iCal) sync is the quiet workhorse of hospitality and scheduling. It needs no API key, every OTA and calendar app speaks it, and it degrades gracefully — a feed that breaks simply stops updating rather than taking your bookings down. When a platform API is available it gives you richer data; when it is not, iCal still gets availability flowing.

16.8Accounting, healthcare, AV & print

A few more verticals round out the catalog, each surfaced as a category you pin into a Setup:

  • Accounting & ERP. ERPNext self-hosted; Xero, QuickBooks, freee, Money Forward, Plaid and Expensify by API — the books beside the storefront.
  • Healthcare. Open-source clinical systems for practices that self-host: OpenEMR, OpenMRS, GNU Health, LibreHealth, the Orthanc DICOM/PACS server, and Japan's OpenDolphin and ORCA. Treat these with the security discipline of Chapter 10; patient data raises the stakes.
  • AV & Stage. For venues and production: the Show Network pane, which supervises DJ players, lighting, LED, NDI and timecode and alerts when anything drops off once a show is armed (Chapter 9), and the AV Feeds pane, plus Dante audio-over-IP, Q-SYS, QLC+ and grandMA lighting, OBS, NDI, Resolume, digital signage and Chromecast control — the show and the network behind it in one window. The Clubs & Bars and Stage & Shows presets reveal it all; the Show Supervisor add-on brings it into any other setup.
  • Print Production. A built-in pane for print and pre-press shops, sitting in the Fleet & Remote group alongside the render farm.

None of these is a deep how-to here — the per-service detail lives in Chapter 6. The job of this chapter is to show that whatever your business is, FrontierStack already knows the services it runs on, and a preset or Setup is all it takes to reveal exactly those and nothing more.

screenshot to be added
Figure 16.2. The Presets menu and the Setups pane side by side: built-in verticals on the left, the user's own saved views with the active one ticked on the right.Capture: open the Presets menu over the Setups pane with two or three custom Setups listed and one marked active
17

Chapter 17

Settings, Licensing & Updates

One Settings pane holds every preference; an Ed25519 licence unlocks your tier offline; Sparkle keeps the app current; and a single switch turns telemetry off.

Almost everything you can configure about FrontierStack itself — as opposed to the services it manages — lives in one place: the Settings pane. This chapter is the reference for that pane and for the three systems that surround it: how the app is licensed, how it updates itself, and what it does and does not send back about how you use it. Several of these controls also shape the AI Administrator, so it cross-references Chapter 13; for anything that goes wrong, see Chapter 18.

17.1The Settings pane

Open it from the sidebar, or from the app menu with ⌘, — the standard macOS Settings window is just a signpost with a Full Settings button that opens the same pane, because FrontierStack keeps every preference together rather than splitting them between two windows. The pane is a single scrolling form of grouped sections: General, License & Subscription, Updates, Privacy & Diagnostics, Locations, Text Editor, Images, Menus, Capabilities, and the cloud/backup destinations.

Two General toggles deserve attention because the AI can also set them (below). Run commands in the in-app console is on by default: installs and shell commands stream live in a FrontierStack window and panes auto-refresh when a command finishes. Turn it off to send those commands to Terminal.app instead. Interactive sessions — SSH, REPLs — always open in a real terminal. The companion External Terminal picker (under Text Editor) chooses which terminal app the "Open in Terminal" actions use: Terminal, iTerm, Ghostty and Rex (listed once it's installed) run the command directly, while other apps open an executable .command.

The General section of Settings in dark mode: service visibility, browser and appearance choices, the accent theme, the keyboard focus ring, palette behaviour and launch at login.
Figure 17.1. The General section of Settings in dark mode: service visibility, browser and appearance choices, the accent theme, the keyboard focus ring, palette behaviour and launch at login.

17.2App-setting keys the AI can change

A handful of these preferences are exposed to the AI Administrator through the get_app_settings and set_app_setting tools, so you can simply ask: "switch my default browser to Firefox", or "stop showing the Presets menu". The assistant reads and writes only the keys in the table below — nothing else about Settings is reachable from a prompt.

KeyTypeWhat it controls
defaultBrowserBundleIDbundle idThe browser used by every "Open in Browser" action. Empty = system default.
showInMenuBarboolWhether the global menu-bar item appears.
preferInAppConsoleboolRun commands in the in-app console (on) or send them to Terminal.app (off).
menu.showPresetsboolShow the Presets menu in the menu bar.
menu.showLocationsboolShow the Locations menu in the menu bar.

The last two also live under the Menus section of the pane, alongside the App Settings… (⌘,) button. Hide a menu you never use; show it again the moment you do.

17.3Accounts and advanced settings

Two panes sit just outside Settings but are worth naming here. The Accounts pane (sidebar ▸ Accounts) is not about billing — it connects FrontierStack to a directory service (Active Directory, Microsoft Entra ID, Okta, OpenLDAP, FreeIPA, 389 Directory Server, Jamf or a local/remote Open Directory), tests the binding, and imports user accounts. It also includes an Open Directory editor for managing OD users and groups on a Mac that runs one. Directory work is covered with the rest of identity in Chapter 10.

"Advanced settings" in FrontierStack means the per-site Advanced Settings sheet for a website — the full Apache <Directory> and <VirtualHost> editor (Options flags, AllowOverride, Require rules, ServerAdmin, custom ErrorDocument). You reach it from a site in the Sites pane; anything the form doesn't model is editable through Edit as Text…. It is documented with the web stack in Chapter 7.

17.4Custom Instructions for the AI

The single most powerful "setting" for the AI is not in the Settings pane at all: it is the Custom instructions bar at the bottom of the AI Administrator pane. The text you write there (stored as frontierstack.md) is appended to every AI request — the assistant chat, one-shot Ask AI, skills, and the MCP server — so it is the right place to state persistent preferences once: your preferred language and tone, things the assistant should always or never do, and facts about your setup it should assume.

Click Custom instructions to expand the editor, toggle Add my instructions to every AI prompt, and type. Examples that work well: "Always reply in Japanese", "Prefer Homebrew over Docker", "Never restart MySQL during business hours (09:00–18:00)", "My production fleet host is web1.example.com". Save with the Save button, or open the file in your external editor. Because this file flows through the whole harness chain, it complements — but does not replace — the trust model in Chapter 13: instructions steer the AI's behaviour, while the read-only default and per-action approvals govern what it is allowed to do.

NoteJust above the custom-instructions bar sits the Script secrets (.env) vault. The AI only ever sees a secret's NAME (e.g. DB_PASSWORD); the value is injected as an environment variable at run time and never sent to a cloud model. Reference secrets in scripts as $NAME. See Chapter 13.

17.5Command-Line PATH and Homebrew

Two reference panes from Chapter 2 belong to the same family of app-level controls. The Command-Line PATH pane (sidebar ▸ Command-Line PATH) shows the directories a login shell searches for commands and lets you add your own to a managed block in ~/.zprofile (or the profile you choose); entries you add are prepended to PATH and take effect in a new terminal. The app already deep-resolves tools through the shell, so this is mainly to make commands such as mlx_lm.server resolve instantly. The Homebrew pane installs and updates Homebrew itself and the formulae behind many services. Both are covered in full when you first set up the app; this chapter simply notes that they live alongside Settings as the place to manage the command environment.

17.6Licensing

FrontierStack is a free download with paid tiers. Card payments are taken by Stripe (US dollars) and Square (yen); orders in Korean won and some other payment methods go through our reseller Paddle. Card details stay with the payment company and are never seen by FrontierStack. After purchase you receive a licence code in the form FSK-XXXX-XXXX-XXXX. Open Settings ▸ License & Subscription ▸ Activate License…, paste the code, and this Mac is bound to your plan. Promo codes are applied at checkout on the website.

TierPriceServersNotes
Free modeNot a checkout plan1The built-in fallback without a paid entitlement; limited features.
Standard¥15,000/year or ¥45,000 one-time10Runs on 3 Macs. A 10-pack add-on widens every limit. The one-time purchase receives Lifetime status.
Standard — Bleeding edge¥7,500/year10Campaign subscription for subscriptions started by 31 December 2026, with no price rise while it remains active. New subscriptions from 1 January 2027 are ¥15,000/year.
Full Fleet¥45,000/yearUnlimitedEverything, plus the Wild Frontier update channel. No one-time or Lifetime option.

A Standard licence runs on 3 Macs and covers a defined estate: 10 servers, 5 routers, 5 printers, 10 switches, 10 Wi-Fi access points, 10 locations, 10 KVMs, 10 UPS units, 20 IoT devices and cameras, 20 domains or DNS zones, 25 containers and VMs on servers, and 5 paired iPhones or iPads. Adding a 10-pack increases every one of those by another full allotment and adds one more Mac — so two packs means three times the base and 5 Macs. Full Fleet is unlimited throughout. The complete comparison lives at frontierstack.app/compare.

The section shows your tier, a status pill (Active, Lifetime, Ending, Payment overdue, Ended), the renewal date (or the date a cancelled subscription ends), your licence code and this Mac's server cap. Manage / Renew… and Buy / Upgrade… open the website; the ⋯ menu offers Check status now, Deactivate this Mac and Sign out. Activated Macs lists every Mac using the licence with the date it was activated, and lets you release one to free its slot — deactivating this Mac is immediate, while releasing a different Mac emails the licence owner a confirmation link, so knowing the code is never enough to remove someone else. You can also self-transfer a limited number of times per year; a Mac that loses its seat quietly drops to Free on its next check-in. The same self-serve status and seat list are available on the My Licence web page at frontierstack.app/license. The identical controls also live in a dedicated Licences pane in the Overview group of the sidebar.

When the subscription needs you, a banner across the main window says so: the last renewal payment failed (Update Payment…; the plan keeps working for 14 days after the renewal date while the payment is tried again), it was cancelled and ends within 30 days (Turn Renewal Back On…), or it has ended (Renew…). The same events are emailed to you. A subscription that simply renews shows no banner. To change your card, cancel or turn renewal back on, use Manage billing on the My Account page (frontierstack.app/account.html); subscriptions paid by card in yen are changed through Support.

17.8.1What needs Full Fleet

Standard is a complete product, not a trial: the entire local stack, local sites, DNS and certificates, migration from macOS Server and MAMP, local health and alerts, device discovery, Homebrew and local Docker, database cluster health, remote KVM and power control, the advanced remote agent, the audit and change log, AI diagnosis with proposed fixes, and remote diagnostics one server at a time — all included.

Full Fleet is about doing things to many machines at once, and about letting other systems drive FrontierStack: Fleet Run across every server, Fleet Push and Promote to Production, Service Guardian on remote hosts, AI auto-remediation and scheduled AI reports, fleet-wide security audits, EDR rollups, Kubernetes fleet actions, the production print fleet, router and firewall fleet dashboards, SNMP at scale and PoE cycling, SaaS and business monitoring, cloud inventory and cost rollups, Fleet Skill, iPhone remote control, team and admin controls, alert routing and escalation, container fleet monitoring, GPU workloads, and production deploy workflows. Letting MCP clients and the frontierstack CLI make changes, behind the same approvals, is part of Standard.

NoteFull Fleet features are never hidden on Standard. The pane still opens and you can read it — it is simply dimmed and marked view-only, with an upgrade link, so you can always see what a feature does before deciding whether you need it. Where a feature has a sensible smaller form, Standard gets that form rather than nothing: Fleet Run targets a single server, and the AI Administrator still diagnoses and proposes fixes but does not apply them itself.
NoteSharing servers with another administrator. If two of you run one network, a server does not have to consume a slot on both licences. When a server has the FrontierStack helper installed under a paid licence, its owner can share it from that server's pane (Share with another administrator) using your Mac's device key. The shared server then costs you no server slot. The owner can withdraw access at any time, and the exemption stops immediately if their licence lapses.
SecurityYour licence is an Ed25519-signed token the app verifies offline — no phone-home is needed to keep working. The token carries your tier, server limit and expiry, and is bound to this machine by machine_id = SHA-256(IOPlatformUUID + bundle id), so copying the app to another Mac does not copy the licence. The app trusts the token until it expires plus a grace period, then refreshes; if a paid plan lapses it degrades to Free mode. Lifetime applies only to a one-time Standard purchase and never lapses; Full Fleet has no Lifetime option. This is a deterrent, not heavy DRM — reads keep working; only the limits and premium features are gated.

17.7Updates

FrontierStack updates itself with Sparkle, driven by the in-app UpdateManager. The Updates section of Settings is the whole control surface. Automatically check for updates and Download updates in the background are on by default: a new build downloads silently and then offers an Update button that installs it and relaunches the app. Press Check Now any time; the current version is shown beside it.

The Check for updates menu sets how often the background check runs. Every choice checks at least twice a day. Automatic (the default) checks every 12 hours — about every 4 hours on Wild Frontier — while Twice a day, Every 6 hours, Every 4 hours and Every hour pin a fixed interval, so you can pick up fixes sooner if you want them fast. It has no effect while automatic checking is off, and Check Now always works regardless of the interval.

There are two channels. Stable is the default and ships only when there is enough to justify an update. Wild Frontier delivers frequent, roughly every-other-day bug-fix builds — turn it on if you have requested a change and want the fix fast. To switch, choose it from the Update channel picker. Wild Frontier early builds require a Full Fleet plan; every other plan always receives Stable updates, and the pane tells you so if your tier can't opt in.

TipIf you have just asked for a fix in support and are on Full Fleet, set the channel to Wild Frontier and press Check Now — the fix often lands within a day or two rather than waiting for the next Stable release.

17.8Telemetry & privacy

FrontierStack collects a deliberately small amount of anonymous usage data, and you can switch all of it off. The Privacy & Diagnostics section has two toggles, both on by default. Share anonymous usage analytics sends a small daily ping to frontierstack.app; Send crash reports adds a technical backtrace, and only after you approve the prompt that appears when the app has crashed.

The analytics ping contains a random install ID (no account, no login), the app and macOS version, your hardware model and locale region, your update channel, and whether you used any AI feature. Your country is derived server-side from your IP by Cloudflare. No documents, file contents, configuration, keys, passwords or personal data are ever sent. Crash reports add only a kind, message and stack trace, written locally first so you can decline before anything leaves the Mac.

NoteTo opt out completely, turn off both toggles in Settings ▸ Privacy & Diagnostics. The change takes effect immediately and the random install ID is never tied to your identity. The administrator-only diagnostics dashboard described elsewhere is local to the publisher and aggregates only these anonymous signals.

Two more sections round out the pane: Capabilities exports CAPABILITIES.md and capabilities.json — a complete, live description of every service and AI tool — for handing to an external AI engine; and the Cloud Services, Backups (Local Git), Amazon S3 and Cloud Sync (rclone) sections configure where settings backups and site files are stored. With Settings, licensing, updates and privacy understood, turn to Chapter 18 for keyboard shortcuts, the URL scheme and troubleshooting.

18

Chapter 18

Keyboard, URL Scheme & Troubleshooting

The fast paths and the safety nets: shortcuts, deep links, the app's own logs, and a calm answer for the handful of things that go wrong.

This closing chapter is the reference you reach for when you already know what FrontierStack does and just want to do it faster — or when something is red and you want the shortest route to green. It collects the keyboard shortcuts, the frontierstack:// URL scheme, where the app keeps its own logs, and a symptom-to-fix table for the problems that actually come up. None of it is essential reading; all of it saves you time.

18.1Keyboard shortcuts

FrontierStack is a native Mac app, so the system shortcuts you already know — ⌘W to close a window, ⌘, for Settings, ⌘Q to quit — all work. On top of those, the app adds a small, deliberate set of its own. The philosophy is restraint: most actions live on clearly labelled buttons, and almost every dialog follows the Mac convention that Return confirms and Esc cancels, so you rarely need to memorise anything.

ShortcutDoesMenu equivalent
⌘FOpen the Search palette — find any service, tool, pane or action by name and jump straight to it.Toolbar magnifying-glass button
⌘?Open the in-app Help window.Help ▸ FrontierStack Help
⌘⌥⇧WClose all floating palettes at once.Palettes ▸ Close All Palettes
ReturnConfirm the default button in any sheet (Save, OK, Add, Install…).The highlighted button
EscCancel or dismiss the current sheet or palette.Cancel / Done button

The menu bar carries the rest of the app's reach: dedicated Services, Locations, Monitors, Presets and Palettes menus let you switch a service, change location, toggle a monitor, apply a saved preset or pop out a floating palette without leaving the keyboard. Because these are real menu commands, macOS lets you assign your own shortcut to any of them under System Settings ▸ Keyboard ▸ Keyboard Shortcuts ▸ App Shortcuts — add FrontierStack, type the menu item's exact name, and pick a key.

When several windows or palettes hide one another, choose Palettes › Organize Windows & Palettes. FrontierStack tiles the visible, resizable windows on each connected display independently, using the area outside its menu bar and Dock. Full windows get the main area, floating palettes use a side rail where space permits, and mini palettes remain compact. Windows stay on their current display; confirmation, approval and other temporary panels are not moved. The resulting palette frames are saved with the active Setup like any manual layout.

Tip⌘F is the one shortcut worth committing to memory. With more than a thousand services and a hundred-plus tool panes, scrolling the sidebar is slow; the Search palette is instant. Type a few letters of a service, a port number, or a keyword like firewall and press Return.

18.2The frontierstack:// URL scheme

FrontierStack registers the frontierstack:// URL scheme, which deep-links straight to any pane, server or service. Opening such a URL brings the app to the front and navigates — expanding the right sidebar group and scrolling to the destination. This is how a link in a note, a Shortcuts action, or a line in a script can send you (or a teammate) to exactly the right screen.

From Terminal you trigger one with open; from Shortcuts use the Open URLs action; in a note or web page it is an ordinary link. The forms are:

URLGoes to
frontierstack://server/<name-or-id>That fleet host's pane (falls back to Local Health if unknown).
frontierstack://website/<domain>The Sites pane.
frontierstack://container/<name>The Docker pane.
frontierstack://pane/<Name>Any pane by its display name, e.g. pane/Security, pane/Apache, pane/Alerts. Spaces are URL-encoded (%20).
frontierstack://service/<catalog id>A catalog service by its id.
frontierstack://kube/<context>A Kubernetes context (or the Clusters pane with no argument).
frontierstack://security · ://alerts · ://healthShortcuts to the Security, Alerts and Local Health panes.
frontierstack://device/<id> · ://wifi/<ssid> · ://zone/<id>A discovered device, a Wi-Fi network, a Cloudflare zone.
frontierstack://open?sel=<raw>The exact escape hatch: an internal selection value that round-trips precisely.

A few worked examples:

open "frontierstack://pane/Security"
open "frontierstack://server/mac-mini-office"
open "frontierstack://website/example.com"

Deep links are the connective tissue of automation in FrontierStack. A preset can include a link that jumps to its dashboard; a runbook in Notes can link each step to the pane where you carry it out; an alert message can point at the failing service. The same scheme also names two read-only resources for AI — frontierstack://capabilities and frontierstack://health — that the MCP server exposes (see Chapter 14).

SecurityDeep links obey the App Lock. While the app is locked, an incoming frontierstack:// URL brings the window forward so you can unlock, but it will not navigate — external automation cannot move the app around behind the lock screen.

18.3Reading the app's own logs

The Logs pane reads any machine, not just this Mac: a Machine picker at the top switches to a linked server, whose logs are fetched over SSH — or through its FrontierStack monitor where one is installed, which runs as root and so reaches privileged logs without sudo. The source menu lists the services actually running on the chosen machine first (Apache, Nginx, MySQL, PHP-FPM, PostgreSQL, Redis, Ollama), then any other log files it finds, and finally crash reports and diagnostics — the .ips, .crash and .panic files Console shows, newest first, from both the user and system DiagnosticReports folders.

When you need to know what FrontierStack itself did — not what a service did, but the app — there are three places to look, in increasing depth.

  • The Change Log (Audit). The Logs pane includes a Change Log that records every setting and configuration change with the responsible actor: User, the AI Harness, the Web control panel, MCP, or Automation. If a service goes down, this tells you exactly what touched it and who or what was responsible — the fastest first question in any incident.
  • The in-app console. Installs and shell commands run in a real terminal window inside the app (a PTY, so password prompts and y/n questions work), streaming live output. Because the app knows when the command finishes, it refreshes the pane that launched it. You can export a console transcript from its actions bar. Theme it under Terminal Style in Overview.
  • The log files. FrontierStack writes its own log to ~/Library/Logs/FrontierStack. Open that folder in Finder, or read it in Console.app, when you want the raw record — it is the most detailed account of what the app was doing. The Auto-export feature (Overview ▸ Settings) can copy these logs, your change-log and settings backups to a folder on a schedule.
NoteThe AI Administrator can read the same log for you. Its read_log tool accepts a source of "frontierstack" to tail ~/Library/Logs/FrontierStack, "os" for the system log, or a service name like "nginx" or "postfix". On a linked server it reads over SSH, and output is capped and secret-redacted before any of it reaches a cloud model (Chapter 13).
screenshot to be added
Figure 18.1. The Logs pane: a server's error log on the left, the app's own ★ Change Log (Audit) on the right, each entry tagged with the actor — User, AI, Web, MCP or Automation.Capture: open the Logs pane with the Change Log visible, showing a mix of actors

18.4Common problems & fixes

Most trouble in FrontierStack is one of a small, familiar set, and the app usually offers the fix as a button rather than a chore. The table below maps the symptom you see to the shortest route back to green.

SymptomLikely causeFix
A service won't start.A port is already in use, the binary isn't installed, or the config is invalid.Open the service's pane and read the status detail. Use Ports in Use to find a conflict; install or repair via Homebrew; for web servers, validate the config before reloading. The AI Administrator's repair_service can diagnose and fix common cases on your approval.
A linked server's status dot is red: "Permission denied (publickey)".The server was reinstalled, its host key changed, or the app's SSH key was never installed.Run Repair SSH access (the AI's repair_ssh_access tool, Chapter 8). It clears the stale host key and re-installs the app's managed key using a one-time login password stored as a vault secret — the password is read locally and never sent to the model. The dot turns green on success.
Alerts aren't arriving.A channel is misconfigured: a wrong token, an unverified sender, a bad webhook.Open Alerts. A per-send Delivery Errors section lists exactly which channel failed and why; fix the credential and Clear delivery errors. Send a test to confirm before relying on it (Chapter 11).
The AI refuses an action.It is read-only by default, or a specific server toggle is off.Enable Allow changes (and Allow scripts if it wants to run one) on the AI Administrator, or the relevant per-server toggle. The refusal message names the exact setting — see below.
Homebrew is missing.The package manager many services rely on isn't installed.Open the Homebrew pane (Overview). The app can install Homebrew for you and then offers one-click installs of formulae from each service's pane.
A certificate isn't trusted.A self-signed or local certificate the system doesn't yet trust.For local development, issue with mkcert, which installs a trusted local CA; for public sites use Let's Encrypt. Manage both in Certificates and the Sites ▸ TLS tab (Chapter 7, Chapter 10).
macOS says FrontierStack “contains software that is not compatible”.The bundled El Capitan/Sierra monitor build, which macOS 26/27 flags for using a pre-10.14 load command.Nothing. The warning is advisory and the app is unaffected — see the note below.
NoteThe macOS 27 compatibility warning is about one payload file, not about Intel support. FrontierStack ships several builds of the on-host monitor so that it can be installed on Macs as old as OS X 10.11 (Chapter 8). The oldest of these is compiled with Go 1.14, the last version able to target El Capitan, and its linker still emits the pre-10.14 LC_VERSION_MIN_MACOSX load command that recent macOS releases warn about. That file is a payload: it is never executed on your Mac, only copied to an old Intel server over SSH during Install & Enroll. Universal and Intel binaries are not the cause — every other executable in the app is arm64 or a current universal build, and the app contains no 32-bit code at all. Dismiss the warning; it costs you nothing.

18.5MCP onboarding & the actionable refusal

The first time the app sees a chance to, it asks — once — whether you would like to start the MCP server so an outside AI tool can use FrontierStack. The prompt explains the model plainly: the server is localhost-only and read-only by default. Start MCP server turns it on; an optional toggle on the same sheet lets you allow changes there and then; Not now simply remembers that you were asked. The server stays off until you choose otherwise (Chapter 14).

In the MCP pane, Detected AI clients recognizes Amp, Grok, Codex CLI, Cursor, Gemini CLI, Claude Code, Claude Desktop and Xcode. Configure one client, use Set Up Detected, or enable setup at launch. FrontierStack preserves every unrelated MCP entry and installs only its own owner-only bridge; the bearer token remains in Keychain rather than the client’s configuration. Amp setup does not enable its remote thread or terminal features. Network-open MCP is a separate, explicit choice for paired and scoped callers over TLS.

A client reports “connection refused” or fails to start the FrontierStack bridge (~/Library/Application Support/FrontierStack/mcp-bridge). The bridge itself is fine; nothing was answering on the MCP port because FrontierStack was closed and the background service wasn’t running. The bridge now starts FrontierStack hidden on the first call and waits for it, so the first request after a restart can take up to a minute. If the MCP pane warns that the background service can’t start, click Repair Background Service: macOS was refusing to launch it from the copy of the app it was registered from, which happens after a rebuild or after moving the app. Each client row now shows its own Repair result, and clients that aren’t installed have Install….

The MCP pane says “Address already in use”. Another process still holds the MCP port — usually a FrontierStack that crashed or hung (an earlier build, or a wedged background service) and never released it. FrontierStack retries for a few seconds first; if the port stays taken, click Free Port… next to Restart. It finds the process and checks whether it still answers. A FrontierStack copy that no longer answers is named in a confirmation, then stopped, and MCP restarts on the freed port. A copy that still answers, or a program that isn’t FrontierStack, is never stopped: the pane names it so you can quit it yourself or choose another port.

This connects to a small design idea that runs through the whole app. When any external surface — the MCP server, an App Shortcut, the AI — refuses to make a change, it does not just say "no". It tells you why, and where to turn it on. A refusal might read: changes are off — enable them in the AI Administrator; or, for MCP, enable it in Remote Control & Lock ▸ MCP. The reason it points you to the app rather than offering to flip the switch itself is the core of the trust model: a remote agent can ask, but only you, at this Mac, can grant. A refusal is therefore never a dead end — it is a signpost to the one toggle that unblocks you.

The actionable refusal
Read a refusal as instructions. "Enable changes in the AI Administrator," "unlock in Remote Control & Lock," "the token needs Zone:Create" — each names the precise setting standing between you and the action. The app never overrides these remotely, by design, so the message is the fastest path to fixing it yourself.

18.6Mail troubleshooting: a client can't send

Mail failures stack: a certificate problem hides a TLS problem, which hides a login problem, which hides a sender problem. Work through them in order, and read the evidence the client already has before probing the server.

Start with the client's own transcript. In Apple Mail choose Window › Connection Doctor › Show Detail. With connection logging on, Mail also keeps every transcript in ~/Library/Containers/com.apple.mail/Data/Library/Logs/Mail/, one file per server and account, so a send that failed an hour ago can still be read. The line that matters is the reply after RCPT TO.

What the transcript showsWhat it meansFix
No reply; the connection times out.The outgoing server name points somewhere that doesn't run mail, or the port is blocked. A DNS record proxied through Cloudflare is a common cause: the orange cloud carries web traffic only.Look the name up with dig. If it returns Cloudflare addresses, set the record to DNS only.
Connection refused on port 465.The server doesn't offer SMTPS.Use port 587 or 25 with TLS on.
Send is greyed out, no error, no 250-AUTH line.TLS is off in the client, and the server offers login only after STARTTLS.TLS on, Authentication Password, untick Automatically manage connection settings.
554 … Forged sender … must be authenticatedThe client didn't log in. It worked in the office only because the office network is trusted; VPN addresses usually aren't.Authentication Password.
553 … not owned by user X straight after 235 Authentication successfulThe login worked, but X may not send as that From address. Either Mail fell back to another account's outgoing server, or the server's sender-login map lacks X on that address's line. X is the server's name for the login and can differ from what was typed.Fix the account's own outgoing server; or ask the AI Administrator to add X (mail_relay › add_sender_login, approved by you); or log in with a name the map already lists.
454 TLS not available due to local problemThe server's TLS configuration is broken.On an old server, name the protocols; never write >=TLSv1.2.
A certificate warning.The name isn't in the certificate's subjectAltName, or it is valid for more than 398 days.Reissue with every hostname clients use, for 397 days at most.
250 2.0.0 Ok: queued as …Accepted.Not yet delivered: confirm it arrived.
WarningTest from the right side. Hosts listed in the server's mynetworks skip sender and login checks entirely, so a test from the office proves nothing about a laptop at home — and a test from home proves nothing about a logged-in user. Try both.

FrontierStack covers the server side for you. The read-only Scripts preset Mail: why modern clients can't send (legacy Server.app) checks every server-side fault in fix order, a server's Mail Server Policy section audits the whole SMTP policy, and the AI Administrator can read the server's login failures and make the fixes above — each change on an approval card.

18.7Blocking mail password-guessing

Any mail server on the internet is probed around the clock by bots guessing passwords over IMAP, POP and SMTP. The answer is the one fail2ban made famous: watch the failed logins and ban the addresses that keep failing. What matters is getting the thresholds right, and never banning your own people.

Measure before you ban. Ask the AI Administrator to read the server's failed logins. On an old Apple Server.app host they are in /Library/Logs/Mail/mail-err.log; it covers all three protocols, because Postfix checks passwords through Dovecot. Expect a slow spray: a hundred or more addresses, each trying only every five to thirty minutes. Fail2ban's usual rule of 5 failures in 10 minutes catches almost none of them, so count over 24 hours.

ServerUseSettings
Linuxfail2ban, with the dovecot and postfix-sasl jails (or CrowdSec).findtime = 1d, maxretry = 3, bantime.increment = true; private ranges and office IPs in ignoreip.
Old Apple Server.app MacThe Scripts preset Mail: block password-guessing, fail2ban-style (legacy Server.app).Built in: 3 failures in 24 hours, then a ban of 1 day, 7 days, then 30 days.

For the preset, target the mail server and turn on Run as root. It starts as a dry run: it lists every address it would ban and changes nothing. Read that list, change MODE to install, and run it again. Bans live in a pf anchor, so /etc/pf.conf is never edited, and a background job re-checks every minute, so a reboot doesn't undo them. It uses the system Python and needs no Homebrew.

Some addresses are never banned: private ones (office network, VPN, Tailscale), anything in /var/db/mailguard/ignore, and any address that logged in successfully in the last 14 days, so a user who mistypes a password from home is safe.

WarningA bot that knows a real username looks exactly like a user who forgot a password. Before exempting someone who says the failures are theirs, look up where the addresses are. If they belong to hosting or VPN companies in another country, or arrive as a burst from many addresses at once, it is an attack on that account. Reset the password; don't exempt the user.

Check it on the wire. After ten minutes, banned addresses should produce no new failures; the only failures left should be from addresses it hasn't seen yet. Day to day, sudo /usr/local/mailguard/mailguard.py status lists the bans, unban lifts one, and /var/log/mailguard.log records each decision. A banned address is blocked on every port, including incoming mail, because bots log in on port 25 too, and every ban expires. The AI Administrator's Mail Password-Guessing Block skill walks through all of this.

18.8A site works everywhere but here

When DNS answers but a site won't load, the cause can belong to you, your ISP, a network in between, or the site's own host. Guessing wastes an afternoon; comparing answers from different places settles it in a minute. That is what the Connection Probe in Tools does (or ask the AI Administrator why a site won't load).

The probe comparesWhat it tells you
This Mac's DNS with Cloudflare and Google, and /etc/hostsA local filter or a stale record, versus a name that's missing everywhere.
A connection to the port, then an HTTP requestRefused (a server answered no), silent (dropped somewhere), or a firewall's 403.
The route, each hop named by its networkWhere the packets stop. Many networks hide hops, so this is a pointer, not proof.
The same request from Globalping probes worldwide, in your country and on your own ISPDown for everyone, blocked for your ISP, or blocked for you alone.
The same request from your linked serversA server leaving through a different public address that gets in proves the block is on your address.

The verdict names where the connection dies, why, and what to do next, with the network's NOC or abuse address when it's the destination's doing. Every device behind your router shares one public address, so a block often follows something one device did: failed logins, heavy crawling, or a monitor polling too hard.

TipIf the verdict is a block of your address and your firewall is OPNsense, Route Around It… adds an outbound NAT rule that sends that network's traffic out through a spare address in your public block. FrontierStack tests the connection afterwards and deletes the rule if it doesn't help. Ask the network to lift the block anyway; the rule is a workaround.

18.9Getting help

Three resources back you up, in order of immediacy.

  • The in-app Help window. Press ⌘? or choose Help ▸ FrontierStack Help for the built-in documentation, which leads with the AI features and covers every pane and service. Many panes also carry a ? button that opens Help at the matching section. Help's "Open in app" links jump you straight to the pane they describe — Help stays open while the main window comes forward.
  • The website Help & FAQ. frontierstack.app/help mirrors the in-app documentation in a browsable form, and the FAQ answers the questions new users ask most. Migration guides live at frontierstack.app/migrate.
  • Support & feedback. At frontierstack.app/support two short forms reach the team directly: a support request (include your macOS version) when something is wrong, and a feature request for what would make FrontierStack better. Both go straight to the people who build the app.

That brings the manual to a close. You have met FrontierStack as a control panel, a monitoring system and an AI administrator; you have stood up the web stack, linked a fleet, hardened the perimeter, wired up alerts, and handed the keys — carefully, on your terms — to an assistant that can see and fix your servers. The rest is doing. Keep ⌘? close for the in-app Help, visit frontierstack.app when you want the latest, and tell us at Support what you would like next. Thank you for running your servers with FrontierStack.