Privacy & security
What tinyclient stores, which connections it makes, what it never does, and where it falls short today.
There is no tinyclient server. The project runs no service, collects no accounts and receives no data. Everything below happens on your computer, between it and the networks you sign in to.
What is stored
| What | Where | Protection |
|---|---|---|
| Sessions | System credential store: macOS login keychain, Windows Credential Manager, or the Secret Service on Linux. Service tinyclient, one item per network. | The system’s. chatd refuses to sign in on a build whose credential store would not persist. |
| Message cache | chat.sqlite in the data directory | Not encrypted by tinyclient |
| Media you looked at | media/ beside it, at most 500 MB | Not encrypted by tinyclient |
| Signal keys and sessions | signal/ beside it | Each value sealed (AES-GCM-SIV) with a key held only in the credential store |
| Sign-in window’s browser data | A browser profile of its own, so an interrupted sign-in can resume | The system web view’s |
| Logs | crash.log and chatd.log in the data directory | Credentials redacted before writing |
Use your system’s disk encryption (FileVault, BitLocker, LUKS): the cache relies on it.
Signing out of an account deletes its credential item, its rows in the database and its media.
Connections it makes
- To the networks you sign in to, and nothing else. No update check, no analytics, no crash upload, no font or asset download.
- Media is fetched only from an allow-list of each network’s own hosts, and a session’s credentials are only sent to the hosts that need them. Discord’s GIF stills come from
media.tenor.com, because Discord’s own GIF search returns them there. The list is inblobs/fetch.rs. - Links in messages are never fetched. Link previews are the ones the network itself sends.
- Sign-in shows the network’s own page in a separate window. That page loads what the network’s page loads.
- Calls connect
mediaddirectly to Discord’s voice servers.
What it never does
- Send anything to the people who make tinyclient.
- Embed a network’s web app. The one web page it shows is the sign-in page.
- Act for you. No reaction, edit, delete, friend request, read receipt, typing notice or presence change goes out unless you made it. A conversation is marked read only when the window is active, the conversation is open and the message is on screen.
- Enumerate. No whole-server member lists, no history crawl. History is fetched for what you open or have on screen.
- Write a credential to a log. Slack, Discord and Teams tokens, JWTs, authorization headers, signed URL parameters and Signal’s keys are redacted (
protocol/src/crash.rs).
Crash reports
chatd, mediad and the window each install one panic hook. A panic writes one entry, redacted, to standard error and to crash.log, naming the program and thread, with a backtrace. If the window crashed on its main thread it reopens once and says so, with a Copy report button that copies the last entry to your clipboard. Nothing is sent. If you want to share a report, read it first and attach it to an issue yourself.
How it presents itself
To Discord and Slack, tinyclient presents itself as the web client in a browser, the same identity the sign-in window used: on macOS the version of Safari you have installed, elsewhere a fixed Chrome identity. To Teams it signs in as Microsoft’s own Teams client. How each network treats this: Networks & terms.
Known limits
- The message cache and media are not encrypted by tinyclient.
- The local socket is not authenticated. Any program running as your user can connect to it, as such a program can already read your files.
- Signal safety numbers are not shown yet, and a contact’s new identity key is trusted automatically, as presage’s own stores do.
- The release builds are not notarized on macOS and not code-signed on Windows.
Reporting a vulnerability
Please report security problems privately through GitHub Security Advisories, not in a public issue. What is in scope and what to expect: SECURITY.md.
This website
Static HTML and one stylesheet. No cookies, no analytics, no fonts or scripts from other sites; a Content-Security-Policy allows only this site’s own files. The one small script names your system on the download button and adds Copy buttons, and every page reads the same without it. Cloudflare Pages serves the site and, like any web host, can see your request.