SwitchTenderSwitchTender Docs

Desktop

SwitchTender runs as a local desktop application with one command. Because the whole product is a single binary with an embedded web UI, it needs no database server, no container, and no Kubernetes. What a run needs is its own tool, such as bash for a Bash run, on the PATH. An Ansible run needs ansible-playbook on the PATH, or a pinned ansible-core that switchtender ansible install puts in the desktop app's data directory, as where it lives shows. macOS and Linux ship bash, so a Bash run works there as soon as the binary does. Windows does not ship one, so on Windows a Bash run needs a bash installed and on the PATH first.

Download

Every release attaches ready-to-run downloads on the releases page: a windows_amd64.zip holding switchtender.exe, tar.gz archives of the binary for macOS and Linux, and deb, rpm, and apk packages. A SHA256SUMS file lists the checksum of each one.

There is no separate download for the desktop app. The binary is the app: switchtender desktop picks a loopback port, keeps its data in a per-user directory, and opens the UI. A macOS .app bundle and a SwitchTender.dmg are built by the release workflow and attached to every release.

What is signed differs by artifact, so here it is per download rather than as one sentence.

The macOS app inside the .dmg is signed with a Developer ID certificate issued to KordLoom LLC (team KD99L7BFM2) and notarized by Apple, so Gatekeeper accepts it and it opens with no warning. spctl -a -vvv /Applications/SwitchTender.app reports source=Notarized Developer ID, and codesign -dv names the same authority. The .dmg is signed with the same certificate, notarized, and stapled, and the app inside it is notarized and stapled on its own, so a copy dragged into /Applications carries its ticket and Gatekeeper can find it on a Mac that cannot reach Apple's notary service.

The macOS binary in the tar.gz, which the Homebrew cask installs, is not signed or notarized yet. The install script and a curl download run it as is. A copy downloaded through a browser, or installed by the cask, carries macOS's quarantine flag, and Gatekeeper can refuse to run it until the flag is cleared with xattr -d com.apple.quarantine on the binary.

The Linux and Windows binaries in the tarballs and packages carry no code-signing certificate, so Windows shows the unidentified-developer prompt on first launch: choose More info, then Run anyway. Every archive is covered by the published SHA256SUMS, which CI signs with cosign, and switchtender version --verify checks the running binary against the release's hashes. Verifying a release is described in SECURITY.md.

Run it

From a download, open SwitchTender.app on macOS or run switchtender.exe desktop on Windows. From a binary or a source build, run:

switchtender desktop

This serves on a private loopback port, keeps its database in a per-user data directory, and opens the web UI in your default browser. There are no flags to set. The data directory follows the platform convention:

Platform Data directory
macOS ~/Library/Application Support/SwitchTender
Windows %AppData%\SwitchTender
Linux ~/.config/SwitchTender

The chosen port persists in the data directory and is reused on the next launch, so your sign-in and tour state survive a restart. Launching a second copy while one is running opens the existing instance instead of starting another server.

Set SWITCHTENDER_DESKTOP_NO_BROWSER to any value to skip opening a browser, for a headless or remote machine. The encryption pair still enables stored credentials the same way it does for serve.

Access and tokens

A fresh desktop instance starts with no tokens, and until the first token exists the API answers without authentication. The server listens only on the loopback interface, so nothing off your machine can reach it, but on a shared computer any local account can. If other people use the machine, mint a token right away and sign in with it:

switchtender token new --db "<data directory>/switchtender.db" --name me

Once one token exists, every request must authenticate.

Stop it

The desktop app is the server. Closing the browser tab leaves it running so scheduled work continues. To stop it, quit the terminal it runs in or end the switchtender process. The packaged macOS app below runs without a Dock icon, so stop it from Activity Monitor or with pkill switchtender.

Build the app yourself

The release workflow builds the macOS app and the dmg automatically, so most people use the download. To build the bundle by hand, wrap the binary so it launches from the Dock or Finder. The bundle's executable is a small launcher that runs switchtender desktop. The launcher is named launch, not SwitchTender, so it does not collide with the switchtender binary on a case-insensitive macOS filesystem:

APP=SwitchTender.app
mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources"
cp switchtender "$APP/Contents/MacOS/switchtender"
cat > "$APP/Contents/MacOS/launch" <<'SH'
#!/bin/sh
exec "$(dirname "$0")/switchtender" desktop
SH
chmod +x "$APP/Contents/MacOS/launch"
cat > "$APP/Contents/Info.plist" <<'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>CFBundleName</key><string>SwitchTender</string>
  <key>CFBundleIdentifier</key><string>dev.switchtender.desktop</string>
  <key>CFBundleExecutable</key><string>launch</string>
  <key>CFBundlePackageType</key><string>APPL</string>
  <key>LSUIElement</key><true/>
</dict></plist>
PLIST

Double-clicking SwitchTender.app now starts the server and opens the UI. To share it beyond your own machine, sign it with an Apple Developer ID and notarize it, then wrap it in a .dmg. Without signing, macOS shows an unidentified-developer warning on first launch.

Package a Windows app

On Windows the same binary runs with switchtender.exe desktop. Build a signed .msi installer with WiX that installs the binary and a Start-menu shortcut to switchtender.exe desktop. Signing needs a code-signing certificate.

Signing and notarization are the only steps that need credentials you provide. The desktop mode itself is built in and needs nothing.