docs/what-picasso-puts-on-your-mac.md

What Picasso puts on your Mac

Everything Picasso for Mac and the picasso command line install, run, read, write and talk to, and how to remove all of it. It is written from the code and checked against it by tests (WhatPicassoPutsOnYourMacTests in the Mac app, footprint.test.ts in the CLI). If something here is wrong, that is a bug.

In short: one app in /Applications, one folder in your home (~/.picasso), a few folders under ~/Library, a few Keychain items. No kernel extensions, no LaunchDaemons, nothing that runs as root, and nothing that starts at login unless you turn on "Keep threads running when Picasso quits" or ask the command line for it. Engine and relay listen on 127.0.0.1 only, unless you turn on remote access.

Installs and runs

The app bundle

/Applications/Picasso.app, bundle ID com.picassohq.picasso, Apple silicon, macOS 14 or later. Signed with a Developer ID, notarized and stapled, hardened runtime on, not sandboxed (it edits the projects you open). Inside:

Path in the bundleWhat it is
Contents/MacOS/PicassoThe app.
Contents/Frameworks/Sparkle.frameworkThe updater (Sparkle 2). Its Autoupdate and Updater.app stay; its XPC services are removed.
Contents/Resources/PicassoEngine/bin/nodeA private Node runtime for the engine. Its only extra entitlement is allow-jit.
Contents/Resources/PicassoEngine/relay/The relay: the app's local bridge to the engine.
Contents/Resources/PicassoEngine/node_modules/The Picasso engine and its plugins, pinned to the version this release was tested with.
Contents/Resources/LSP/Language servers for the code editor (TypeScript, JSON, CSS, HTML, ESLint, Pyright).
Contents/Resources/EditorHost/The code editor's web assets.

There are no LaunchDaemons, privileged helpers, system extensions or XPC services. There is one optional background item: Contents/Library/LaunchAgents/com.picassohq.picasso.runner.plist, which macOS registers (System Settings › General › Login Items) only when you turn on Settings › General › "Keep threads running when Picasso quits". It runs the app's own signed engine, after the same checks the app runs, and turning the setting off removes it. It is off by default.

Processes

While Picasso for Mac is open you will see:

  1. Picasso: the app.
  2. The relay: PicassoEngine/bin/node PicassoEngine/relay/main.mjs, started by the app. It listens on

127.0.0.1 on a port the system picks. It only listens on your network when you turn on Settings › Remote › "Allow access from this network" and finish pairing (TLS).

  1. The Picasso engine: started by the relay, on 127.0.0.1, on a port the system picks.
  2. Language servers, only while the code editor has a file of that language open. Picasso uses the bundled ones,

plus pyright-langserver, gopls, rust-analyzer or a project's own ESLint/Ruff when they are already installed.

  1. `ssh -N -T -L …`, only for a remote engine you added yourself (Settings › Engines).

Quitting the app stops all of them. Nothing keeps running after you quit.

The menu bar item is off by default (Settings › General). Schedules and pull-request watching run inside the engine while the app is open; they are not system services.

What the command line installs

npm install -g @picassohq/cli installs the picasso (and pic) command into npm's global folder. Then:

PathWhat it is
~/.picasso/dsh/The Picasso engine the CLI was released with, installed by npm ci from the CLI's lockfile.
~/.picasso/dsh-versions/<version>/Newer engine versions the CLI downloaded and verified (sha512 against the registry, npm audit signatures). current.json points at the one in use; the current and previous versions are kept.
~/.picasso/state/engine-update.jsonWhat the engine updater last checked, staged or held back.
~/Library/LaunchAgents/com.picassohq.host.plistOnly if you run picasso host install-service. It is written, not loaded; you load it yourself with launchctl.
~/Library/LaunchAgents/com.picassohq.cli.runner.plistOnly if you run picasso service install (keeps CLI threads running in the background). picasso service uninstall unloads and removes it.

The engine updater checks the npm registry at most every 6 hours, never while a turn runs. Turn it off with engineAutoUpdate: false in ~/.picasso/settings/settings.json. Picasso for Mac only checks; it never downloads an engine. Its engine updates arrive with the app.

picasso about --footprint (or /about in the terminal app) prints this list from the command line.

Reads and writes

Files and folders

Release builds always use the .picasso folder in your real home folder, whatever $HOME says.

PathWhat it holds
~/.picasso/Everything Picasso keeps, shared by the app and the CLI.
~/.picasso/dsh-home/The engine's home: sessions, attachments, checkpoints, the session search index, and .credentials.yaml (provider keys you add).
~/.picasso/settings/settings.jsonSettings shared by the app and the CLI.
~/.picasso/memory.jsonMemory.
~/.picasso/crash/Crash reports, at most 20, readable only by you.
~/.picasso/mcp/, ~/.picasso/mcp-catalog/MCP servers you added and the server catalog.
~/.picasso/projects/, ~/.picasso/schedules/, ~/.picasso/themes/, ~/.picasso/hosts/Projects, schedules, themes, paired hosts.
~/.picasso/imports/Progress of importing past sessions from other coding agents.
~/.picasso/research-outbox/, ~/.picasso/contributions/The free-tier contribution queue (see "Talks to").
~/.picasso/run/Where a running app tells picasso attach --mac how to reach it.
~/Library/Application Support/Picasso/App-only state: usage stats, sponsor events, quick notes, imported threads, browser screenshots and recordings, review marks, editor extensions, sounds, backdrops.
~/Library/Logs/Picasso/local-helper.logThe engine's log. Secrets are redacted before a line is written.
~/Library/Preferences/com.picassohq.picasso.plistThe app's preferences (UserDefaults keys starting picasso.): window, sidebar, onboarding and the tour, workspaces, key bindings.
~/Picasso, ~/Picasso ProjectsDefault places for new and cloned projects. Your code, so never removed for you.

<!-- docs-freshness-ignore: legacy-dsh-home --><!-- reason: the one-time copy reads the old folder --> The first launch copies providers and sessions from an existing ~/.dsh folder into ~/.picasso/dsh-home, once, if there is one, and never changes it. Earlier sandboxed builds left data in ~/Library/Containers/com.picassohq.picasso; it is read once to migrate.

Picasso reads and edits files only in the projects you open (and files you attach).

Keychain items

All are generic passwords in your login Keychain.

ServiceAccountHolds
com.picassohq.account-sessionthe account server, https://api.picassohq.comYour Picasso account sign-in, shared by the app and the CLI.
com.picassohq.picassopicasso.engine.<id>.token, provider namesTokens for remote engines you added, and provider keys saved from the app.
picasso.repo-hostsgithub, gitlab, bitbucket or a hostGit host tokens you connected.
com.picassohq.memory-keyyour accountThe key that encrypts synced memory.
com.picasso.research-outboxoutbox-keyThe key that encrypts the contribution queue on disk.
com.picasso.cliprovider sessionsCommand line only, read once: sign-ins saved by older CLI releases.

Permissions it asks for

PermissionWhen
MicrophoneOnly when you start dictation in the composer. Speech is transcribed on your Mac.
Documents, Desktop, Downloads, removable and network volumesWhen you open a project there.
Local networkOnly when you pair a device in Settings › Remote.
NotificationsDuring setup, so a finished or waiting thread can tell you.

It never asks for camera, screen recording, accessibility, Apple Events or speech recognition.

Talks to

EndpointWhat forWhen
https://updates.picassohq.com/mac/appcast.xmlApp updates (Sparkle). Every update is EdDSA-signed and the signature is checked before it installs.Every 6 hours, and from Picasso › Check for updates.
https://updates.picassohq.com/mac/Downloading an update.When one is found.
https://api.picassohq.comYour Picasso account: sign-in, plan, terms, privacy requests, the free starter model, sponsor impressions.When signed in, or when you use the free model.
https://api.picassohq.com/v1/diagnostics/reportsCrash and error reports.Only when "Send crash and error reports" is on (off by default).
https://registry.npmjs.orgEngine updates.At most every 6 hours, never during a turn. The app only checks.
The model providers you set upYour prompts and the files the agent reads, sent with your keys, for example api.openai.com, api.anthropic.com, generativelanguage.googleapis.com, openrouter.ai, or your own endpoint.Every turn.
https://prism.auraone.ai/v1Picasso's model gateway for the free starter model.Only when you use that model.
github.com, api.github.com, gitlab.com, bitbucket.org, api.bitbucket.orgConnecting a Git host, cloning, pull requests.Only after you connect one.
Your own MCP servers and plugin indexesWhatever you added.When you use them.

Usage telemetry is off: nothing about how you use Picasso is collected or sent. Sponsor impressions and clicks carry a random install ID that is not tied to your account.

Free tier: when you accept the free-tier terms, Picasso queues traces of your sessions in projects you work in and uploads them to api.picassohq.com for research. Settings › General › Data use and privacy shows what is queued and sent, and how to make a privacy request.

Removing it

Quit Picasso (and stop picasso in any terminal) first. Then:

# The app
rm -rf /Applications/Picasso.app

# The command line, if you installed it
npm rm -g @picassohq/cli

# Everything Picasso keeps
rm -rf ~/.picasso
rm -rf ~/Library/Application\ Support/Picasso ~/Library/Logs/Picasso
rm -rf ~/Library/Caches/com.picassohq.picasso ~/Library/HTTPStorages/com.picassohq.picasso
rm -rf ~/Library/Containers/com.picassohq.picasso
defaults delete com.picassohq.picasso

# The command line's service file, if you made one
launchctl bootout gui/$(id -u)/com.picassohq.host 2>/dev/null
launchctl bootout gui/$(id -u)/com.picassohq.cli.runner 2>/dev/null
rm -f ~/Library/LaunchAgents/com.picassohq.host.plist ~/Library/LaunchAgents/com.picassohq.cli.runner.plist

# Keychain items
for service in com.picassohq.account-session com.picassohq.picasso picasso.repo-hosts \
  com.picassohq.memory-key com.picasso.research-outbox com.picasso.cli; do
  while security delete-generic-password -s "$service" >/dev/null 2>&1; do :; done
done

<!-- docs-freshness-ignore: legacy-dsh-home --><!-- reason: another tool's folder, named so readers know it is kept --> ~/Picasso, ~/Picasso Projects and any ~/.dsh folder are yours and are left alone.