Legal

Data handling

Draft — pending attorney review

A technical summary of where data lives, how long it’s kept, and what crosses the network.

Effective date: not set yet. This draft isn’t in effect; the date is set on the day the final version is published.

Who we are

Rooted Reality LLC, a Michigan limited liability company (“Rooted Reality”, “we”)
PO Box 5001, Muskegon, MI 49445
hello@rootedreality.com

Coding agents

Rooted Reality for coding agents

These sections cover the recorder and the desktop app on Mac, where the private beta is forming now.

Where each kind of data lives

Draft — pending attorney review

The record (your Mac)
~/Library/Application Support/Blackbox/blackbox.sqlite3 when the recorder starts at login, or ~/Library/Application Support/com.rootedreality.agents/blackbox when you start it from the desktop app. A SQLite database with its write-ahead files. It holds chats, programs, events, connections, daily summaries, facts about program files, the recorder’s own runs, its settings and an install ID.
Recorder log (your Mac)
~/Library/Logs/Blackbox/blackbox.log, readable only by your user account. Each time a blackbox command starts, a log that has reached 20 MB is moved aside, keeping one older copy; while the recorder runs, the log can grow past that. When the recorder starts at login, it also writes watch.out.log and watch.err.log in the same folder. watch.err.log holds the same lines as the log and is moved aside only when the login item is installed; watch.out.log is never moved aside.
Exports (your Mac)
Only if you run the recorder’s export command: a JSON file in an exports folder beside the record, readable only by your user account, or in a folder you name with --out. It includes the install ID. The desktop app never runs it.
Labels (your Mac)
labels.sqlite in the desktop app’s own folder: a session ID, a time, the kind of event (or model.switch for a model change found by comparing a session with its transcript), your label (up to 80 characters) and your note (up to 200). A label or note with a slash or a backslash in it is refused, so it can’t hold a folder path.
What you agreed to (your Mac)
Which version of the beta agreement and of the recording consent you agreed to, and when, in a small file in the desktop app’s own folder. It isn’t sent anywhere.
Goes out, carrying nothing from the record
Host-name lookups, to your DNS servers. Update checks, to rootedreality.com, once you have agreed to the beta agreement. The app doesn’t install updates itself during the beta. If a newer version exists, it tells you; you then download it from rootedreality.com and replace the app.
Our database
Waitlist sign-ups (email address, agents, computer, call yes or no, sign-up time), update-list sign-ups (email address, the page you signed up on, the referring page without its query string, sign-up time, and when you unsubscribed) and rate-limit entries (a SHA-256 hash of an IP address, the name of the form or request, the time), in Postgres hosted by Neon in the AWS us-east-1 region.
Never recorded
Your conversations with the agent. What's inside your files. The contents of network traffic.

How long it’s kept

Draft — pending attorney review

Events and connections
14 days. There is no control to change this yet.
Chats, programs and daily summaries
365 days. There is no control to change this yet.
When deletion runs
Once an hour, while the recorder is running. When it isn’t running, nothing is deleted until it runs again.
Kept until you wipe
Facts about program files (path, size, fingerprint, signing details), the install ID and settings, and the latest note of each kind about the recorder’s own health.
Recorder log
Moved aside at 20 MB each time a blackbox command starts, keeping one older copy; it can grow past that during a long run. The login item’s two logs are handled as described above. Wiping the record keeps all of them.
Labels
Until you delete them in the desktop app.
What you agreed to
Until you delete the file. Moving the app to the Trash doesn’t delete it.
Waitlist sign-ups
Until you ask us to remove them. A deleted entry can stay in our database host’s restore points until they expire.
Update-list sign-ups
Until you ask us to remove them. Unsubscribing doesn’t remove an entry: it stays, marked as unsubscribed, so no more digests go to it.
Rate-limit entries
Deleted once they are more than two hours old, when a later request is allowed.
Hosting logs and analytics
Kept by Vercel, for a limited period set by our Vercel plan.

The network boundary

Draft — pending attorney review

Desktop app
It contacts nothing until you agree to the beta agreement. After that, the update check goes to one host, rootedreality.com. The app doesn’t install updates itself during the beta. If a newer version exists, it tells you; you then download it from rootedreality.com and replace the app. That download happens in your browser, not in the app. The app’s window may load and connect to the app itself only. No analytics or crash reporting.
Recorder
Forward host-name lookups of a fixed list, through the Mac’s own resolver (getaddrinfo): the whole list at once when it starts (up to 16 lookups at a time), then again every 300 seconds, one name every 100 ms. No reverse lookups. No web requests: it has no HTTP client. --no-dns turns the lookups off; the login item leaves them on unless it was installed with --no-dns, and the desktop app’s Start recording button always leaves them on.
The 38 names it looks up
api.anthropic.com, statsig.anthropic.com, mcp-proxy.anthropic.com, downloads.claude.ai, api.openai.com, chatgpt.com, api.githubcopilot.com, copilot-proxy.githubusercontent.com, generativelanguage.googleapis.com, cloudcode-pa.googleapis.com, oauth2.googleapis.com, api2.cursor.sh, api3.cursor.sh, repo42.cursor.sh, server.codeium.com, ampcode.com, openrouter.ai, github.com, api.github.com, codeload.github.com, objects.githubusercontent.com, raw.githubusercontent.com, registry.npmjs.org, pypi.org, files.pythonhosted.org, static.crates.io, index.crates.io, crates.io, huggingface.co, cdn-lfs.huggingface.co, upload.pypi.org, ghcr.io, npm.pkg.github.com, registry-1.docker.io, registry.yarnpkg.com, proxy.golang.org, rubygems.org, sts.amazonaws.com.
What the lookups show
Your DNS servers see that this Mac asked for these names, and when. A lookup never includes an address or a name a program used.
The update check
An HTTPS GET to rootedreality.com/api/releases/agents/update/{system}/{chip}/{version}, with Accept: application/json and a user agent naming the updater and its version. No body, no install ID, no account. It starts only after you agree to the beta agreement, then runs when you open the app. Vercel, which hosts this website, keeps the request in its logs for a limited period set by our Vercel plan; we don’t read those logs.
Downloading an update
The app doesn’t install updates itself during the beta. If a newer version exists, it tells you; you then download it from rootedreality.com and replace the app. The app’s Download button opens that download in your browser. It is the newer version’s installer: the download link sends your browser on to GitHub, where it is stored. Vercel and GitHub each see your network address and your browser’s user agent, like any web request.
Downloading the installer
The download link on rootedreality.com sends your browser on to GitHub, where the installer is stored. Vercel and GitHub each see your network address and your browser’s user agent, like any web request.

Changes to this page

Draft — pending attorney review

If what this page describes changes, we’ll publish the new version on this page and change the effective date at the top of it. If a change is material, we’ll also email the people on our waitlist, and anyone on our update list who hasn’t unsubscribed, when we publish it.