Data safety
How the Nexora app handles data. This page is generated from the answers Nexora gives on the Google Play Data safety form and says the same as the privacy policy.
Effective 10 October 2026. It matches the answers Nexora gives on the Google Play form.
What leaves the device
Your sources, channels, favourites, watch history and settings are stored on your device and are removed with the app. Nexora has no accounts and no server that receives your data.
| Flow | Goes to | Declared? | Why |
|---|---|---|---|
| Playlists, guides, streams, add-on and Jellyfin/Emby requests | The servers the user added | No | Requests to services the user chose, under their own policies; Nexora (the developer) never receives them. |
| Title look-ups and subtitle requests (NX-DEC-424, NX-DEC-910/911) | The catalog and subtitle add-ons the user turned on | No | A title's name (and year) to match it across sources; for subtitles, the playing file's name, size and hash; genres and people's names for suggestions and cast pages (a person page may search those add-ons for the person's name, NX-DEC-1112). Once a day on an unmetered network, up to 12 catalog page requests to the user's own installed catalogs so cast pages work (NX-DEC-1115); what they return is kept on the device only (credits index, no-backup storage, NX-DEC-1111). Requests to services the user chose; nothing reaches the developer. |
| Jellyfin/Emby session reports | The user's own home media server | No | The device name, a random per-installation device ID and playback start/stop, as those servers expect. |
| Add-ons store lists (Official catalog, Community list, blocklist) | Nexora's hosting (GitHub Pages) | No | Plain downloads of public files; nothing about the user is sent (the host sees the network address, as any web request). |
In-app update policy (app-update.json, NX-DEC-1190) and Google Play's in-app update check | Nexora's hosting (GitHub Pages); Google Play | No | When the app's main screen opens (release builds), a plain download of a public file with the newest and minimum version (nothing about the user is sent; the host sees the network address), and Play's own check whether a newer Nexora build exists for this device, which Google Play runs under its terms. |
| Peer-to-peer playback and downloads (when the user turns it on) | Other peers in the swarm, the DHT, the torrent's trackers and, when it names fewer than five, six public trackers | No (disclosed in the app and policy) | Direct user-initiated peer traffic with a notification; not collected by the developer (NX-DEC-951/954/955). |
| Phone ↔ TV pairing and sync (including automatic sync, typed text and backups) | The user's other device on the same network | No | Local and end-to-end encrypted, except the TV's optional "Back up or restore in a browser" page, which is plain HTTP on the local network behind a one-time code (NX-DEC-1013). |
| Pairing QR opened by a phone's own camera | Nexora's website (GitHub Pages) | No | The page loads like any web page (the host sees the network address); the pairing code stays in the address fragment and is never sent (NX-DEC-946). |
| Casting, "Open in another app" and "Play with" (NX-DEC-1130–1138, Pro: NX-DEC-1170–1174) | The renderer or app the user picks, on the same device | No | The stream's address (which can contain the provider sign-in), its title, start position, an add-on's subtitle links and, for MX Player, the stream's request headers — handed over at the user's request (explicit intent, no chooser); the app returns only where it stopped. Nexora Pro (round 15): a Jellyfin/Emby link carries the user's own server access key as api_key (moved from the request header so the app can open it); a torrent goes as a link to Nexora's own on-device stream (127.0.0.1, per-session token) while Nexora keeps the torrent connected with a visible notification. |
| Crash records | Stay on the device | No | The app's own short crash record; shared as editable text when the user sends "Report a problem" through a support-email draft or fallback share sheet; its count range and latest exit kind also accompany an explicit diagnostic report when crash sharing is on. (Firebase Crashlytics, below, sends crash reports only when the user turned sharing on.) |
| Google Play Billing (Nexora Pro) | Google Play | No | Play collects payment data directly; the app learns the plan, whether it is active and whether a trial is offered, and keeps only the time Play last confirmed Pro. |
| Google code scanner (phone: scan the TV's pairing QR code) | Google (ML Kit) | Yes — see below | ML Kit "encrypts the data in transit using HTTPS" and sends device information, app information, per-installation identifiers, performance metrics, API configuration, event types and error codes, mapped by Google to App info and performance and Device or other IDs (https://developers.google.com/ml-kit/android-data-disclosure). |
| Usage statistics (only when the user allows "Share usage statistics"; off until then) | Google Analytics for Firebase (Google, as Nexora's service provider / processor) | Yes — see below | Feature-usage and playback-quality events from the fixed allowlist below, with fixed values only; Firebase adds its app-instance ID, device and app information, its automatic events (including Google Play in-app purchase events for Nexora Pro) and an approximate location Google derives from the IP address. Over HTTPS. |
| Crash reports (only when the user allows "Send crash reports"; off until then) | Firebase Crashlytics (Google, as Nexora's service provider / processor) | Yes — see below | Java/Kotlin crash and ANR reports (stack trace, exception details, device state, a Crashlytics installation ID); since NX-DEC-1152 also the fixed crash keys below, reports of handled errors with their message removed (at most 10 per session), and explicit Settings problem reports (at most three per session) and — only when usage statistics are on too — the recent allowlisted events as breadcrumbs. Over HTTPS. Debug builds (unless a developer turns on the debug-only Firebase test mode), Firebase Test Lab / Google Play pre-launch devices (NX-DEC-1345) and builds made without Firebase send nothing. |
Answers on the Play Data safety form
| Question | Answer |
|---|---|
| Does your app collect or share any of the required user data types? | Yes (Google code scanner on the phone, and the optional usage statistics and crash reports) |
| Is all of the user data collected by your app encrypted in transit? | Yes (ML Kit, Google Analytics for Firebase and Firebase Crashlytics all use HTTPS) |
| Do you provide a way for users to request that their data is deleted? | Yes — by e-mail to greate43.sk.dev@gmail.com; turning "Share usage statistics" off also resets the analytics data and the app-instance ID on the device, and turning "Send crash reports" off deletes unsent crash reports. |
Data types
Every data type not listed here is neither collected nor shared.
| Category → type | Collected | Shared | Processed ephemerally | Required or optional | Purposes |
|---|---|---|---|---|---|
| App activity → App interactions | Yes | No (Google processes it as Nexora's service provider) | No | Optional (off until the user allows it on the consent page or in Settings → Storage & privacy, phone and TV: "Share usage statistics") | Analytics |
| App info and performance → Crash logs | Yes (Firebase Crashlytics: stack traces and exception details of Java/Kotlin crashes and ANRs, and of handled errors with their message removed; the fixed crash keys; no NDK) | No (Google processes it as Nexora's service provider) | No | Optional (only when "Send crash reports" is on) | Analytics |
| App info and performance → Diagnostics | Yes | No | No | Optional (the code scanner, only when the user scans a pairing QR code; the device, app and crash-time diagnostics Firebase adds and Nexora's crash keys, only when crash reports are on; the playback-quality ranges, only when usage statistics are on) | App functionality, Analytics |
| Location → Approximate location | Yes (derived by Google from the connection's IP address, only when the statistics switch is on; the app itself reads and sends no location) | No (Google processes it as Nexora's service provider) | No | Optional (only when the usage-statistics switch is on) | Analytics |
| Device or other IDs → Device or other IDs | Yes (the Firebase app-instance ID and the Crashlytics installation ID, only when sharing is on; and the Google code scanner's per-installation identifiers) | No | No | Optional (only when sharing is on, or the user scans a pairing QR code) | App functionality, Analytics |
| Financial info → Purchase history | Yes (Firebase Analytics automatically records Google Play in-app purchase events — the Nexora Pro product and its price — only when sharing is on; since NX-DEC-845 Nexora also sends purchase_started / purchase_completed with only the plan (monthly, yearly, lifetime) and whether a free trial applies — no price, order or account) | No (Google processes it as Nexora's service provider) | No | Optional (only when sharing is on) | Analytics |
App interactions, Crash logs and Purchase history come only from the optional usage statistics and crash reports below. The Diagnostics and Device or other IDs rows come from them (only when you allow sharing) and from Google's code scanner, which the phone app uses only to scan the TV's pairing code (the TV app has no scanner). Google describes the scanner's data at ML Kit's data disclosure. Nexora does not use the advertising ID.
Usage statistics and crash reports (Google Analytics for Firebase and Firebase Crashlytics)
Nexora asks once, on first start or later in Settings ("Share usage statistics and crash reports"), whether you allow usage statistics and crash reports. Sharing is off until you allow it (opt-in); accepting the terms is not that permission, and developer debug builds never collect. When you allow it, Nexora uses Google Analytics for Firebase and sends only the events below, with fixed values, and Firebase Crashlytics sends a report when the app crashes or stops responding. Nexora never sends what you watch, titles, links, add-on or source names, searches or anything you type, adds nothing of its own to crash reports, and never uses your advertising ID or Android ID; ad personalisation and Google signals are off. Crash reports are not anonymous: they contain the stack trace and technical details of the error. Google processes the data for Nexora as a service provider; statistics are kept for 2 months and crash reports for up to 90 days. Turning sharing off stops collection at once, resets the analytics data and the app-instance ID on your device and deletes crash reports not yet sent; to ask Nexora to delete data already collected, e-mail greate43.sk.dev@gmail.com.
| Event | When | Parameters (fixed values only) |
|---|---|---|
screen_viewed | A main screen opens (once per change) | screen, form_factor |
feature_used | A feature is used | feature, form_factor |
play_started | A new playback starts (not a retry or reconnect) | play_kind, form_factor |
source_added | A new source's first import succeeds | source_type, form_factor |
addon_installed | A JSON add-on is installed (count only) | form_factor |
setting_changed | A counted switch is flipped (any settings screen, or Sync now) | setting, state, form_factor |
app_opened | The app comes to the foreground | form_factor |
session_length | The app goes to the background | session_bucket, form_factor |
free_limit_reached | Free's daily viewing allowance refuses or stops playback (NX-DEC-845) | kind, form_factor |
paywall_viewed | The Nexora Pro page opens | from, form_factor |
purchase_started | Google Play's purchase sheet opens for a plan | plan, trial, form_factor |
purchase_completed | Google Play reports that purchase as made | plan, trial, form_factor |
playback_failed | Playback stops on an error (not a live stream rejoining its window) — NX-DEC-1150 | failure, form_factor |
playback_startup | A start shows its first frame: how long it took, as a range | startup, form_factor |
playback_stalls | A playback that showed a frame ends: how often it re-buffered, as a range | stalls, form_factor |
sync_result | A phone ↔ TV Sync now (or one-tap sync) ends | result, form_factor |
purchase_flow | A Nexora Pro step ends: plans loaded, Play's sheet opened, the purchase answered | step, result, form_factor |
addon_result | A JSON add-on install ends | result, form_factor |
The fixed values
| Parameter | Values |
|---|---|
form_factor | phone, tv |
screen | home, movies, series, live_tv, guide, my_list, library, search, favourites, history, groups, settings, add_source, addons, pro; NX-DEC-1151: player, now_playing, details, person, category, addon_store, sources, source_diagnostics, extensions (debug builds only since NX-DEC-1214), downloads, devices, playback_settings, p2p_settings, guide_settings, appearance, storage_privacy, backup_restore, parental_controls, about |
feature | search_used, continue_watching_resumed, cast_started, picture_in_picture, devices_paired, backup_created, backup_restored; NX-DEC-1151: seek_preview_used, skip_intro_used, up_next_played, external_player_opened, sync_now, favourite_added, download_started, problem_reported |
play_kind | live, movie, series, p2p |
source_type | m3u, m3u_file, xtream, jellyfin, emby, other_server |
setting | follow_system_theme, dark_mode, dynamic_colours, floating_preview, brightness_gesture, volume_gesture, screen_rotation, tunnelled_playback, clock_12h, remote_control, no_pictures, refresh_on_open, peer_to_peer |
state | on, off |
session_bucket | under_1_min, under_10_min, under_1_hour, over_1_hour |
kind | live, on_demand |
from | limit, settings, banner, other |
plan | monthly, yearly, lifetime |
trial | yes, no |
failure | network, bad_response, timeout, source, decoder, drm, other (Media3's error-code groups) |
startup | under_1_s, under_3_s, under_10_s, over_10_s |
stalls | none, one, two_to_five, over_five |
result | ok, cancelled, offline, unavailable, pending, invalid, refused, failed |
step | plans, sheet, purchase |
What Firebase adds
| Field | Value |
|---|---|
| App-instance ID | A random ID Firebase creates for this installation while the switch is on; reset (a new one is made) when the user turns the switch off. Not the advertising ID, not the Android ID |
| Device and app information | Collected by the Firebase SDK: app version, device model and brand, Android version, language, first-open time and similar (Google's "automatically collected user properties") |
| Approximate location | Country, region and city, derived by Google from the connection's IP address (the app has no location permission and reads no location) |
| Firebase's own events | Google's automatically collected app events (for example first_open, session_start, user_engagement, app_update, os_update, and in_app_purchase for a Nexora Pro purchase through Google Play); automatic screen_view is off |
| Crash reports (Firebase Crashlytics) | Uncaught Java/Kotlin crashes and ANRs: stack trace and exception message, device state (model, OS version, memory, orientation and similar), app version, a Crashlytics installation ID, Nexora's fixed crash keys and breadcrumbs (above). No NDK crashes, no user ID. Exception messages of uncaught crashes written by libraries are not filtered (handled errors are), so reports are not described as anonymous |
| Retention | Analytics: 2 months, event and user data (GA4 minimum; reset on new activity off). Crashlytics: up to 90 days |
Google describes what the Firebase SDK collects in Configure Analytics data collection and usage and Automatically collected events, and what Crashlytics collects in Firebase's data disclosure.