At a glance
The Radio tab needs no sign-in and has no native analytics SDK, advertising, IDFA access, or in-app purchases. It plays a public catalog and remote audio, and keeps a local copy of the last successfully downloaded catalog to support an offline fallback.
What the app sends
When the app refreshes stations, it makes a public GET request to
https://lofi.ai/api/feed. When it loads artwork or audio, it requests
the remote media URL supplied by that catalog. These requests necessarily include
ordinary network metadata, such as an IP address and user-agent, as they pass
through Cloudflare-hosted services. Cloudflare hosts the public feed service and
serves the audio and artwork through its media/CDN path. The app does not add a name, email address,
account ID, advertising ID, or device identifier to those requests.
When you choose a station, the app makes a bodyless POST to that
station’s /play endpoint. This increments an aggregate play counter
for the station. The request is not a login or a user profile, and the iOS app
does not submit an identity with it.
How the public service protects the counter
The station-play endpoint uses a fixed one-hour rate-limit window for each IP and station combination. To avoid placing a raw IP address in the rate-limit table, the service stores a deterministic SHA-256-derived hash of the IP and station key in Cloudflare D1. The counter resets when its window rolls. The stored rate-limit rows are not immediately purged when a window rolls, so this page does not promise immediate deletion of those rows.
Optional server-side diagnostics
If the service’s optional PostHog configuration is enabled, the backend may send server-side error reports and station-level events to PostHog. Station events use the station ID as their event identity and include the station ID as an event property; they do not use a user ID. The native iOS binary does not load the PostHog SDK. The optional Islands & Create tab loads the same website and analytics behavior as lofi.ai.
What stays on your device
After a successful catalog request, the app stores the catalog in its iOS caches
directory as lofi-stations.json. This lets the player show the last
downloaded stations when a later refresh is unavailable. It is local app cache
data, not an account, and iOS may clear it when it needs space. Artwork and audio
are fetched from their remote URLs for playback; the app does not upload your
personal files.
Optional Islands & Create experience
- This tab loads lofi.ai in an in-app browser. Signing in opens your system browser and securely returns the session to the app; the session is kept in the iOS website cookie store.
- Account information, profile/island content, chat and generation prompts you submit use the same Lofi services as the website. Generation may send your prompt to the configured AI providers. See the Lofi privacy policy for the website experience.
- Files you choose to download are kept temporarily on the device and can be saved or shared using the system share sheet.
- No native advertising or cross-app tracking.
- No IDFA access, native analytics SDK, or in-app purchase flow.
- The Radio tab does not request your contacts, location, photos or microphone. Using an optional website feature may ask you to choose a file or enter account/profile information.
Questions and support
For privacy questions or playback support, contact jeremy@coralsourcing.com. Please include only the app version, device, iOS version, station, and relevant error text; do not send passwords or financial information.