← bassed

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:

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:

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:

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

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.