Installation¶
shed-desktop ships two clients from one shared Rust core: a native macOS app (Apple Silicon) and a Tauri/WebKitGTK Linux app.
macOS (DMG)¶
The macOS app is an Apple Silicon (arm64) menu-bar app and requires macOS 14 or newer.
Grab the latest ShedDesktop-<version>.dmg from the
releases page, open it, and drag
ShedDesktop.app to Applications.
Official release DMGs are Developer-ID-signed and notarized when the release
pipeline has signing credentials, and then launch without a Gatekeeper prompt.
(An ad-hoc-signed, non-notarized build ships a FIRST-LAUNCH.txt with the
one-time bypass steps.)
Updates¶
The app updates through Sparkle, served from the appcast at
https://charliek.github.io/shed/appcast.xml and verified by an EdDSA signature independent
of Apple notarization. Updates are user-invoked only — there are no automatic background
checks. Trigger one from the menu-bar dropdown (or the tray popover) → Check for Updates…;
if a newer build is published, Sparkle offers it and applies it in place.
| Behavior | Value |
|---|---|
| Trigger | User-invoked (Check for Updates…); no automatic/scheduled checks |
| Feed | https://charliek.github.io/shed/appcast.xml (stable channel) |
| Verification | EdDSA signature (SUPublicEDKey), independent of Apple notarization |
| Channels | Stable by default; prerelease (rc) builds subscribe to a beta channel |
The Tauri macOS app is on a beta rollout — prerelease (vX.Y.Z-rc.N) tags publish a
beta-channel Tauri DMG while stable users keep receiving the Swift app. Both share the same
feed, EdDSA key, and bundle identity (ai.stridelabs.ShedDesktop), so the eventual promotion
is a seamless in-place update. See
RELEASING.md.
Locally built DMGs (make -C desktop dmg) are ad-hoc signed, so Gatekeeper blocks the
first launch. Clear the quarantine once, after copying it in:
(Or double-click it, dismiss the warning, then System Settings → Privacy & Security → "Open Anyway".)
A Homebrew cask for the macOS app is planned (a later monorepo phase) but not available yet — install from the DMG for now.
Linux (apt)¶
The Linux client is the Tauri app, distributed as the shed-desktop .deb (amd64 + arm64)
through charliek/apt-charliek:
The binary installs to /usr/bin/shed-desktop, with a headless shedctl and the polkit
action alongside. The .deb declares its WebKitGTK runtime dependencies
(libwebkit2gtk-4.1-0, libgtk-3-0, libayatana-appindicator3-1, librsvg2-2,
libsoup-3.0-0) and recommends polkitd. See the
shed apt repo for the repository setup.
Build from source¶
The desktop app lives under desktop/ in the shed monorepo;
its shared Rust core is the sibling crates/ workspace. Every make target below runs from
the monorepo root via the desktop- passthrough (make desktop-<target>) or directly with
make -C desktop <target>.
macOS — prerequisites: Xcode 16+ (Swift 6 toolchain), Rust stable ≥1.85.
git clone https://github.com/charliek/shed
cd shed
make -C desktop bundle # builds desktop/build/ShedDesktop.app (ad-hoc signed)
open desktop/build/ShedDesktop.app
The bundle embeds the shedctl CLI at
desktop/build/ShedDesktop.app/Contents/Resources/bin/shedctl. make -C desktop dmg packages
a release bundle into desktop/build/ShedDesktop-<version>.dmg. To produce a notarizable
build locally, set the signing identity:
SHED_DESKTOP_DEVELOPER_ID_IDENTITY="Developer ID Application: …" ./desktop/scripts/bundle.sh release
Linux — the .deb is built (in Docker, to pin the WebKitGTK toolchain) with:
make -C desktop deb # → desktop/out/shed-desktop_<version>_<arch>.deb
make -C desktop deb-validate # build + install-validate in a clean ubuntu:24.04 container
What it needs at runtime¶
~/.shed/config.yaml— the shed-server host list (created by theshedCLI). The app reads this read-only and watches it for changes.- A reachable
shed-serveron at least one configured host. Unreachable hosts are shown as a degraded state, never a hard failure.