Connections
Every connection Mobster makes to the internet uses HTTPS with TLS 1.2 or later, and checks the server’s certificate against the trust store macOS keeps. No part of Mobster turns certificate checks off.mobster.dev, api.mobster.dev and remote.mobster.dev send Strict-Transport-Security, so a browser that has visited them never uses plain HTTP there.
An AI provider’s address, a connector or a webhook can use plain
http:// only on this Mac or your local network, such as Ollama or LM Studio. Mobster refuses to send a key to an internet address over http://.
Pinned servers
Mobster pins its own servers:mobster.dev, www.mobster.dev, api.mobster.dev and remote.mobster.dev. After macOS accepts a server’s certificate, Mobster also checks that the chain macOS built includes one of the certificate authority keys it ships with. Both the Mac app and its agent check.
When the check fails, Mobster doesn’t connect, and says so:
mobster.dev. Model calls, connectors and GitHub aren’t pinned and work through it.
Mobster pins certificate authority keys, never a server’s own certificate, so a routine certificate renewal never breaks a pin. These are the keys, as pin-sha256 values, checked against the live servers on 13 Oct 2026:
The backups cover the other roots Let’s Encrypt and Google Trust Services issue from, and SSL.com, the third authority Cloudflare may move
remote.mobster.dev to.
Rotate the pins
The pins live in two places that a test keeps equal:mobile_agent/pinning.py (the agent) and desktop/src-tauri/src/pinning.rs (the Mac app).
-
Run the live check. It needs the network, so CI never runs it:
It exits 1 when a host’s chain has no pinned key, and warns when a pinned authority a host uses expires within 180 days.
cargo test --manifest-path desktop/src-tauri/Cargo.toml -- --ignored livechecks the Mac app’s own client the same way. - Before you move a host to a new certificate authority, add that authority’s root and issuing keys to both files, and ship an app update with them.
-
Move the host only after most Macs run that update. A Mac on an older version can’t reach that host until it updates. The update check uses
mobster.dev, so movingmobster.devbefore the update ships strands those Macs. -
Run
scripts/check_tls_pins.py --saveto refresh the saved chains inmobile_agent/tests/fixtures/tls, which the offline tests check. - Remove a pin only after no host has used it for a release.
Local servers
Mobster’s agent and Mac app listen on your Mac only:- The local API listens on
127.0.0.1, port 8765 by default. It needs a random token that’s new each time Mobster for Mac opens, refuses a request whoseHostisn’t127.0.0.1orlocalhost, and refuses anOriginthat isn’t Mobster’s own window. A web page can’t reach it, even through DNS rebinding. - Sign-in callbacks for your Mobster account and for connectors listen on
127.0.0.1for one answer, protected by PKCE. - WebDriverAgent, which drives your phone, is reached on
127.0.0.1through the cable or Wi-Fi relay. It refuses requests from web pages.
On your Mac
Mobster’s data folder is
~/Library/Application Support/app.mobster.desktop, mode 700: other users on your Mac can’t open it. The Mac app sets that mode before anything is written there, and its logs/agent.log is mode 600. Mobster doesn’t encrypt the journal or screenshots itself: turn on FileVault to protect them if your Mac is lost or stolen, and encrypt your Time Machine backups to protect the copies there.
Who can read Mobster’s Keychain items
Each Keychain item Mobster saves has an access list with Mobster’s own programs on it: the program that saved it, and Mobster for Mac’smobster-desktop and mobster-agent. macOS checks each one by its code signature, so an update keeps its access.
- Any other program gets macOS’s prompt to allow it, and reads nothing unless you allow it. That includes
security find-generic-password. - Mobster for Mac’s agent never shows that prompt. When the Keychain refuses it, the read fails and Mobster says so.
- An item an older version saved through
/usr/bin/securitytrustedsecurityitself, so any program could read it throughsecuritywithout a prompt. The first time Mobster reads it, it moves to an item with the access list. If the move fails, the old item stays as it was, and Mobster tries again on the next read. - The
mobstercommand you installed with Homebrew orinstall.shis a program of its own. The first time it reads a key Mobster for Mac saved, macOS asks you. Keys it saves are readable by Mobster for Mac in/Applications. - From a source checkout, the program on the list is your Python interpreter, so any script it runs can read those items.
Updates and your plan
- Updates are signed. The Mac app installs an update only when its signature matches the key built into the app, whatever server it came from.
- Your plan is a signed token from
api.mobster.dev, bound to this Mac. The Mac app checks the signature with the key built into it.
Sign-in and account pages
mobster.dev/signin, /account, /thanks and /auth/callback, and the relay’s sign-in and consent pages on remote.mobster.dev, refuse to load inside a frame on any site (frame-ancestors 'none' and X-Frame-Options: DENY), so another page can’t overlay them to steer your clicks. Each one sends a Content Security Policy:
- Scripts: only the page’s own, Sign in with Apple’s (
appleid.cdn-apple.com) and the Realm capture script. Onmobster.devevery inline script is pinned by its SHA-256 at build time, so a script injected into the page doesn’t run. - Connections: only the page’s own server and Mobster’s sign-in service (Supabase).
- Frames: only the Realm capture script’s collector frame.
- Device features: camera, microphone, location, payments, USB and screen capture are off (
Permissions-Policy).
no-referrer on mobster.dev, same-origin on the relay), stricter than the browser’s default strict-origin-when-cross-origin. Stripe Checkout and Apple’s and Google’s sign-in open as their own pages, under their own policies.
Mobster Remote
Mobster Remote relays tasks between a cloud assistant and your Mac throughremote.mobster.dev.
- Your Mac connects with a device key it keeps in your Keychain. The relay stores only a hash of it.
- Assistants connect with OAuth. Access tokens last 1 hour and carry only the scopes you allowed. Refresh tokens last 60 days, rotate on each use, and a reused one ends the whole grant. Remote keys last 30, 90 or 365 days, as you choose.
- What the relay sees: the task text and the answer, in transit, over TLS at each end. It doesn’t store them. Your Mac removes secrets and masks codes before an answer leaves it.
How long Remote’s credentials last
Mobster for Mac 0.4.0 and earlier can’t rotate the device key. The relay dates a key made before 13 Oct 2026 from the first time it sees it after that, so those Macs keep Remote for 90 days without an update.