// Owns: /access/ (access and data): what agents can do on the PC, secrets by ID, where data and backups live, // and the unsigned-build steps. // Never: capability facts (data/features.mjs) or install steps (data/install.mjs). import { site, release, maker } from '../config.mjs'; import { page, pageHero, statusPill, downloadButton, abs, legend, stOf } from '../layout.mjs'; import { icon } from '../icons.mjs'; import { installSteps } from '../data/install.mjs'; const st = stOf('access'); // [id, label in the table of contents, heading in the text] const sections = [ ['short', 'In short', 'In short'], ['access', 'Full access', 'Agents have full access to your PC'], ['first-question', 'The first question', 'The first question'], ['steering', 'What steers them', 'What steers them instead'], ['secrets', 'Secrets', 'Secrets are referred to by ID'], ['accounts', 'AI sign-ins', 'Your AI sign-ins'], ['data', 'Where your data lives', 'Where your data lives'], ['leaves', 'What leaves your PC', 'What leaves your PC'], ['backups', 'Backups', 'Backups and export'], ['stop', 'Stopping work', 'Stopping work'], ['journal', 'What is written down', 'What is written down'], ['others', 'Who else can reach it', 'Who else can reach it'], ['unsigned', 'Unsigned builds', 'Unsigned builds, and what you will see'], ['updates', 'Updates', 'Updates'], ['limits', 'Not proven yet', 'What is not proven yet'], ['report', 'Report a problem', 'Reporting a problem'], ]; const h2 = (id) => `
${p}
Agents run as you${st('full-access')}. Codex runs with its approval policy on “never” and no sandbox; Claude Code runs with permissions bypassed. So an agent can:
There is no guardian model, no permission mode, no money limit and no approval gate in the app. Earlier versions had them. They were removed on purpose: in this product a clear text steers a model better than a wall, and a wall mostly produced questions. The provider’s own model rules still apply.
This has real consequences. In our own live test runs, agents given a vague request reached real repositories, backups, SSH keys and .env files within minutes, and one changed the permissions of a file it had found. So we run those tests under a throwaway profile, with a watcher that exists only on our test bench. On your PC nothing like it runs. If this PC holds something you cannot afford to have touched, give ${site.name} its own Windows user or a virtual machine.
The first run is short${st('first-question')}: a short tour, connect one AI, type your name and company, press Start. Then the app posts one automatic line in your manager’s chat, as if you had written it and marked as the app’s start text. It tells the manager to get to know you and your work, on the web and on this PC, and to ask you first, with a choice, what it may do: full access to this PC for good, this one search including private files just this once, or less.
The same line tells it to say plainly that it technically can already. The choice changes no setting and closes nothing. Your answer tells the AI what you want, an answer “for good” belongs in its memory, and a model follows it because you said so. You can read and replace this text: an own prompts/onboarding.md in the data folder takes its place.
Agents act on what they read, so that is where the care goes. All of it is plain text you can open and change.
rules.md), for example: before something you cannot undo, such as deleting, paying or sending to outsiders, check target, amount and recipient once.SYSTEM.md), which you or the manager can edit.Text can be wrong, and so can a model. A web page, a mail or a file can also contain instructions aimed at your agent. The app marks such content as untrusted when it hands it over, and that is a hint to the model, not a filter. Treat what an agent reads from outside as something that can influence it.
${h2('secrets')}Passwords and keys live in a catalog${st('vault')}, encrypted with your operating system’s protection: the Windows user key, the macOS keychain, the Linux keyring. If that protection is not available, the app stores nothing rather than falling back to plain text.
secret://github. The catalog’s text lies open in secrets/ in the data folder, without a single value.What this does not do: a command that receives a value can do anything with it, and masking only knows those encodings. It keeps values out of prompts and logs; it is not a barrier against an agent set on getting one. And it covers only the catalog. A password in a text file, a .env file or a browser export on your disk is as open to agents as any other file. Password import${st('import-pw')} reads such an export once and leaves the file where it is. Please delete it.
You sign in to ChatGPT and Claude through the providers’ official tools, Codex and Claude Code${st('plans')}, each added account in its own folder under accounts/. ${site.name} does not read, copy or forward the tokens those tools keep, and there is nothing to sign in to on our side. An agent with full access could still open those folders like any other, so this describes what the app does, not what an agent can reach.
${app.dataFolder.windows}, macOS ${app.dataFolder.mac}, Linux ${app.dataFolder.linux}. Settings › ${app.settingsHome} opens it, and its README.md lists every entry and what editing it does.workforce.db: chats, tasks, runs and accounts, with secret values encrypted. Stored files are in blobs/.settings.json, agents/, memory/, secrets/ (no values), connectors/, prompts/, theme.css, and a readable copy of your chats in chats/. What you and your agents change here, the app takes over.${app.workspace}: projects, downloads and shared skills.The data folder still carries the working name. The rename release is built to move it once, in place, so there is no second app and no second folder ${statusPill('next')}. That move has been tested in code, not yet through a real update.
`} ${h2('leaves')}No ${site.name} server holds your data, and the app has no analytics or usage reporting. Our meeting server only connects your devices and passes end-to-end encrypted traffic. Things do leave your PC, though, and these are the places:
For ${maker.company} as a company, see the privacy policy and the imprint.
${h2('backups')}backups/, or a folder you choose${st('settings-pages')}. It leaves out provider logins. Secret values stay in it encrypted with this PC’s key, so they open only here. Agents’ browser profiles with their logged-in sites and the scripts in connectors/ are copied as they are, so treat a backup as private. It only runs when you or an agent start it, and the default place is on the same disk, so copy it elsewhere.before-restore-<time>/. On another PC you sign in again and enter your secrets again.backups/pre-upgrade/. If starts keep failing, a repair screen opens${st('repair')}.exports/${st('export')}. All chats at once, into a folder you choose, is in Settings › About${st('settings-pages')}. chats/ in the data folder holds a readable copy anyway.None of this undoes what an agent did outside the data folder. A deleted project or a sent mail does not come back through a restore.
${h2('stop')}Stop all agent work${st('stop')} is in the tray, in the list behind the chat header’s live line and in the command palette. While agents work, Ctrl Alt Shift X does the same.
There is no Stop button in the chat itself: a message redirects an agent. Closing the window does not stop anything, because agents keep running in the tray. With “Start with Windows” or “Start at login” on in Settings, which is off by default, the app also comes back at sign-in and after a crash, and on Windows for the next due work after you quit.
${h2('journal')}Tool calls and their outcome are written to a run journal${st('journal')}. Under an agent’s message you can open its steps, and its page in Team lists its runs. After a crash, a call that may have had an effect is reported to the agent as unknown to check, rather than simply repeated. This helps you read afterwards what happened. It prevents nothing.
${h2('others')}runtime.json. Any program running under your user can read that file and control the app. This is how scripts and bridges work.${site.name} is not code-signed: no Windows certificate, no Apple Developer ID. Your system cannot confirm who made the file, so it warns you. What follows is what you will see. All steps are also on the download page.
Every release lists SHA-256 hashes in SHA256SUMS.txt. On Windows: Get-FileHash .\\${files.windows} in PowerShell. On macOS or Linux: shasum -a 256 <file>. A match shows the file arrived as published. It does not replace a signature, because the list comes from the same release as the file.
While the window is open the app asks GitHub Releases every minute, and every 15 minutes from the tray${st('updates')}. A small icon appears only when an update exists. On Windows and Linux one click downloads it, checks it against the SHA-512 in the release manifest, installs it and restarts.
${release.renamed ? 'On macOS the app replaces itself where macOS allows it. That path is new; if macOS refuses, the app keeps working and the icon leads to the download.' : `On macOS the icon leads to the download: you replace the app by hand, and your data stays. A Mac update that replaces itself is built ${statusPill('next')}, starts with the release after the rename, and has never run on a real Mac. If macOS refuses it, the manual way stays.`}
${h2('limits')}${site.name} is young. This is what we have not proven.
For a bug that puts no one at risk, open an issue on GitHub. For anything sensitive, such as a secret that leaks or a problem with updates, please do not post it publicly. Contact ${maker.company} directly and give us time to fix it.