SHALL — Privacy Policy
SHALL is an iPhone client for an AI agent you run on your own computer. This policy describes this build, and it is written to match what the software does rather than what would be pleasant to claim. Where the app is limited, the limit is stated.
SHALL collects nothing, because there is no server
SHALL is a client for an AI agent that you already run, on a computer you own. There is no SHALL service in the middle. We operate no server that your device talks to, we receive nothing from your device, and there is no account to create.
That is not a policy choice we could quietly reverse; it is how the app is built. The app and its keyboard open a connection to the address you enter and to nothing else.
Everything below is a consequence of that one fact.
What SHALL sends, and when
Data leaves your device in one direction only: to the agent at the address you configured. It is sent in exactly these cases:
- You typed a request and sent it. In the app you type into a field you can see and tap Send; nothing is sent before that tap. In the keyboard there is a step in between: Review shows the exact text that will be transmitted and names the destination it is going to, and only the confirm button on that screen sends it.
- You added context and confirmed it. In the keyboard you can attach your current selection, the visible text of the field you are typing in, or the clipboard. Each of these requires you to tap that specific action; each one then appears in that review screen as part of the exact text; and each is sent only when you confirm there.
- You shared something. Text or a picture shared into SHALL from another app is sent when you tap an action on it.
Normal typing is never transmitted. Every keystroke you make on the SHALL keyboard stays on the device, whether or not Full Access is enabled. The keyboard records no keystrokes, learns nothing from them, and has nowhere to send them.
The keyboard never reads your clipboard on its own. It reads the pasteboard only inside the Clipboard action you tapped, and writes it only inside the Copy action you tapped. There are three pasteboard operations in the whole keyboard, and an automated test fails the build if a fourth is ever added.
We do not see any of it. The request goes to your machine. We are not on that path.
The built-in demo sends nothing at all. SHALL contains a demo for when you have no agent to connect to. Its answers are produced on your device, it holds no connection of any kind, and it works in Airplane Mode.
You turn it on yourself in the app: it is a button, offered only while no agent is configured. The keyboard is the one place it also answers on its own, and only where no agent is configured — so that a keyboard installed before you have set anything up still does something. That state is also where you land if you disconnect an agent later: the check is for a connection now, not for whether there was ever one. A connection that fails never becomes the demo. Once an agent is configured, the keyboard reports what went wrong instead of answering locally, because an invented answer presented as your own machine's is the one mistake this product must not make.
Wherever it answers, it says so. In the app the status reads Demo agent where a machine name would be, the runs are marked in the list, and every answer begins Demo answer:. In the keyboard the destination reads Local demo and the answer begins Demo result:. Those words are part of the answer text itself, so they come with it if you copy it out.
What SHALL stores on your device
-
Your agent's address and its key. The key is stored in the iOS Keychain, marked as available only on this device after first unlock. It is never written to a file, a log, an iCloud backup or a shared preference, and it never leaves the device except as the authorisation header of a request to your own agent. You can remove it at any time with Remove agent.
-
A bounded history of your runs. The file SHALL writes holds, for each run, thirteen things and nothing else: the run's identifier and its status; the answer your agent gave and, if it failed, the error text it ended with; the most recent status line it reported — only the last one, not the sequence; the name and the summary your agent gave the run; the risk level your agent stated, where it stated one; the conversation identifier your agent supplied; the name of the agent the run belongs to, which is your own machine's host name as you entered it; where the run was started from, meaning the app, the keyboard or the share sheet; and the times it was created and last changed. It is capped at fifty runs, past which finished runs are dropped before unfinished ones and the oldest go first; and it goes when SHALL goes.
The file has no field for the request you typed. A prompt is held only in memory, by the part of SHALL you typed it into, and only for as long as that part is running — which is why a run you just started is listed under your own words and can be repeated, and why the same run, after you quit and reopen SHALL, is listed under the name your agent gave it, or under a short run identifier when your agent gave none. When your agent answers, what is written down is your agent's answer.
The demo is the exception, and it is worth stating plainly. The demo's answer quotes you back: it repeats the first line of your request, up to 120 characters of it, so that the reply reads as a reply. That answer is stored the way any other answer is stored — so a demo run started in the app leaves up to 120 characters of your own words in the run history. They stay there until you turn the demo off or connect an agent, both of which empty the history, or until the fifty-run cap drops that run. The demo in the keyboard and the demo in the share sheet record no run at all, so nothing you type there is written down.
It is one store, shared by the parts that write runs. The app and the share extension both write into a single file in a container the three parts of SHALL share — an iOS App Group, which no other app on your device can read — so a run the share extension recorded is a run the app can list. The keyboard keeps no run file of its own: when you leave a run going and dismiss the keyboard, it passes the app the run's identifier and nothing else, so the app can ask your agent what became of it. That hand-over goes through a Keychain group the three parts share, and that group holds six small records: your agent's key, your agent's address, the keyboard settings you chose in the app, a note the keyboard leaves when iOS loads it so the app can tell you whether your keyboard is installed and what it can currently see, whether the demo is on, and those run identifiers. Apart from the address you typed yourself, none of them holds anything you wrote to your agent or anything your agent answered, and the run history itself is never in it.
-
A few non-sensitive settings — the keyboard layout language, whether clipboard capture is offered, the appearance and notification preferences.
Nothing in this list is transmitted anywhere.
What SHALL does not do
- No analytics, of any kind.
- No advertising, no advertising identifier, no third-party SDKs.
- No tracking. All three parts of the app (the app, the keyboard, the share extension) ship an Apple privacy manifest declaring no collected data types and tracking set to false.
- No log files of our own. There is no logging call anywhere in the product's source, so there is no place for a prompt, an answer, a clipboard or a key to end up.
- No use of your prompts or your agent's answers for advertising, and no model training on your data. Not now, and not without asking you separately and explicitly.
- No profile, no account, no e-mail address collected. We do not know who you are.
Full Access
iOS asks you to grant "Full Access" before a third-party keyboard can use the network or the pasteboard. It is a blunt switch, and iOS warns you about it for good reason. SHALL asks for it for exactly two things:
- Reaching your agent from the keyboard. A keyboard extension cannot make a network request without it.
- The clipboard, and only when you tap the Clipboard action or the Copy action.
Nothing else the switch permits is used: no location, no contacts, no photos, no iCloud, no background networking, no uploads.
Typing does not need Full Access. With it off, the SHALL keyboard types, switches layers and languages, and even runs its built-in local demo exactly as before. What you lose is the clipboard action and the ability to reach your agent from the keyboard — the app itself still can. SHALL re-checks the permission each time it would matter, so turning it off in iOS Settings takes effect at once.
Notifications
SHALL can tell you when a run finishes, fails, or needs your permission. These are local notifications produced on your device; there is no push service and nothing about your runs is sent to Apple or to us in order to deliver them. A setting controls whether the notification text may include details or whether the Lock Screen sees only that your agent needs attention.
Because there is no push, SHALL has to be running to notice that something happened.
Your agent is not covered by this policy
The most important thing SHALL does is hand your request to software you run. We do not control that software. What your agent does with your request — what it stores, what it sends onward, what tools it invokes — is governed by that agent and by whatever services it is configured to use, not by this policy. The credential you give SHALL grants your agent's full capabilities on the machine it runs on, which is why SHALL stores it in the Keychain and asks you to keep that machine on a private network.
What Apple passes on
SHALL is built for distribution through the App Store. When it is available there, Apple's own channels are the only way anything about you reaches us at all, and they are worth naming, because "we collect nothing" would otherwise be a smaller truth than it sounds:
- Crash reports and usage figures, if you allowed them. iOS asks, when you set up a device, whether to share analytics with app developers; the switch is in Settings → Privacy & Security → Analytics & Improvements → Share With App Developers, and it is yours to set. With it on, Apple gives us crash reports and aggregate figures for this app, together with device and OS details. A crash report describes the app's state at the moment it stopped. It is not designed to carry your prompts, and SHALL writes no log for one to pick up.
- Ratings and reviews you write, which we read like anyone else, and the sales and download totals Apple reports to every developer. None of them names you.
That is the whole list. It is Apple's flow, described in Apple's own privacy terms, and nothing in it comes from the app talking to us — because the app never talks to us.
Deleting your data
There is no server, so there is nothing for us to delete. On your device:
- Remove agent removes the stored key and your agent's address, and the run history with them — the whole file, so runs the share sheet started go too — together with the run identifiers the keyboard had handed over. They all belong to an agent that has just been removed. It does not touch your settings — the keyboard preferences, the appearance and the notification choices are left as you set them. It is in Settings → Agent → Connection, which opens the screen for that agent; Remove agent is the last thing on it, and it asks you to confirm first.
- Deleting SHALL removes the run history, which is a file in SHALL's own storage and goes with it. Your settings and the key are kept in the device Keychain instead, and the paragraph below is about what that means.
Use Remove agent before deleting the app if you want the key gone for certain. iOS does not guarantee that a Keychain item is destroyed when an app is removed, and a reinstall can find it again. That applies to everything SHALL keeps there, so we will not tell you it is gone when the app is, because we do not control it. Deleting the key deliberately is the only way to be sure — and you should also rotate the token on the machine that issued it, which is something only you can do.
Children
SHALL is not directed at children and is not useful without a self-hosted agent. We do not knowingly collect information from anyone, of any age, because we do not collect information.
Changes
If this policy changes, the date at the top changes with it. A change that introduced any collection of data would be a change to how the software is built, and would be described here before it shipped.
Contact
Setting SHALL up, what Full Access is for, and how to revoke your agent's key: getshall.com/support.