Privacy
How Text-o-Matic handles your data
Text-o-Matic does not upload your contact lists or message text. Uploaded file contents, phone numbers, names, merge fields, contact-card fields, and prepared messages are processed locally in your browser. Before you start a texting queue, the imported list and prepared messages are normally kept only in the app's working memory rather than saved to persistent browser storage. Text-o-Matic does not intentionally include that information in network requests made by the app.
No application can guarantee privacy or security with 100% certainty.
I have designed Text-o-Matic to keep your data as private and secure as reasonably possible while it is inside the app, and I have chosen to be as transparent as possible about how it works and where the limits are. If you are working with especially sensitive information, Text-o-Matic is designed so you can reduce your exposure further.
You can verify the local-first design yourself. Once Text-o-Matic reports Offline ready, it can keep preparing lists and messages with your internet connection turned off. You can also inspect its network traffic while you work or read the source code on GitHub.
Site loading and infrastructure. Squarespace Domains provides DNS and GitHub Pages hosts Text-o-Matic, so those providers process the ordinary technical requests involved in locating and loading the site. While online, the app also loads two pinned libraries from their CDNs. On the production site, Text-o-Matic sends one empty request at page load to a small Cloudflare-hosted counter. The counter's Worker source, D1 schema, and deployment configuration are published alongside Text-o-Matic's source, and production deployments are built from the public production repository. The live Worker also exposes its deployed Git commit and Cloudflare Worker version through a read-only version endpoint and response headers. The application-managed database stores only one aggregate total per day; Text-o-Matic does not store an individual visit record, analytics identifier, IP address, browser information, or referrer. Cloudflare still processes the ordinary network information needed to receive the request. None of these requests intentionally includes your contact list, phone numbers, merge-field values, or message text. Once Text-o-Matic reports Offline ready, you can disconnect before importing sensitive data.
Device Transfer does not upload your list. Text-o-Matic places the transfer payload directly in one or more QR codes rather than storing a server-side copy. Transfer links use the URL fragment — the part after # — to carry transfer data. Browsers do not send that fragment to the web server when requesting the page, so the transfer contents are not sent to GitHub Pages as part of loading Text-o-Matic. See exactly how this works.
Device Transfers are encrypted by default. In encrypted mode, Text-o-Matic encrypts the prepared transfer locally using AES-GCM before creating the QR codes. The QR codes contain encrypted data. The separate six-word code needed to decrypt the transfer is shown only on the first device and is not included in the QR codes. It stays hidden on the QR screen until you choose to reveal it after scanning. Encryption can be turned off for an easier transfer; when it is off, the QR codes contain readable contact and message data.
Temporary Device Transfer data is cleaned up. During a multi-code transfer, received parts are stored temporarily in IndexedDB so additional QR codes can be added. Encrypted transfers remain encrypted in that temporary storage until the separate transfer code is entered. The temporary transfer record is removed when the transferred list becomes the active texting queue. Abandoned or incomplete transfers expire after 24 hours of inactivity and are removed the next time Text-o-Matic runs.
Contact cards are created locally too. When you choose to save a contact, Text-o-Matic builds a standard .vcf contact-card file from the mapped name, phone number, and other contact fields in your browser. Your browser or device may describe this as a “download,” but Text-o-Matic is creating the file from data already on your device — it is not downloading the contact from a server or uploading the contact information somewhere to create it. Once you open or save the card in your contacts app, that app's own privacy, storage, sync, and backup behavior applies.
An unfinished texting queue is stored temporarily so it can be resumed. When you start texting, Text-o-Matic saves the prepared recipients, messages, queue position, statuses, and any mapped contact-card fields to IndexedDB in this browser. When every recipient has been messaged or skipped, that resume copy is removed immediately. Choosing Discard & erase also removes it immediately. An unfinished queue expires after 7 days of inactivity and is removed the next time Text-o-Matic runs. If Text-o-Matic is never opened again, the app cannot wake itself up later just to delete browser storage.
Closing an unfinished queue does not erase it. When possible, Text-o-Matic uses a browser-provided leave-page warning to remind you that unfinished work will remain available for resume. Browsers, especially on mobile devices, do not reliably allow a web app to run cleanup code as it closes. Closing the tab therefore does not erase the queue. Use Discard & erase in the active queue when you want the local resume copy removed immediately.
Other local browser data may remain. Text-o-Matic does not use cookies and does not use cookie-based analytics, advertising, or tracking. It stores some non-list information locally in this browser, such as preferences, usage counters, and recent column-mapping choices. These records do not contain recipient rows or prepared message text and may remain until the browser's site data is cleared.
Your browser and device have their own privacy and storage behavior. Private/incognito modes, storage-management policies, or clearing site data may delete Text-o-Matic's local storage earlier than described above, which can make an unfinished queue impossible to resume. Depending on your browser, operating system, backup settings, sync features, cloud backup, session or crash recovery, or device-management configuration, locally stored browser data or a briefly opened transfer address may also be handled by features outside Text-o-Matic's control. On a shared device or browser profile, another person with access to that profile may be able to reopen an unfinished queue.
Data outside Text-o-Matic is outside its control. A camera or QR-scanning app may keep its own scan history depending on its settings. With the default encrypted transfer, that history should contain encrypted transfer data rather than readable contacts or messages; with encryption turned off, it may contain the readable QR payload. Once a message is opened in your SMS app or WhatsApp, it is subject to that app's, service's, and where applicable your carrier's privacy, security, and retention practices. Text-o-Matic cannot view or delete information stored by those other apps or services.
Questions about privacy can be sent to nick@nickspeelman.com.
Version …