Skip to content

Latest commit

 

History

History
100 lines (53 loc) · 29.4 KB

PRIVACY.md

File metadata and controls

100 lines (53 loc) · 29.4 KB

Privacy

Vorssaint is built to be local-first. Core features run on your Mac, and the app has no Vorssaint account or cloud dashboard. Its Vorssaint-operated services are limited to temporary screenshot and recording links and feedback you explicitly choose to send.

The short version

  • No account. There is nothing to sign up for and nobody to log in as.
  • No subscription. The app is free and stays free, with nothing held back behind a paid tier.
  • No automatic telemetry. Vorssaint gathers no usage stats, crash reports or device identifiers. Feedback sends technical details only when you select them after seeing the complete list.
  • No Vorssaint analytics or tracking. There are no analytics kits, no ad networks and no third party tracking anywhere in the app.
  • No data selling. Vorssaint never sells personal information or shared screenshots and recordings.
  • Your settings stay put. Preferences and saved state live in the app's own local storage on your Mac and are never uploaded.

What it reads, and where that stays

Everything Vorssaint shows you, from the CPU and memory load to the temperatures, the battery details, the network rates, the window list, per app volume and the files on the Shelf, is read locally through native macOS APIs and shown to you right there. Those readings are not uploaded automatically. Optional online lyric and cover lookups send only what is described below.

Clipboard history, including the images and files you copy, lives in the app's local storage on your Mac and never leaves it. Content marked as confidential by its source app is never recorded. Guessing sensitive content from the text is optional and off by default; unmarked passwords can be saved when it is off. Copy text from screen recognizes the text entirely on device with Apple's Vision framework, and the temporary capture is deleted as soon as the text is read. Automatic clearing, when you switch it on, only empties the system clipboard on this Mac: nothing is sent anywhere, and items already saved to your history are left as they are.

Command Bar saves how often you choose an item and a limited set of associations between typed search prefixes and the items you chose, so app and emoji ranking survives a restart. It stores keyed digests of those prefixes locally, not the search text itself, and excludes this learning and its local key from settings backups. You can clear it with Forget learned ranking in Command Bar settings.

Recent Captures keeps up to 12 screenshots, within a 256 MB limit, in the app's private local cache so you can reopen them. Recordings are not duplicated: only their existing path and a small thumbnail are kept. Clear removes that history and its cached images. When a screenshot is copied as a file, its private local PNG is kept temporarily so other apps can finish reading it, then cleaned on later copies once it is older than 24 hours or earlier when the bounded cache fills. None of these local caches is uploaded automatically.

When a feature needs a macOS permission such as Accessibility, Screen Recording or Microphone, that access is used only for the feature it belongs to. Captured content leaves the Mac only when you explicitly share it, from the Share menu or with a temporary link, and the audio of apps you route to AirPlay goes only to the speaker you pick on your local network. The permissions guide breaks down each permission.

Optional notch features

Calendar access is requested only from the permission button. The notch reads upcoming events through the system calendar service; it does not create, change or delete events. Event text stays in memory and is cleared when the notch stops or the Mac locks. The optional countdown and time left can show the title of the next event, or of the one in progress, in the closed notch, including in screen captures when notch capture is enabled. Events you choose for the countdown are remembered on this Mac by their calendar identifiers and end times, without their text, are forgotten once they end and are left out of settings backups. While the island is open, the Calendar shortcut on its Controls page shows the next appointment's start time and title, which also appear in screen captures when notch capture is enabled.

Notification mirroring uses Accessibility to read new visible system banners. It does not read the notification database or message stores and does not open notification history. The session inbox shows up to 50 notices; its temporary state is kept in memory and cleared on lock or disable. Clicking a notice invokes its original native action while valid. If that action is no longer available, the user’s click can instead open the previously identified source application. A separate, disabled-by-default option hides the original system banner while the notch shows that notice. On macOS 27 and later it moves the system window holding the banner off screen, so the banner still plays its sound and goes to Notification Center when it expires, and it puts the window back as soon as the window shows anything the notch did not take, such as a persistent alert. On earlier versions, or if the window cannot be moved, the option instead dismisses that specific banner about a second later, which lets short sounds finish but may cut off longer ones. It revalidates that specific notice and never clears a notification group. Notices hidden by the system are not imported.

The camera mirror starts only after an explicit action. Its frames go to the local preview and are not saved or uploaded by that feature. Closing the preview, hiding its section, disabling it or locking the Mac stops capture. Visible notch content, including the camera, appointments and notifications, can appear in screenshots or recordings when you leave notch capture visibility on.

Timers and focus sessions are kept only for the current app session. Accessory alerts use local system readings. Download monitoring is limited to a folder you choose; its access bookmark stays on this Mac and is excluded from settings exports. File compression and conversion run locally, preserve originals, and save only to the destination you choose.

Imported lyrics and timing adjustments are kept for only the current song in memory. Opening a different section cancels lookup work without losing that song's imported text. Observing a different song or disabling the feature clears it. The upcoming music queue comes from the local player and is not uploaded.

The live equalizer is off until you turn it on. When on, it reads the audio output of the current player through a Core Audio process tap on this Mac, limited to the audio processes that player is responsible for, which is how a browser playing through a helper process is heard, and keeps only a fraction of a second of samples in memory to compute seven levels for the island's bars. It does not record, store or send audio. macOS asks for system audio recording permission the first time; if it is declined, the tap only delivers silence, so the bars return to their usual synthetic motion and the tap is released. It is also released when playback stops, when the player moves its sound to another process, and when the option is turned off or the feature is uninstalled from the features hub, where the permission it uses is listed; a change of output device rebuilds it in place.

On new setups, AI Agents stays off until you enable it. Updates preserve your existing setting. While it is on, it reads the session logs Claude Code and Codex already keep in your home folder, under ~/.claude/projects (or ~/.config/claude/projects), or the Claude Code profile folder you select, and ~/.codex, where they are, as they grow, the event log GitHub Copilot keeps for each session under ~/.copilot/session-state, and the OpenCode database at ~/.local/share/opencode/opencode.db and its write-ahead log, opened read-only whether or not OpenCode is running and from thirteen weeks back at most. Only token counts, model names, times, session identifiers, recorded costs and the name of the folder each agent worked in are taken from them; prompts, replies, tool output and files are never decoded into anything that is kept. From OpenCode's database the query itself takes out only those values, with each message's role, how it ended and whether it failed, and of the parts that hold its message content only each part's type and state are checked, inside the query, so that content never reaches the app. The plan name and displayed account come from the profile Claude Code caches in ~/.claude.json, or .claude.json inside the selected profile folder. It is parsed in memory; only the plan fields, account and organization identifiers, email address and usage timestamp are retained. Account identifiers and email addresses are not saved in the usage archive. While a Claude Code task shows as working, the section also looks at the small records Claude Code keeps in sessions/ beside the selected profile’s projects for each running session, and reads only the process and the session each one belongs to, to tell when that session has ended. The section also asks macOS whether the Mac is online, which sends nothing, so a Claude Code task that cannot reach its server stops showing as working once the Mac has been offline for about 20 seconds. A task waiting on a shell command keeps showing, so the identifier Claude Code gives each shell command still running is held in memory until its result appears, and is never saved. Claude's plan limits come from Claude Code when it can check them, as the network list below describes, and otherwise from the history the Claude app keeps in ~/Library/Application Support/Claude/plan-usage-history.json, of which only the time, the account each reading belongs to and the percentage used of each window are kept. Vorssaint itself never uses a sign-in, keychain item or token. With Claude turned on and the default profile selected, the section's settings also read that history to show when the Claude app last saved its limits, even before the section is turned on, and keep only that time. An agent turned off in the section's settings is not read at all. Those values are held in memory and kept while the display sleeps or the Mac is locked. So that a launch reads only what the agents wrote since, they are also saved to a file in the app's cache folder that only your account can read, with the path of each log, how far it was read and a checksum that tells when it changed. Those paths include your home folder and, for Claude Code, the full path of the folder each session worked in, since Claude Code names its log folders after it. Nothing from OpenCode's database goes into that file. What it gives stays in memory only, and the database is read again at each launch. Time Machine leaves the cache folder out of backups. An app update or a damaged file sets the saved file aside and the logs are read from their start again. Turning the section off drops what is in memory and deletes that file. Costs are computed on your Mac from a public price list that ships with the app and can be kept current, as described below. For an OpenCode model that list does not price, the cost OpenCode recorded is shown.

Playback controls prefer active playback, including a browser video when a music app is paused, and prefer music apps when playback activity is equal, except that the player already being followed keeps its place while paused. When a player needs Automation for directed controls, Vorssaint reads only the playback commands declared in that app's local scripting definition. The music page's shuffle button reads and switches only the shuffle setting the app declares, and whether shuffle is available when the app declares that too. Permission is requested from an explicit button; granting it does not replay an earlier action. Commands address the selected running process and recheck the displayed playback before delivery. Players without compatible controls can still be opened from the island. No playback data is uploaded by these controls.

Covers for Firefox-based browsers are off until you turn on Find covers for Firefox and Zen in the Dynamic Island's music settings. While it is on and Firefox, Firefox Developer Edition, Firefox Nightly, Zen, LibreWolf, Waterfox or Floorp plays without a sharp cover, Vorssaint reads that browser's newest saved session file from its profile folders under ~/Library/Application Support on this Mac. That file lists every open tab with its history, form data and session cookies. It is decoded in memory only, and Vorssaint keeps just the title and address of the open YouTube and YouTube Music tabs, while a lookup runs, to find the tab whose title is the song's. Nothing from the session is saved, and nothing from it leaves the Mac except the found video's ID, as described below.

Network connections

Vorssaint opens only a few kinds of connection, and each one belongs to a visible feature.

  1. The update check, automatic and easy to switch off. So it can tell you when a newer version exists, Vorssaint asks GitHub's public releases API at api.github.com for this project's latest release. The request carries only a standard user agent with the app name and its version, and no account, identifier or usage data go along with it. It runs a short while after launch and now and then while the app is open. You can turn it off in Settings under About, and once it is off no update requests are made. If you choose to install an offered update, the disk image comes from GitHub.

  2. The internet speed test, only when you ask. The optional speed test in the Network section reaches Cloudflare's public speed endpoints at speed.cloudflare.com to measure latency and your download and upload throughput. This happens only when you start a test yourself, and never on its own.

  3. Homebrew actions, only when you use the Homebrew manager. Search, install and uninstall actions run the local brew command, which may contact Homebrew, GitHub and package vendor hosts to search metadata or download files. Popularity badges use Homebrew's public aggregate analytics JSON from formulae.brew.sh. Vorssaint does not send its own analytics, capture passwords or run brew as root.

  4. The app update check, only with App updates switched on. Finding out which apps are behind uses the sources you leave enabled. The Homebrew source runs the local brew command, exactly as above. The App Store source sends store identifiers to uclient-api.itunes.apple.com, falling back to bundle identifiers at itunes.apple.com, along with your Mac's region, to find the current Mac version.

The Online source checks supported public update addresses declared inside installed apps. These requests go to the app developer's server or its release hosting service, including github.com and redirected download hosts. The server receives your public IP address and the requested URL, which can reveal which app is being checked. Vorssaint does not add your app inventory, local paths, account details or device identifiers to these requests, and does not use stored cookies or credentials. The declared URL, including any query parameters it already contains, is sent as provided by the app. These services may process ordinary request data under their own privacy policies.

The Online source also downloads the complete public app catalog from formulae.brew.sh as a fallback. That catalog request does not send the names, paths or bundle identifiers of apps on your Mac. Version comparisons happen locally; updates from developer feeds are installed by the app's own updater after you open it.

The check runs when you open the list or press Check now, and on a schedule only if you set one. The three source switches under App updates control these connections independently. Turning off the App Store source stops its store and bundle identifier lookups. Turning off the Online source stops both developer feed requests and public catalog requests on subsequent checks.

  1. Temporary screenshot links, only when you choose to create one. Creating a link sends the rendered PNG and your chosen expiration of 1, 6 or 24 hours to the Vorssaint service over HTTPS. It does not send your name, account, device identifier or MAC address. On your Mac, the feature keeps only the link, expiration and private deletion token while the link is active, so you can copy it or delete it early. The service holds your public IP address in memory for no more than 24 hours to prevent abuse, while network providers may process normal HTTPS request data under their own policies.

The uploaded PNG is decoded and rebuilt without embedded metadata. The image and its link metadata are permanently deleted when the link expires or you delete it, and the service does not create screenshot backups. Private moderation stores the active link, not another uploaded image, and removes that message when the link ends. Anyone with the link can view, download, save or redistribute the image, and active links are available to the service operator for abuse moderation. Share only with people you trust.

  1. Temporary recording links, only when you choose to create one. The finished video is compressed on your Mac and sent over HTTPS with the audio you kept and your chosen expiration of 1 or 6 hours. It does not send your name, account or device identifier. On your Mac, the feature keeps only the link, expiration and private deletion token while the link is active. The service temporarily processes your public IP address to prevent abuse, while network providers may process normal HTTPS request data under their own policies.

The service validates and rebuilds the MP4 without its original metadata. The video and link metadata are permanently deleted when the link expires or you delete it, and the service does not create backups. Anyone with the link can view, download, save or redistribute the video, and active links are available to the service operator for abuse moderation. Share only with people you trust.

  1. Feedback, only when you press Send. A submission sends the category you choose and the text you type. The optional technical details switch adds only the app version and build, macOS version, Mac model and app language shown in the form. It never includes your name, account, email address, device identifier, logs, screenshots, files or clipboard content. Your public IP address is processed temporarily in memory for rate limiting and is not attached to the feedback.

Feedback is delivered to private support channels visible to the service owner. After delivery, the text and any technical details you selected remain there until the service owner deletes them. The temporary delivery copy is then deleted; if delivery never succeeds, that copy is permanently deleted after 7 days. No contact information is sent, so feedback cannot receive a direct reply.

  1. Online lyrics, only after you enable the separate lookup option. While the lyrics view is open, a lookup sends the current song's title, artist, album and duration over HTTPS to lrclib.net. If normal matching fails, artist names and album titles may also be sent to musicbrainz.org to verify alternate artist names. This lets a native name, transliteration or historical credit match the same artist (for example, 林宥嘉 and Yoga Lin) without embedding artist-specific mappings. When artist aliases are insufficient, the song title may also be checked against recording credits and duration there; lyrics and audio are not sent to MusicBrainz. Audio, artwork, local paths, accounts and listening history are not included. These providers receive ordinary request data, including your public IP address, under their own policies. Requests use an ephemeral session without stored cookies, reject redirects and stop when you hide the view or disable lookup. Lyrics are kept only in memory for the current song. A bounded, temporary metadata cache avoids repeating artist verification; it is cleared when lyrics stop. Local lyric import works without these connections.

  2. The AI price list, only while the AI Agents section is on. So a model launched after a release still gets an API value, Vorssaint downloads this project's public price list from raw.githubusercontent.com at most once a day, and again a few hours after a failed attempt. The request carries only a standard user agent with the app name and its version; no usage, account, identifier or file goes along with it. The list is checked before it is used and kept in the app's own folder; when a download fails, the newer of that saved list and the copy inside the app stays in use. You can turn this off with Keep prices up to date in the section's settings. Requests use an ephemeral session without cookies, and redirects to other addresses are rejected.

  3. Codex banked resets and account limits, only while the Resets card is on screen or for the Codex folders you add. With Codex turned on in the AI Agents section, the Resets card starts Codex's own command-line tool for a moment, from the Codex desktop app or where Codex is installed, and asks it for the account's banked resets and current limits. Codex contacts OpenAI with its own sign-in, which Vorssaint never reads. Vorssaint gives Codex only these questions and the app's name and version, and keeps only the number of resets, their identifiers and expiry dates, and each limit's percentage used and renewal time. The resets stay in memory. The limits join the section's other counters, so they are also saved to the file the AI Agents paragraph above describes. This happens when the card appears, at most every five minutes, or every minute after a check that could not finish. A reset is used only after you press Use a reset and confirm. If Codex is not found and you press Try again, Vorssaint also reads the PATH your login shell sets, which runs your shell's startup files once. Hiding the card, or turning Codex off, in the section's settings stops these requests.

For each separate Codex home (CODEX_HOME) you add in the AI Agents section, its limits card starts the same Codex tool for a moment, with that folder as its home, and asks it only for that folder's account and current limits. It sends no prompt, never uses a reset and does not ask Codex to renew the sign-in. Codex contacts OpenAI with the sign-in it keeps for that folder, which Vorssaint never reads, and may renew it and write its usual logs and caches there. Before a folder is added and before each check, Vorssaint looks only at who owns the folder and its auth.json or config.toml and at their permissions, never at what they contain, and Find local accounts lists only the folders in your home folder whose names begin with .codex. Sign-in keys, provider settings and a shared state folder Vorssaint was opened with are left out of each check, while proxy settings and the DO_NOT_TRACK and DISABLE_TELEMETRY opt-outs are kept. Vorssaint keeps only each account's plan name and each limit's percentage used and renewal time, in memory. The paths and names of the folders you add are saved in the app's preferences on this Mac and are left out of settings exports and imports. Accounts are checked one at a time while the AI page is open in the island, at most every five minutes each, a minute after one of their windows renews, and half an hour after a check finds Codex missing, signed out or too old, or the folder no longer suitable. Check limits in the section's settings and a card's refresh button ask right away. A check under way, or one you asked for, finishes after the page closes. Locking the Mac, hiding the Limits card, or turning Codex or the section off stops it, and no check runs while that card is hidden. As on the Resets card, if Codex is not found and you refresh the card, Vorssaint also reads the PATH your login shell sets, which runs your shell's startup files once. With no folder added, none of this runs.

  1. Claude account limits, only with Claude turned on in the AI Agents section. While the section runs, including while the lock screen shows AI agents, Vorssaint starts Claude Code's own command-line tool for a moment, from ~/.local/bin, ~/.claude/local, /opt/homebrew/bin, /usr/local/bin, the app's PATH, or the folders where Volta, fnm, nvm, asdf, mise, Bun, pnpm or an npm prefix in ~/.npm-global keep global tools, and asks it for the account's limits. Those folders also go at the end of the PATH it runs with, so a Claude Code that needs Node finds it. Claude Code contacts Anthropic with its own sign-in, which Vorssaint never reads. It gets no prompt, tools, MCP servers or hooks of your own, keeps no session and does not update itself during the check. The analytics, error report and nonessential traffic opt-outs and the proxy settings (HTTPS_PROXY, HTTP_PROXY, NO_PROXY and NODE_EXTRA_CA_CERTS) you set for Claude Code still apply when they are in the env of the selected profile’s settings.json (~/.claude/settings.json by default), of which Vorssaint reads only those seven and hands them to Claude Code without keeping them, or in the environment Vorssaint was opened with, such as one set with launchctl setenv; ones exported only in your shell's startup files do not reach these checks. Settings an organization manages for Claude Code, hooks included, apply too. Claude Code keeps a copy of what it fetched in the selected profile’s .claude.json (~/.claude.json by default); of that copy Vorssaint reads only when it was saved, so an older one Claude Code answers with when it cannot reach Anthropic is not shown as new. Vorssaint keeps only each window's percentage used and renewal time. They join the section's other counters, so they are also saved to the file the AI Agents paragraph above describes. This happens every minute while the AI page is open in the island and every five minutes otherwise, and only while something uses those limits: their alerts, a live reading that shows a limit, the resting island's AI limits, or the Limits card while the AI page is open. Nothing is asked while the Mac is offline. After a check finds Claude Code missing, signed out or too old to answer, the next one waits half an hour; after checks in a row that get no answer, each wait doubles up to half an hour, starting over when the Mac is back online. Turning Claude off in the section's settings, or turning the section off, stops these requests.

Selecting a Claude account changes only which existing Claude Code profile Vorssaint monitors. The selected folder is saved locally and excluded from settings exports and imports. The account picker discovers only ~/.claude, ~/.claude-* and ~/.config/claude, or a folder you choose, and reads account metadata without reading credentials. Claude Code uses that folder through CLAUDE_CONFIG_DIR, as described in its authentication documentation. Inherited authentication and provider overrides are removed from checks so they cannot replace the chosen login. A custom profile never borrows limits from the Claude Desktop history, which identifies organizations rather than individual accounts. Switching profiles cancels pending checks and reloads local sessions; sessions from different logins that share one profile remain part of that profile’s history. Signing in and changing accounts in other applications remain under your control.

  1. Per-app AirPlay, only while you route an app to AirPlay. The audio of the apps you set to AirPlay in the Volume Mixer is streamed, from memory, to the AirPlay speaker you pick on your local network. Vorssaint hands it to macOS's own AirPlay stack, which finds the speaker and makes the connection; Vorssaint does not contact the speaker or any other address itself, and nothing leaves your local network through this feature. Only the routed apps' audio is sent. It is not saved or recorded, and streaming stops as soon as no app is routed to AirPlay or the speaker is disconnected.

  2. Covers for Firefox-based browsers, only after you turn on Find covers for Firefox and Zen. For the YouTube tab whose title is the song's, the video's thumbnail is loaded from i.ytimg.com, which receives only the video ID. When no YouTube tab shows the song and a session saved since the lookup began shows an open YouTube Music tab, the song's title and artist and your Mac's region are sent once per lookup to Apple's public catalog search at itunes.apple.com, and the album art of a result with the same title and artist is loaded from Apple's image servers at mzstatic.com, never from another host the reply might name. Without a readable session that shows YouTube Music, nothing goes to Apple, and a plain YouTube video listed in that session is matched by its own tab instead. These providers receive ordinary request data, including your public IP address, under their own policies. The requests go out through your Mac's own connection, not through a proxy, VPN or secure DNS set only inside the browser. Requests use an ephemeral session without cookies, reject redirects and stop at 4 MB. A lookup gives up about a minute after it starts, and stops at its next try when the song changes, playback stops or the option is turned off. Covers stay in memory for the last eight songs and are never written to disk.

That is the entire list. There are no hidden beacons or background uploads.

Changes to this document

This page describes how the current version of Vorssaint behaves. If the app's behavior around privacy ever changes, this page changes with it.

Questions

If anything here is unclear, open a question in GitHub issues, or have a look at support.