Peony
v0.1.0Seven kinds of VPN, one switch

One VPN at a time. Switch between them from the menu bar, and know the hosts you need are reachable.

Or install it with Homebrew. For macOS 14 or later. Peony isn’t notarized yet, so the first time, open System Settings › Privacy & Security and click Open Anyway.

WorkMon 9:41
Peony

Connected to Work

10.122.0.8·12:34

Routes

Reachable

  • gitlab.acme.co23 ms
  • 10.11.219.931 ms
  • grafana.acme.counreachable

This one works. Pick a route to switch.

Works with

  • FortiGate
  • AnyConnect
  • GlobalProtect
  • Pulse
  • F5
  • WireGuard
  • NetBird

The panel

Connected should mean reachable. Peony keeps one tunnel on so routes and DNS never fight, then checks the hosts you care about. Here is every state it can be in.

Peony's panel, connected to Work, with reachable hosts and their latency

What runs as root

A small helper, kept on a short lead. Setting routes and DNS needs root. Peony installs one helper and a sudoers rule for it, and the helper trusts nothing it is sent.

  1. 01

    One request, on stdin

    The helper takes one JSON request on stdin. Secrets never appear in arguments, where other processes could read them.

  2. 02

    Every field is validated

    Line breaks, option-like values and WireGuard’s PostUp and PreDown hooks are rejected before they reach a config file or a command line.

  3. 03

    Homebrew clients only

    It only executes clients from Homebrew’s bin directories, never a path it was handed.

  4. 04

    Configs don’t linger

    Generated configs go to a root-only directory. FortiGate’s is deleted as soon as openfortivpn has read it.

Passwords and WireGuard configs live in your Keychain. Remove everything with brew uninstall --zap peony.

Install

Three steps to the first tunnel. Peony drives the open-source clients, so install the ones your VPNs need. Settings shows which are missing.

  1. Open the panel. Click the flower in the menu bar, then Add VPN.

  2. Describe the route. Pick the kind, fill in what your admin gave you, and list a few hosts to check.

  3. Connect. Click it, or press ⌘1 to ⌘9. The first connection asks for an admin password once, to install the helper.

Clients for each kind of VPN

VPN

Client

FortiGate SSL-VPNbrew install openfortivpn
AnyConnect, GlobalProtect, Pulse, F5, Arraybrew install openconnect
WireGuardbrew install wireguard-tools
NetBirdNetBird’s installer

One on.
The rest stay off.

Download for Mac