Privacy Policy — bassed
Last updated: 3 August 2026
bassed has no accounts, no analytics, no advertising, and no tracking. It does not set cookies. Nobody here has a way to see your library.
This document is written from the code, not from intentions. Where the app hands data to somebody else, it says so and names them.
1. What is stored, and where
On your device, and nowhere else by default. Your subscriptions, playlists,
queue, playback positions, notes, journal entries, highlights, imported book text, settings,
and any API key you enter all live in your browser's or the app's local storage (localStorage
and IndexedDB). There is no server-side copy and no account to attach one to.
Two consequences worth understanding:
- Clearing site data, or uninstalling the app, deletes it. On iOS and Android the system can also evict this storage when the device is short on space.
- The export button is your backup. "Export everything" writes a single file you keep. It contains your data — including any API key you have entered — so treat it like a password.
2. What the server sees
Some features cannot work without a server, because the sites involved refuse requests made directly from a browser. When you use one, the server sees the request and nothing more:
| When you… | The server receives | Retention |
|---|---|---|
| Add or refresh a feed | The feed URL | Not stored |
| Search for a podcast, book, or video | Your search terms | Not stored |
| Import a book | The source URL | Not stored |
| Load chapters or a transcript | The episode or video URL | Not stored |
| Use the high-quality narration voice | The text being narrated (see §3) | Cached audio, see §3 |
| Any request at all | A truncated, one-way hash of your IP address | Rate-limit counters, expire within minutes |
The IP hash exists only to stop one person exhausting a shared, free service. It is a shortened SHA-256 digest, kept as a counter, and it is never used to build a profile or joined to anything else.
Server request logs are retained by our hosting provider for a short, provider- defined window and are used only to diagnose faults.
3. High-quality narration, and the one real disclosure
The optional high-quality ("neural") narration voice is synthesized by Microsoft's public Read Aloud speech service. The text you ask it to read is sent to Microsoft to be turned into audio. If you would rather that not happen, either of these avoids it entirely:
- use your device's built-in voice, which never leaves the device; or
- use the on-device Kokoro voice, which downloads a model from the jsDelivr CDN once and then synthesizes locally.
Synthesized audio is cached on our server, keyed by a hash of the voice and the text, so a repeated passage does not have to be generated again. The cache holds audio, not identity: it is not linked to you, your device, or your IP.
4. Others your app talks to
Some requests go straight from your device, because that is how the web works — audio has to come from wherever the podcast is hosted.
Directly from your device:
- Podcast and audio hosts — to stream or download an episode. They see your IP address and can keep their own logs, exactly as they would in any podcast app.
- Image hosts — for cover art.
-
YouTube — only if you play a YouTube item. It is embedded through
youtube-nocookie.comwhere possible, but once playback starts YouTube may set cookies and applies its own privacy policy. - jsDelivr — only if you use the on-device Kokoro voice, to fetch the model.
- An AI provider you choose — only if you enable AI features. Your key and your prompt go from your device straight to the provider you configured. We never receive either.
Via our server, on your behalf: Apple's podcast directory, the Podcast Index, Project Gutenberg, Standard Ebooks, the Internet Archive, YouTube, Rumble, and the feeds you subscribe to.
Infrastructure: the app and its API are hosted on Vercel. Rate-limit counters and, if you turn it on, the encrypted sync document are stored with Upstash/Vercel KV. Cached narration audio is stored in Vercel Blob.
5. Optional sync — end-to-end encrypted
Sync is off unless you turn it on. When you do, your library is encrypted on your device with AES-GCM using a key derived from a code that is never sent to the server. The sync identifier is derived from that same code through a one-way function.
What the server stores is a hex string and a base64 string. It cannot read your data — not as a policy, but as a property of what is stored. Lose the code and nobody, including us, can recover the contents. You can delete a sync document at any time.
6. Children
The app is not directed at children and collects no personal information from anyone, so there is nothing to collect from a child either.
7. Your choices
- See everything: the export file contains your entire dataset.
- Delete everything: clear the app's data, or uninstall it. Delete a sync document from the sync screen. Nothing survives on our side except short-lived rate-limit counters and cached audio that is not linked to you.
- Avoid the server entirely: skip feed import, search, transcripts and neural narration, and use a device or on-device voice. Local playback and reading need no network at all.
8. Changes
Material changes will be reflected here with a new date, and in the release notes for the version that introduces them.
9. Contact
Questions or requests: open an issue at https://github.com/bitskc/bassed-player/issues. For anything you would rather not post publicly, contact the maintainer through the GitHub profile linked there.