Vibe — NextGen Music Player
Vibe is built on an offline-first, privacy-respecting philosophy. Your music library, listening history, and personal reflections stay on your device. This policy is a complete and accurate account of what data is collected, where it goes, and what you can do about it.
Vibe is an Android music player that reads and plays audio files stored locally on your device. The core experience — playback, playlists, equalizer, and audio tools — is entirely offline. No account, no sign-up, no cloud sync.
Several optional features use the internet: fetching song lyrics, streaming music, playing internet radio, and displaying advertisements. Each is described in full in Section 4. No analytics SDK, crash reporter, or user-tracking library is embedded in the app.
Vibe has no way to identify you personally. There is no account, email address, or username, and nothing in Vibe's local database is linked to your identity. Your listening history exists only on your own device. (Advertising uses a separate device-level identifier managed by Google — see Section 4.)
All data below is stored locally in Vibe's private SQLite database on your device, accessible only to Vibe. None of it is transmitted to our servers (because we don't have any).
When you open Vibe, it scans Android's MediaStore to build your music library. The following
song attributes are indexed and stored in a local database table (songs):
| Field | Source | Why it's stored |
|---|---|---|
| title | ID3 tag / MediaStore | Display name and lyrics API lookup |
| artist | ID3 tag / MediaStore | Display and lyrics API lookup |
| album | ID3 tag / MediaStore | Album grouping and display |
| albumArtUri | MediaStore (embedded art) | Cover art display in UI |
| durationMs | MediaStore | Progress bar and skip thresholds |
| contentUri | MediaStore | Stable reference for playback |
| year, trackNumber, genre | ID3 tag | Sorting and metadata display |
| isFavorite | App-created | Favorites playlist membership |
| playCount, lastPlayedTimestamp | App-created | Top Songs and Recent lists |
| lyrics | Embedded ID3 or fetched on-demand | In-app lyrics display (see §4.1) |
Vibe only reads audio files. It does not access documents, photos, videos, contacts, or any other files on your device.
Every time you play a song — from your local library, an in-app stream, internet radio, or a track detected playing in Spotify (see §2.7) — Vibe creates a listening session record in its local database. These sessions power the Journey screen — your personal timeline, analytics (total listening time, mood breakdowns, peak hours, top songs), and mood-based discovery. Sessions shorter than 15 seconds are automatically discarded to filter out accidental taps and skips.
| Field | Type | Purpose |
|---|---|---|
| songId | Foreign key | Links to the song being played |
| startTimestampMs | Unix timestamp (ms) | When you started listening |
| endTimestampMs | Unix timestamp (ms) | When playback stopped |
| durationListenedMs | Milliseconds | Actual time spent listening |
| latitude, longitude | GPS decimal degrees | Location tag — only if permission granted (see §2.3) |
| locationAccuracy | Float (metres) | GPS accuracy indicator |
| locationName | Text string | Human-readable place name from on-device geocoding |
| mood | User-selected string | Optional mood you tag (Happy, Calm, Sad, etc.) |
| note | Free text | Optional personal note you add |
Your listening history never leaves your device. All analytics are computed locally. You can edit or delete any individual session from the Journey Timeline tab.
Location is entirely optional. If you deny the location permission, all Vibe features work normally — listening sessions are just recorded without coordinates.
When location permission is granted, each time you start a song Vibe:
Geocoder for a human-readable place name — this runs entirely on-device with no external network callLocation data is never transmitted to any server. It is used solely to display your listening map and location statistics in the Journey screen. You can revoke location permission at any time in Android Settings. Previously stored coordinates remain in the local database until you clear app data or uninstall.
From the Journey Timeline, you can optionally tag any listening session with a mood (Happy, Energetic, Calm, Sad, Focused, Nostalgic, Romantic, Angry) and add a free-text note. Vibe never infers, auto-assigns, or AI-generates moods — you always choose them explicitly.
Mood and note data is stored locally and used to power Timeline filtering and the Discover tab ("surface songs you've loved when feeling Calm"). It is never transmitted anywhere.
Custom tags you create (e.g., "Workout", "Late Night"), playlists you build, your Favorites list, and recently played / top songs lists are all stored locally. Your current playback queue, position in the song, shuffle mode, and repeat setting are persisted in device SharedPreferences so the app restores your exact state after being closed.
Vibe includes an optional audio recording tool accessible from the Explore screen. When you use it:
The RECORD_AUDIO permission is requested only when you open the Recording Tool
for the first time. It does not allow Vibe to record audio in the background or without your
explicit initiation.
Vibe can optionally log songs you play in the Spotify app into your local Journey, so your diary reflects listening that happens outside Vibe. This relies on Android's notification access, which you must enable manually in system settings — it is never granted automatically.
You can turn this off at any time by revoking notification access in Settings → Apps → Special app access → Notification access.
Below is every permission declared in Vibe's manifest, with the exact reason it is needed. Runtime permissions (those that show a system dialog) are only requested when you first access the feature that needs them — not on app launch.
Scans your device storage for audio files to build your music library. Without this, the app cannot function.
Legacy equivalent of READ_MEDIA_AUDIO for older Android versions. Same purpose.
Legacy permission used only on older Android versions to save files you create with the audio tools (recordings, trimmed ringtones, format-converted tracks) to shared storage. Not requested on Android 11+.
Allows reading GPS coordinates embedded in audio file metadata (EXIF data). Distinct from live location collection.
Used only to tag listening sessions with your current location in the Journey feature. Requested at runtime only when you first enable this feature. Denying it has no effect on music playback.
Fallback when GPS is unavailable. Used for the same listening session location feature.
Used exclusively by the Audio Recording Tool. Requested only the first time you open that screen. Does not enable background recording.
Required for the app's optional online features: fetching song lyrics (LRCLIB, with Lyrics.ovh as fallback), streaming music (Audius and Jamendo), browsing and playing internet radio (Radio-Browser and the stations' own stream servers), and loading Google AdMob advertisements (native cards, banners, and full-screen interstitials). See Section 4 for details on each.
Keeps the music player service running when you switch to another app or lock your screen. Required for the persistent media notification with playback controls.
Declares the playback foreground service specifically as a media-playback service, as required on Android 14 and above. Same purpose as FOREGROUND_SERVICE.
Prevents the device's CPU from sleeping mid-track, which would cause audio to cut out. Released automatically when playback stops.
Displays the playback notification with track info and controls in the notification shade and lock screen.
Allows Vibe to request audio focus so it pauses automatically when a phone call, navigation prompt, or another app needs audio. Releases focus when you pause.
Requested only when you use the Ringtone Maker tool to set a trimmed clip as your ringtone, notification, or alarm sound. You grant it manually in system settings; it is used for nothing else.
Only if you enable it, this lets Vibe read Spotify's media notification to log what you're playing into your local Journey (see §2.7). It reads only Spotify's notifications, works entirely on-device, and is granted manually in system settings.
Vibe uses the external services listed below. No analytics SDK, crash reporter, A/B testing library, or user-tracking framework is embedded beyond what is listed here. None of these services receive your listening history, location, mood entries, or notes — only the minimum each feature needs, described per service.
When you tap to view lyrics for a song and they are not embedded in the audio file itself, Vibe queries LRCLIB first (it returns synced and plain lyrics); if no match is found, it falls back to the Lyrics.ovh public API.
| What is sent | What is received | When it happens |
|---|---|---|
| Song title and artist (both providers); album name and track duration (LRCLIB only, to improve match accuracy); your IP address (inherent to any web request) | Lyrics text (synced or plain) | Only when you tap to view lyrics and no embedded lyrics exist in the file |
No personal data, location, mood data, device identifiers, or listening history is transmitted.
Fetched lyrics are cached locally in the songs database table to avoid repeat network
requests for the same song.
Both are free public APIs and Vibe is not affiliated with either — LRCLIB and Lyrics.ovh.
Vibe can search and stream independent / royalty-free music from Audius (no account or key required) and, when a free developer key is configured, Jamendo. This only happens when you open the streaming library and search for or play a track.
| What is sent | What is received | When it happens |
|---|---|---|
| Your search text and the selected track ID; your IP address (inherent to any web request) | Track metadata and the audio stream | Only when you search or play a track in the streaming library |
No personal data, location, mood data, or listening history is sent. Audio streams directly from each provider's servers. Vibe is not affiliated with Audius or Jamendo; their use is governed by their own privacy policies (Audius, Jamendo).
The radio feature uses the community-run Radio-Browser directory to search and list stations. When you play a station, audio streams directly from that station's own broadcast server (a third party operated by the broadcaster, not by Vibe).
| What is sent | What is received | When it happens |
|---|---|---|
| Your station search/filter terms; your IP address (to Radio-Browser and to the station's stream server) | Station listings and the live audio stream | Only when you browse or play internet radio |
No personal data, location, mood data, or listening history is sent. Station stream servers are operated by third-party broadcasters under their own policies, and Vibe does not control their content. Radio-Browser is a free community service (radio-browser.info).
Vibe displays advertisements served by Google AdMob in three formats: native ads embedded as cards within song, artist, and library lists; banner ads within grid-based browse screens (albums, genres); and a full-screen interstitial ad when you open the Tools screen (rate-limited so it appears at most once every 90 seconds). Native ads are styled to match the app's design but are always labelled with an "Ad" badge and Google's AdChoices icon. Advertising revenue helps support continued development of the app. When AdMob is active, Google may collect the following device-level information to serve ads:
Google AdMob is governed by Google's Privacy Policy, available at policies.google.com/privacy. You can opt out of personalised ads on Android by navigating to Settings → Google → Ads → Delete advertising ID.
We do not share your listening history, location data, mood entries, notes, or any content from Vibe's local database with Google AdMob. Ad targeting is based solely on device-level information that Google collects independently through its SDK.
All Vibe data — listening sessions, playlists, tags, mood entries, personal notes, and song
index — is stored in a private SQLite database on your device
(vibe_database) in Vibe's protected internal storage directory. This directory is
not accessible to other apps and is not included in Android's shared storage.
Vibe explicitly opts out of Android's Auto Backup feature. Your Vibe data is not synced to your Google Account, not included in device-to-device transfers, and not backed up to any cloud service. This is an intentional privacy decision. It also means that if you switch devices or reinstall the app, your listening history will not be restored.
Vibe's database uses standard SQLite storage without an additional application-layer encryption wrapper. Your device's own full-disk or file-based encryption (enabled automatically when you set a screen lock on Android 10+) protects all app data from physical access. We recommend keeping a screen lock enabled on your device.
Your data persists in the Vibe database for as long as the app is installed. There is no automatic expiration. You have full control: individual listening sessions can be deleted from the Journey Timeline. All data is permanently and completely deleted when you uninstall the app or use Settings → Apps → Vibe → Storage → Clear Data.
Because all Vibe data is stored locally on your device, you have complete and immediate control over it without needing to contact us.
Vibe is intended for users aged 18 and over and is not directed at children. It provides access to streaming music, internet radio, and lyrics from third-party sources whose content is not curated or age-rated by Vibe. We do not knowingly collect personally identifiable information from anyone, and have no mechanism to verify a user's age (since the app requires no account).
If you are a parent or guardian and have concerns about data stored by Vibe on your child's device, you can clear it by going to Settings → Apps → Vibe → Storage → Clear Data on their Android device.
If you believe your child has been subject to any privacy concern through use of this app, please contact us at the address in Section 9.
We may update this Privacy Policy when Vibe adds new features, integrates new services, or when legal requirements change. When we do, we will update the Effective Date at the top of this document and post the updated version at this same URL.
For material changes — such as adding a new third-party service, changing how location data is used, or altering data retention practices — we will additionally notify you via an in-app banner on the next app launch after the change takes effect.
Continued use of the app after an updated policy is posted constitutes acceptance of the changes. If you disagree with any change, you can stop using the app and delete all local data by uninstalling it.
If you have questions about this Privacy Policy, how Vibe handles your data, or want to report a privacy concern, we'd like to hear from you.
✉️ scatterbraindev@gmail.com