Data and storage
What OpenOrc stores on your computer, where, for how long, and what deleting removes.
OpenOrc keeps your work on your computer, almost all of it in one data folder. It has no server of its own, and Network connections lists everything that leaves your computer. Cloud threads and the cloud brain also keep work on the cloud account you connect. See In the cloud.
The data folder
The folder is ~/Library/Application Support/OpenOrc on macOS, %APPDATA%\OpenOrc on Windows, and ~/.config/OpenOrc on Linux. The OPENORC_USER_DATA environment variable picks another folder. Settings, then Data, shows the path in use.
| Path | What it holds |
|---|---|
openorc.sqlite, -wal, -shm | The database: threads, tasks, agent events, memories, and settings. Back up all three files together. |
attachments/ | Files you attached. Images get a random name; other files get a random ID followed by their own name. |
tool-images/ | Images that agents' tools returned, one folder per run |
worktrees/ | Worktrees for threads and tasks, and copies of pull requests under review, one folder per project |
workspace/ | The default folder for Workspace threads |
orclings/ | A folder for each Orcling to work in |
logs/provider/ | The agents' native output, kept for debugging. Streamed pieces are left out, and a line over 64 KiB is cut to a preview. |
models/ | The model that memory search runs on this computer, downloaded the first time memory needs it |
project-icons/ | Icons OpenOrc found for your projects, and the one you chose |
claude-accounts/ | A folder for each Claude account you added, where Claude Code keeps that account's sign-in, settings, and sessions. Your existing Claude Code login stays in ~/.claude. |
code-explanations/ | Explanations of code files, kept for the exact text they explain. The 300 most recent stay. |
devices/ | The tools that run simulators and emulators, and their state, once you turn on device support |
mirrors/ | Read-only copies of cloud brain threads' code, one folder per thread you chose Open on Mac for |
kept-sessions/ | Copies of an agent's session that a newer copy replaced when a thread moved to or from the cloud, so none is lost. They go when the thread is deleted. |
agent-processes/ | On macOS and Linux, a record of each running agent process: its ID and start time, and OpenOrc's own. The next launch uses it to stop any left behind by a crash. No prompts or credentials. |
slack-secrets.enc, memory-extraction-key.enc, github-reviewer-app.enc, remote-access-key.enc, apns-key.enc, and the files for cloud threads | Encrypted secrets; see Settings and secrets |
updates.json, .updaterId | Whether OpenOrc checks for updates on its own and which version you dismissed or were told about, and a random ID the update library keeps. OpenOrc sends that ID empty. |
exports/ | Patch files you exported from a task |
task-checkout/ | Scratch copies made while applying a task to your checkout |
Electron keeps the app window's own browser data in the same folder, including the window storage below.
.env files that new worktrees get a copy of. A project setting, Copy these gitignored files into new worktrees, controls which files are copied.
Outside the data folder
- Your repositories. Worktree branches, and refs under
refs/openorc/that keep each turn's checkpoint, task snapshots, and edits a cloud thread's sync set aside. See Git and worktrees. - Your project's files, only when you ask: exporting a plan, adding a memory to
CLAUDE.mdorAGENTS.md, saving a file in the Files or Instructions tab, or a Git action such as committing, restoring a checkpoint, moving a thread, or applying a task to your checkout. The Instructions tab can also save your personal instruction file, such as~/.claude/CLAUDE.md. - Claude accounts. Moving a thread to another Claude account copies its Claude Code session into that account's folder, so the conversation can continue there.
- The agents' sessions from the cloud. After each cloud turn, and when a thread comes back from the cloud brain, the agent's session is copied into the agent's own folder on your computer, such as
~/.claude/projects. - Claude's plans folder. A Claude Code thread in Plan mode creates
~/.claude/plans, orplansinsideCLAUDE_CONFIG_DIR, if it doesn't exist. - Temporary folders. Private folders in your system's temporary folder: one per Claude Code process for the files that hold OpenOrc's tool address, scratch space when Codex writes a title or summary in the background, and throwaway Git index files. Each is deleted when its job ends.
- Downloaded updates. The update library keeps a downloaded app update in your system's cache folder.
- The agents' own records. Each CLI keeps its own transcripts, such as
~/.claude/projectsand~/.codex/sessions. OpenOrc never redacts or deletes them, and the provider may keep data on its servers under its own terms.
The database
The database is SQLite, opened by OpenOrc's core process and nothing else. It runs in write-ahead mode with synchronous = NORMAL: a committed write survives an app crash, but the last moments before an operating system crash or power loss can be lost. The schema is a list of migrations, and PRAGMA user_version records how many have run. A migration that fails rolls back and stops startup.
| Area | Tables |
|---|---|
| Work | projects, threads, tasks, runs, thread_messages, thread_queue, conversation_plans, conversation_plan_turns |
| Events | events, artifacts, audit_events |
| Changes and review | thread_checkpoints, snapshots, review_comments, pull_request_reviews, pull_request_review_comments |
| Task discussions | task_comments, task_comment_attempts |
| Schedules | schedules, schedule_firings |
| Memory | memories, memory_files, session_summaries, extraction_jobs |
| Orclings | orclings, orcling_instructions |
| Claude accounts | claude_accounts |
| Paired phones | remote_devices, remote_push_targets |
| Settings | settings |
| Search | messages_fts and memories_fts (SQLite full-text search), memory_vec (vectors for memory search) |
threads.parent_thread_id links a thread to the thread it sits under: the thread whose agent started it with thread_start, the thread you started a subthread from, or, for a subagent, the thread whose agent ran it. audit_events records about 70 kinds of action and who took it (you, an agent, or OpenOrc): starting runs, creating tasks, committing, pushing, restoring files, approval decisions, and more.
Source: packages/db/src/database.ts, schema.ts, repos.ts
Agent events
Everything an agent does arrives as events: text, tool calls, command output, file changes, and approvals. The events table keeps them in order, one row each.
- Events are written in batches, every 50 ms or as soon as 500 are waiting. An event still waiting when the process crashes is lost.
- An event over 8 KiB goes to
artifacts, and its row keeps a short preview. - Images in tool results are written to
tool-images/, and the event keeps a link. - A streamed reply arrives as many small pieces. Once the finished message is stored, the pieces in between are deleted.
- The agents' native output isn't stored here. It goes to
logs/provider/.
Message search uses messages_fts, which indexes the redacted text of your messages and the agents' replies, not tool output or reasoning. Every word you type must match the start of a word, up to 8 words, and the command palette shows the best 20 matches.
Source: packages/db/src/ledger.ts, fragments.ts, search.ts
Redaction
Before OpenOrc stores an agent's events, run results, the audit log, the provider log, memories, and Slack requests, it replaces text that looks like a secret with a marker such as [redacted:github-token]. It looks for:
- Known token shapes: GitHub, GitLab, Slack, Anthropic, OpenAI, Stripe, npm, and Hugging Face tokens, Google API keys, AWS access key IDs, OpenOrc device keys, JSON Web Tokens, and private keys, even one cut off before its end line.
- Credentials in context: the token after
BearerorBasic, the password in a URL such aspostgres://user:password@host, and a value of 8 or more characters given to a secret name, as inDB_PASSWORD=…. - Secret fields: in structured data, such as a tool's input, the whole value of a field with a secret name, or one named
cookieorset-cookie.
A secret name ends in api key, secret, secret key, client secret, access token, auth token, refresh token, private key, password, passwd, or authorization, in any case and with any prefix. Code that only names a secret, such as apiKey: process.env.API_KEY, is left alone.
Some text is stored as written:
- Text an agent reads later, such as plans, task comments, review comments and messages you queue, which stay stored after they are sent. Redacting it would change what the agent gets.
- Text you write and edit: drafts, task descriptions, schedule prompts, pull request review drafts, and Orcling instructions.
- Everything outside OpenOrc's records, such as your project, its Git history, and the agents' own transcripts.
Source: packages/db/src/redact.ts
Settings and secrets
App settings are one JSON row in the settings table. The same table holds memory and text generation settings, the reviewer app's details, the Workspace entrypoint, records of Slack requests (redacted), the last usage reports, upkeep markers, and small records that keep an action from running twice. Each project's settings are stored on its row. Settings lists where each choice lives.
Secrets never go in the database. OpenOrc encrypts them with your system's protected storage (the macOS Keychain, Windows DPAPI, or the Secret Service or KWallet on Linux) and writes each to its own file:
| File | Holds |
|---|---|
slack-secrets.enc | Slack tokens, device keys, and Slack connection settings |
memory-extraction-key.enc | The optional Anthropic API key for memory |
github-reviewer-app.enc | The private key of your GitHub reviewer app |
remote-access-key.enc | This computer's key pair for encrypted phone connections |
apns-key.enc | The Apple push key for phone notifications, if you added one |
cloud-credentials.enc | The Vercel token and Agent37 key, and every Settings → Cloud choice: team, sizes, region, where new cloud threads run, and Carry working threads on in the cloud |
claude-cloud-tokens.enc | Each Claude account's token for cloud sandboxes |
codex-cloud-login.enc | The ChatGPT sign-in or OpenAI API key that Codex uses in cloud sandboxes |
opencode-cloud-keys.enc | OpenCode's provider keys for the cloud |
cloud-brain.enc, cloud-brain-move.enc | The cloud brain's key and where it runs, and a new brain's while the brain moves to the other service |
- Each file is written to a temporary file that only you can read, synced to disk, then moved into place.
- The window can save a secret but never read one back. The one exception is a new Slack device key, shown once so you can pass it on; the relay keeps only a hash of it.
- On Linux, OpenOrc refuses to save a secret when the system would store it as plain text.
- On macOS and Linux, development and installed builds use different keychain entries, so one can't read the other's secrets.
Each CLI keeps its own credentials, including Claude Code in the folder of each account you added. OpenOrc doesn't store them. The only agent credentials OpenOrc keeps are in the cloud files above. They hold the tokens and sign-ins made for the cloud, and the Codex or OpenCode keys you approved copying.
Source: packages/core/src/services/settings.ts, apps/desktop/src/main/protected-secrets.ts, apps/desktop/src/shared/protected-secrets.ts
In the cloud
Cloud threads and the cloud brain keep work on the Vercel team or Agent37 account you connect. Your computer still holds each conversation, unless the cloud brain owns it.
- A cloud thread's sandbox holds the thread's checkout with its uncommitted changes, what the project's setup script installed, the agent's installation, and the agent's sessions. Unless the firewall keeps it outside, the agent's sign-in is there too, as a file or in the agent's environment. The files stay while the sandbox sleeps, until you remove the sandbox or delete the thread.
- The cloud brain holds what OpenOrc holds on a computer for its own threads: its database, the copies of the projects you switched on, the worktrees of its threads, and memory for those projects. Its secrets, such as the cloud tokens, its Codex login, and your GitHub sign-in if you switched it on, are in files sealed with AES-256-GCM under the brain's key.
- The brain's key stays in
cloud-brain.encon your computer, and the brain gets it each time it starts, never on its disk. An Agent37 instance keeps it in its environment, so the brain can start again after a restart. On Vercel, the brain's door keeps the key and your Vercel token in a sensitive environment variable of its own project,openorc-door, so it can wake the brain for a phone.
Removing the cloud brain deletes its machine, its disk, the sandboxes it made, and the conversations on it. See Remove cloud resources.
Source: packages/core/src/services/cloud-workspaces.ts, packages/cloud/src/brain/sealed-file.ts, brain/wire.ts, apps/brain/src/secrets.ts, host.ts
Window storage
- Local storage holds drafts and pending requests (
openorc.draft.*), such as composer text, task descriptions and comments, and edits in the Instructions tab. It also holds the layout and Preview addresses (openorc.layout), the side panel's tabs (openorc.panel-sessions), appearance (openorc.theme,openorc.palette,openorc.colors,openorc.font,openorc.code-font, and two window transparency keys), setup progress (openorc.onboarding), and a few small choices: the project for a new thread, word wrap, how you last reviewed a pull request, and which notifications were already shown. A thread's draft is also saved in the database. - IndexedDB holds images pasted into task descriptions (
openorc-image-drafts) and unsaved edits to files in the Files tab (openorc-file-drafts). - The Preview browser has its own persistent session, shared by every Preview. It keeps the cookies and site data of pages you open there, including sign-ins, across restarts. The cookies are encrypted on disk, but on Linux without the Secret Service or KWallet they are only obscured; see Security model.
How long things stay
Almost nothing expires. Threads, events, runs, and memories stay until you delete them, and the database has no size limit. Attachments and audit log entries are never deleted. A thread with no work since before yesterday shows under Resolved, but nothing about it is stored or removed.
| Data | How long |
|---|---|
Native agent output in logs/provider/ | 14 days. A new file starts every 10 MiB or every day, and the oldest files go first once the folder passes 512 MiB. |
| Native output rows that older versions stored in the database | 14 days |
| Search entries and tool images of deleted runs | Removed when you delete the thread or task. Anything left over goes in the next upkeep pass. |
| Attachments and audit log entries | Never deleted, even with their thread |
| Pending approvals | Held in memory only. Quitting denies them. |
The upkeep pass runs 60 seconds after launch and every 6 hours after that. It also returns free space in the database to your disk. A database made by an older version, which can't return free space bit by bit, is rebuilt once at startup if at least 64 MiB and a quarter of the file are free space, the disk has room for the rebuild, and no rebuild failed in the last 3 days. The window then says Tidying up saved history. This happens once and can take a minute.
Source: packages/core/src/services/ledger-upkeep.ts, provider-log.ts, packages/db/src/maintenance.ts
What deleting removes
A thread
Choose Delete thread in a thread's menu, then confirm. OpenOrc closes the thread's agent and removes:
- Its runs, events, run summaries, message log, plans, checkpoints, queued messages, and review comments, plus the refs that kept its checkpoints in Git.
- The threads of its subagents.
- Its worktree, unless another thread still uses it, as forks and threads it started do. Uncommitted changes are committed to the worktree's branch first, and the branch stays. A pull request copy's changes are discarded instead.
- A cloud thread's sandbox, on Vercel or Agent37.
These stay: tasks the thread created, threads it started, its attachments and memories, audit log entries, its lines in the provider log until they expire, and the agents' own session files.
An Orcling's own conversation goes only with the Orcling. A subagent's thread can be deleted once it has finished, and takes the subagents under it along. Its parent thread stays.
A task
Delete task is at the bottom of a task's page. It removes the task, its discussion, its own runs, and its own worktree unless a thread uses it. Uncommitted changes in that worktree are committed to its branch first, and the branch stays. The thread that worked on the task keeps its messages and changes.
A project
On the New thread page, click the project's name, right-click the project in the list, and choose Remove project…. This takes it off the Projects list and deletes nothing: files, worktrees, and history stay, and running work and schedules continue. Add the folder again to bring it back.
An Orcling
Delete followed by the Orcling's name removes its conversation, instructions, and memories. Its folder goes only if it is empty. Threads it worked in keep their history.
Source: packages/core/src/services/threads.ts (delete), workspace.ts, orclings.ts, projects.ts, packages/core/src/handlers/thread-workspace.ts, task-delete.ts
Next steps
Checked against OpenOrc's source on November 9, 2026.