Privacy policy
Draft. This policy has not been reviewed by a lawyer and is not yet in effect. Items in square brackets are still to be decided.
Last updated 25 October 2026. This policy covers the Smalti apps and this website. Smalti is published by Noah Johnson, an individual, referred to below as "I" or "me".
Summary
- Smalti has no accounts and no server. I do not receive any data from the apps.
- The apps contain no telemetry, analytics, crash reporting or advertising.
- The apps read Claude Code transcripts from your own disk, or on iOS from your own computers over SSH, and keep what they store on your device.
- This website sets no cookies and uses no analytics or third-party scripts.
What the apps read
- Claude Code transcripts. The macOS app reads the JSONL files under
~/.claude/projects. From each it extracts the session ID, working directory, generated title or first prompt, message count, and the paths of files the session read or edited. Transcripts are read only. They are never modified, uploaded or shared. - Files you open. The file tree lists the folder you choose. Files are read when you open them in a panel, and notes are written back to the file they came from.
- Process information. For each terminal panel the macOS app reads the executable path, working directory, start time, memory footprint and CPU time of the processes running in it, using the system's process APIs. This is used to detect Claude Code and for the resource governor.
- Machine state. Memory pressure, memory use, thermal state, Low Power Mode and battery state.
- Microphone and camera status. The governor checks whether a microphone or camera is in use, so it can lower the priority of background agents during a call. It never records, reads or transmits audio or video. macOS may ask you to allow this.
- SSH configuration. The command palette reads host names from
~/.ssh/configso it can offerssh <host>. Nothing else in the file is used.
What the apps store
macOS
Everything is stored in ~/Library/Application Support/Smalti:
workspace.json: the file tree root, the canvas position and zoom, and for each panel its kind, frame, working directory, URL or note path;sessions-v3.json: a cache of the details listed above for each transcript, plus its path, size and modification time;notes/: notes created in the app.
The app also keeps small counters in its preferences (how many times it has shown a shortcut hint), and writes ~/.commitwell-pool/holds/smalti.json only if you use the CI panel's pool hold button. The Mac app never writes to ~/.claude, installs no Claude Code hooks, and changes no settings files. (smaltid can install hooks; see below.)
The resource governor can pause (SIGSTOP), resume (SIGCONT) and lower the priority of processes inside Smalti's own terminal panels. It stops a process (SIGKILL) only when you press Kill.
Browser panels use WebKit's default website data store, so sites you visit inside Smalti can set cookies and local storage in the same way they would in Safari.
iPhone and iPad (in development)
- The list of hosts you add: name, hostname, user, port, which key to use, the host's pinned public key and its projects folder.
- SSH private keys, in the iOS Keychain as this-device-only items. They are not synced to iCloud and are never transmitted. Removing a key in the app deletes it from the Keychain.
- Session details parsed from transcripts downloaded from your hosts, cached on the device.
- A summary of the fleet's status shared with the app's own widgets and Live Activity on the same device.
- A push encryption key, made on the device the first time notifications are allowed, kept in the iOS Keychain as a this-device-only item shared with the app's notification extension. Only its public half leaves the device, to the machines you pair.
Notifications for permission requests arrive through Apple's push service (see Push notifications), and the app also creates some on the device from what it fetches from your hosts while refreshing in the background. Approving from a notification requires Face ID or your passcode.
Windows (in development)
The Windows app will follow the same rules as the macOS app. This section will list its storage locations before it is released.
smaltid, the background service (in development)
smaltid is a small service that runs on each machine that hosts agents. When it is running:
- It reads the same transcripts as the Mac app, and Codex CLI sessions under
~/.codex/sessionsif that folder exists. Its state is kept in~/Library/Application Support/Smalti/daemonon macOS and%LOCALAPPDATA%\Smalti\daemonon Windows. - It listens only on
127.0.0.1and on the machine's Tailscale addresses. It refuses to listen on all interfaces or on local network addresses, even if configured to. - Every request needs a token. The owner token is kept in the macOS Keychain or Windows Credential Manager (a file readable only by you on Linux). Paired devices get their own tokens, and only hashes of those are stored.
- It changes
~/.claude/settings.jsononly if you runsmaltid install-hooks, which adds its hooks, keeps every other setting, and writes a backup first.smaltid install-hooks --dry-runshows the change without making it, andsmaltid uninstall-hooksremoves it. - When its hooks pass a permission request to your phone, the request and your answer travel between your own devices over Tailscale.
- If you pair machines into a fleet, each machine holds a token for its peers in the operating system's credential store. A peer token can read only health, the inbox, sessions and governor state, and answer permission requests.
- Push notifications to phones that registered for them are sent through the push relay described in Push notifications.
smalti-conductor (in development)
The Conductor prototype keeps its policy, action log, missions, agent library and lesson proposals as files in ~/.smalti/conductor. It starts Claude Code (and optionally Codex) sessions in tmux on your machine, and uses gh and cw for pull requests and CI status, which contact GitHub and Commitwell with your existing credentials. Its web view listens on port 47822 on 127.0.0.1 and the machine's Tailscale addresses only, and needs a token kept in a file readable only by you.
The Mac app connects to smaltid on 127.0.0.1 when it is running on the same machine.
Push notifications
When you allow notifications in the iPhone app, iOS gives the app a device token from Apple's push service, and the app sends that token and the public half of its push key to each machine you have paired. For each permission request, smaltid encrypts the details (machine, project, tool and command) to that key and sends only the device token, the time and the encrypted message to the Smalti push relay at push.smalti.dev, which I operate on Cloudflare Workers. The relay passes it to Apple's push service, which delivers it to your phone, where the app decrypts it.
- Neither the relay nor Apple can read the request. They see the device token, when a notification was sent and roughly how large it was.
- The relay keeps no logs and no database. It remembers recently sent messages in memory for a few minutes to refuse duplicates and to limit how many notifications one device gets per minute.
- Cloudflare and Apple handle this traffic under their own privacy policies.
- Nothing is sent until a phone registers. To stop, turn off notifications for Smalti, unpair the phone, or set
"push": {"enabled": false}in smaltid'sconfig.json.
Network connections
The apps never connect to me or to any server I operate, apart from the push relay above, and they do not check for updates automatically. The macOS app starts no network connections of its own, apart from talking to smaltid on the same machine when it is running. Network connections happen only as a result of what you do:
- Browser panels load the pages you open. A new browser panel opens google.com, and text typed in the address field that is not a web address is sent to Google Search. The privacy policies of those sites apply.
- The CI panel runs the Commitwell command line tool,
cw, which contacts the Commitwell server you have signed in to. Smalti does not see or store your Commitwell credentials. - Terminals run the programs you start, which may connect to the internet. Claude Code, for example, communicates with Anthropic under Anthropic's terms and privacy policy. Smalti does not see or alter that traffic.
- Remote hosts (iOS) are reached over SSH at the addresses you configure, usually through Tailscale. Smalti does not route traffic through any other server.
- Downloads of Smalti are served by GitHub, whose privacy statement applies to that request.
This website
The site is a set of static files. It sets no cookies, uses no analytics, and loads no fonts, scripts or images from other domains. If you change the colour theme, your choice is saved in your browser's local storage under the key theme and never leaves your device.
The site is hosted by Cloudflare Pages. Like most web hosts, it may keep standard access logs (IP address, browser user agent, page requested and time) for security and operations. I do not use these logs to identify or track visitors.
Your choices and rights
Because I do not collect personal data through the apps or the website, I hold none to access, correct or delete. The data the apps keep is on your devices and you can remove it at any time by deleting the folders listed above, removing hosts and keys in the iOS app, or uninstalling the app.
Children
Smalti is a developer tool and is not directed at children.
Changes
If this policy changes, the new version will be posted on this page with a new date. Significant changes will also be noted in the changelog.
Contact
Questions about this policy can be sent to Noah Johnson at hello@smalti.dev.