TabForge: Code Keyboard is a keyboard extension and companion app for programming, scripting, terminals, and remote desktops on iPhone and iPad. This policy explains the information TabForge uses while you type, what it stores locally, and how its optional features work.
TabForge's app and keyboard contain no analytics, advertising, account system, TabForge-operated networking service, or automatic diagnostic uploader. The optional companion Tip Jar uses Apple's StoreKit service as described below. The keyboard does not transmit keystrokes, surrounding text, snippets, swipe gestures, or spelling requests to a TabForge server. The code is available for inspection under the repository's MIT license.
This policy covers the app and keyboard extension. It does not describe this website, the apps you type into, terminal or remote-desktop services, Apple system features, external websites, or device backup providers, which have their own data practices.
At a Glance
- Nothing is collected. TabForge has no servers, analytics, advertising, or accounts, and never sends your typing, snippets, drafts, or usage information to the developer or third parties. Text leaves only through the apps and shares you choose. Its App Store privacy label is Data Not Collected.
- What is saved stays on your device. Keyboard preferences, custom snippets, the playground draft, and, only if you turn on Learn my tap positions, average tap offsets for each letter key. Each stays on the device, in the keyboard's or app's own storage or in a container the two share there, and is never uploaded. Device backups you set up may include it.
- Language features are optional. Autocorrect, swipe typing, and Learn my tap positions are off until you turn them on in the keyboard's gear menu. Turning off Learn my tap positions erases what it learned.
- Typing context is temporary. Text around the cursor, the tap points of the word you are typing, and swipe traces are used in memory on the device and never saved.
- No network service of its own. The keyboard makes no network requests. The companion app uses Apple's StoreKit for the optional Tip Jar, and opens links or shares only when you choose.
Typing Context and Information Held in Memory
iOS and the host app may expose limited text and field information to the keyboard through Apple's UITextDocumentProxy interface. TabForge uses that context on the device for editing, indentation, completions, cursor movement, and optional spelling correction. Host apps can limit or withhold context. TabForge does not build a keystroke history or save the host document.
The optional swipe recognizer, autocorrect, and English suggestions use fixed English and programming word lists, with word frequencies, that are bundled in the app. TabForge does not download words or add your typing to these lists. To rank corrections, suggestions, and swipe matches, the keyboard also reads words from the text the host app exposes around the cursor. That list is kept only in memory and never saved. Gesture traces, tap points, and alternatives are temporary; they are not uploaded or used to train a model. Swipe recognition is experimental and off by default.
Optional English prose correction, off by default, uses Apple's UITextChecker on the device to decide which words are misspelled. Replacements are chosen on the device from the bundled word list and nearby document words, weighing where each key was tapped. Tap points for the word being typed are held in memory until you finish the word and are then discarded. When enabled, correction can request Apple's supplementary keyboard lexicon, which may include names and text shortcuts. A bounded set is held in memory to avoid correcting those words; TabForge does not save or log the lexicon.
Correction state, spelling resources, swipe traces, repeat tasks, and held-key state are released when the keyboard is dismissed or receives a memory warning. Normal operating-system memory management still applies; this is not a guarantee of secure memory erasure.
Optional Tap Learning
Learn my tap positions is a keyboard option that is off by default and available only when autocorrect is on. When you turn it on, the keyboard keeps a running average of how far your taps land from the center of each letter key, plus a capped count of taps per key, and uses it to judge future taps. It learns only from words already in its word list that you typed and kept.
It stores no letters in order, words, text, or timestamps. The averages are saved in the keyboard extension's local UserDefaults, are never uploaded or shared with the companion app, and are erased when you turn the option off or reset keyboard preferences.
Version note: tap-aware correction, word-frequency ranking, and Learn my tap positions are new in version 1.1.0. Version 1.0.1 and earlier do not use tap points for correction or save tap offsets.
Information Saved on Your Device
TabForge deliberately saves the following information in local preferences storage:
- Keyboard preferences: layout, profile, theme, and editing choices in the keyboard extension's local UserDefaults.
- Custom snippets: text you choose to save for insertion later, stored with the keyboard extension's preferences.
- Settings and snippets changed in the companion app: one file in an App Group container shared by the app and the keyboard, so the app can configure the keyboard. Only the app writes it; the keyboard reads it.
- Learned tap offsets (optional, off by default): the average tap offset and a capped tap count for each letter key, in the keyboard extension's local UserDefaults, only while Learn my tap positions is on.
- Playground draft: the companion app's editor content in the app's separate local UserDefaults, so it can be restored between launches.
The saved playground draft is separate from the keyboard's temporary typing context. Text entered or inserted into the playground is saved, including a voice transcript after you choose to insert it.
The companion app's Playground keyboard, Layouts, and Themes edit the same settings and snippets as the installed keyboard. The app saves them, with the time each setting or snippet changed, in the shared file described below. The playground draft is saved separately and is never shared with the keyboard.
Do not put secrets in drafts or snippets.
These records use the iOS application sandbox, including the App Group container, and the device's normal storage protections. TabForge does not add separate encryption or password protection to drafts, snippets, or preferences. Device backups and operating-system retention rules may apply.
Managing and Deleting Local Data
Resetting keyboard preferences in the keyboard clears its current settings and custom snippets, and turns Learn my tap positions off, which erases learned tap offsets. It does not clear the playground draft; delete or replace the playground text separately. Resetting from the companion app's Playground keyboard resets the shared copy, and the keyboard adopts that reset the next time it opens, except for changes made in the keyboard after the reset.
An update retains an existing keyboard-local settings record when one is present, and merges the app's shared file into it setting by setting, so it never replaces the keyboard's settings wholesale. It does not read, import, or erase the shared records of builds before 11, which used a different format, or the companion app's old keyboard preferences. Settings or snippets that existed only in those old locations are not automatically transferred.
Those legacy records may remain under iOS storage and backup rules. Removing the app and keyboard removes their installed containers, including the shared one, subject to iOS behavior; backups may retain earlier data.
Full Access and the Shared Container
TabForge does not request keyboard Full Access. The companion app and the keyboard share an App Group container, and only the companion app writes to it: one file holding the keyboard settings and snippets changed in the app, with the time each changed. Without Full Access, iOS lets a keyboard read its containing app's shared container but not write to it. The keyboard reads the file when it appears and adopts each setting or snippet the app changed more recently than the keyboard did, then saves the result in its own container. A missing, unreadable, or unusually large file is ignored.
Changes made with the keyboard's own gear menu stay in the keyboard's container. The keyboard cannot send them back, so the app can show a setting the keyboard has since changed. The shared file never contains host text, typing context, learned tap offsets, or which keyboard tips were shown. It is not sent anywhere.
Haptic feedback is the only TabForge feature that needs Full Access, because iOS lets a keyboard vibrate only with it. Key click sounds work without it. The companion app lists such features under Settings, Full Access. Each stays off until you turn it on in the keyboard, even when Full Access is granted, and that choice is never taken from the shared file. Because TabForge does not request Full Access, none of them can turn on in this version. A version that requests Full Access will update this policy first.
Version note: sharing settings from the companion app is new in version 1.2.0. In version 1.1.1 and earlier, the companion's keyboard and layout previews keep their settings in memory, the app does not configure the installed keyboard, and no App Group is used.
Snippet names and text are edited in the keyboard's own settings interface. An unfinished snippet edit stays in memory until saved or cancelled; editing a snippet does not type its draft into the host app. The keyboard inserts a saved snippet into the host only when the user selects it for insertion.
Voice Input, Dictation, and Writing Tools
The keyboard extension does not record microphone audio. System dictation remains available where iOS provides it, and you can switch to the Apple keyboard.
The companion app's Voice to code feature starts only after a user action and requests microphone and Speech Recognition permissions. It requires on-device English recognition. If that capability or language support is unavailable, TabForge does not fall back to cloud recognition.
Audio buffers are passed to Apple's on-device Speech service; TabForge does not write recordings to a file. The transcript remains in the voice view until you dismiss it or insert it into the saved playground draft. Recording is cancelled when the view is dismissed, the app enters the background, or a relevant audio interruption occurs.
Apple controls system Dictation and Writing Tools. Their availability and data handling depend on Apple's services and your system settings, rather than TabForge's on-device voice implementation. Review Apple's disclosures before invoking those features with sensitive material.
Optional Tips through Apple
The companion app's Tip Jar uses Apple's StoreKit service to load products and process optional, one-time tips. Tips do not unlock features or start a subscription. All app and keyboard features remain free to use. The keyboard extension has no purchase flow, shares no typing context with the companion app, and never writes to the container it shares with the app.
Apple presents the purchase confirmation and handles payment information through its own network, account, and payment infrastructure. TabForge receives product and transaction results locally to display prices, handle cancellation or pending approval, verify completed tips, and finish transactions. It holds a bounded set of recent transaction identifiers in memory to avoid duplicate acknowledgements. It does not keep receipts, a tip total, or a purchase history in app preferences or files.
TabForge does not send typing, snippets, playground text, or speech to StoreKit. It has no purchase backend, transaction upload, analytics service, or TabForge account. Apple maintains its own transaction records; not keeping app records does not remove Apple's records. Apple's handling of account, payment, and purchase information is described in App Store & Privacy.
Other Apps, Sharing, and External Links
When you use the keyboard extension, TabForge inserts text into the selected host app. That app may store or transmit it, including to a remote terminal or desktop. TabForge cannot control the recipient's processing. iOS uses the system keyboard in secure/password and phone fields, and apps may decline third-party keyboards.
The playground's Share code action sends the current draft to the system share sheet only when you choose it. The destination you select receives the text and handles it under its own policies. Review the draft and recipient before sharing.
Opening a repository or other external link is a user-initiated action handled by the system or browser. The destination receives an ordinary web request under its own privacy policy. TabForge does not attach typing context to these links. Licenses and notices are bundled and read locally.
The keyboard extension does not launch the companion app. Configure the keyboard from its gear menu in another app, or in the companion app's Playground, Layouts, and Themes; changes made in the companion app reach the keyboard the next time it opens. The companion app also contains setup and compatibility information, source/privacy links, credits, and licenses.
Third-Party Resources
TabForge includes no third-party code packages, SDKs, or network services. The word lists and theme colors below are bundled as static data and used offline on the device; Apple's frameworks come with iOS. Nothing you type is shared with any of these projects.
- English Speller Database (ESDB permission notice): Kevin Atkinson’s English word list (formerly SCOWL), used for swipe, autocorrect, and suggestions.
- SymSpell (MIT): Wolf Garbe’s English word frequencies, via symspellpy, used to rank corrections and swipe matches.
- Google Books Ngram (CC BY 3.0): The word counts behind those frequencies. Google does not sponsor or endorse TabForge.
- Nord (MIT): Colors adapted for the Nord keyboard theme.
- Dracula (MIT): Colors adapted for the Dracula keyboard theme.
- Apple frameworks (Apple platform terms): SwiftUI, UIKit, and Speech, provided by iOS rather than bundled.
The full license texts and data provenance are in TabForge's third-party notices and in the companion app under Licenses & notices.
Diagnostics and Reports
TabForge contains no typed-text logging or automatic diagnostic uploader. Apple may provide crash reports, TestFlight feedback, and device diagnostics according to your system and testing choices. The project does not intentionally add document text to those reports.
If you choose to submit a bug report, any screenshots, logs, or other information you include are shared by your action. Use synthetic examples and check screenshots and logs before sharing. For a suspected vulnerability, follow the TabForge security policy and avoid including private typing in a public issue.
Availability and Policy Updates
TabForge is provided as-is, without a guarantee of availability, compatibility, data recovery, or continued support.
This policy must be updated when the app changes its permissions, storage, dependencies, or data flow. Updates will appear on this page with a revised effective date. The app's privacy and data-handling documentation and public source code provide implementation details and license notices.
Contact
For questions about this policy, contact jeremy@jeremycollins.net.