Riferimento di raccolta dati
Questa pagina documenta ogni categoria di dati di utente, dispositivo e hardware che il client desktop Playroll raccoglie, memorizza o trasmette. È la fonte di verità per le informative sulla privacy e le FAQ destinate ai tester.
Il client desktop è distribuito come due processi cooperanti:
- Playroll UI (
playroll.exe) — Frontend Electron + React che gestisce il sign-in, lo scanning della libreria, l'account e i controlli di aggiornamento. - Playroll Core (
playroll-core.exe) — Backend C++ che esegue cattura, encoding e upload.
Quando un dato viene raccolto soltanto da uno dei due, la colonna Component della tabella indica ui o core. Quando entrambi lo toccano, la voce dice both.
La colonna Destination elenca dove il dato viaggia oltre la memoria locale:
local— scritto su disco solo sulla macchina dell'utente.core ↔ ui— scambiato tra i due processi locali tramite127.0.0.1:8080. Non lascia mai la macchina di per sé.otel— inviato ahttps://otel.playroll.gg/v1/logs(backend SigNoz).supabase— inviato a Supabase (Postgres + Edge Functions).s3— caricato nel bucket S3 delle registrazioni tramite URL presigned.steam/xbox— endpoint Steam OpenID / Xbox Live OAuth durante il sign-in.
Account e identità
| Voce | Component | Destination | Note |
|---|---|---|---|
| UUID utente Supabase | both | local, supabase, otel, s3 | Usato come principal RLS e come prefisso di livello superiore della chiave S3 (<user_id>/<game_slug>/<date>/<session_id>/). Loggato sul core tramite hashForLog per impostazione predefinita; inviato in chiaro in OTel come enduser.id. |
| JWT Supabase (access + refresh) | both | local (encrypted), supabase, core ↔ ui | Memorizzato cifrato in %LOCALAPPDATA%\Playroll\auth.json tramite safeStorage di Electron (DPAPI su Windows). La UI inoltra l'access token al core; il core non lo persiste. |
| Steam ID (64-bit) | ui | local (encrypted), supabase | Catturato dalla callback Steam OpenID; incorporato nell'email sintetica steam_<steamId>@playroll.gg usata come email dell'account Supabase. |
| Username Steam | ui | local (encrypted), supabase, otel | Mostrato nella UI dell'account; raggiungibile anche dal claim user_metadata del JWT che il core legge. |
| URL dell'avatar Steam | ui | local (unencrypted), supabase | Usato dall'avatar del launcher. L'URL punta alla CDN di Steam. |
| Token Xbox Live (access, refresh, XSTS, XUID) | ui | local (encrypted) | Cifrati tramite safeStorage in %LOCALAPPDATA%\Playroll\xbox-auth.json. Usati solo per enumerare la libreria Xbox Game Pass. |
| Install ID | ui | local (registry), supabase | UUID casuale generato una volta per installazione, memorizzato in HKCU\Software\Playroll\InstallId. Inviato all'Edge Function resolve-update per il bucketing del rollout. |
| Secret di sessione core | both | local, core ↔ ui | Stringa esadecimale di 64 caratteri generata una volta e persistita in %LOCALAPPDATA%\Playroll\core-session-secret.txt. Usata come segreto condiviso sull'API HTTP locale. Non lascia mai la macchina. |
| Profilo di onboarding (età confermata, paese, lingua, timestamp di consenso) | ui | local, supabase | Persistito nel gate-store locale e replicato su Supabase come parte del flusso di onboarding. |
| Richiesta di collegamento contributor | ui | supabase | L'intento di collegamento contributor (request_id, app_user_id) viene creato tramite l'Edge Function create-contributor-link-intent e risolto successivamente tramite la tabella contributor_status_projection. |
Configurazione hardware e display
Il core enumera l'hardware dell'utente all'avvio e logga ogni voce su OTel. Le stringhe sono hashate di default (hashForLog) ma l'opt-out è a una sola variabile d'ambiente di distanza — PLAYROLL_STARTUP_CONTEXT_LOG_MODE=plaintext disabilita l'hashing per i campi non sensibili.
| Voce | Component | Destination | Note |
|---|---|---|---|
| Architettura CPU, conteggio core logici, page size | core | otel | In chiaro. |
| Memoria fisica totale / disponibile (byte) | core | otel | In chiaro. |
| Uptime del sistema | core | otel | In chiaro. |
| Vendor GPU (NVIDIA / AMD / Intel / altro) | core | otel | In chiaro. |
| Modello GPU, versione driver, vendor ID, device ID | core | otel | Per-adapter, in chiaro. |
| Memoria GPU dedicata e condivisa | core | otel | In chiaro. |
| Capability dell'encoder (presenza NVENC) | core | otel | In chiaro. Riportato dal probe di selezione dell'encoder. Pure-v2 è NVENC-only; i path AMD/software sono stati rimossi in EC-173. |
| Conteggio dei monitor | core | otel | In chiaro. |
| Risoluzione, refresh rate, profondità colore, orientamento per monitor | core | otel | In chiaro. |
| Nome del dispositivo monitor | core | otel | Hashato di default. |
| Conteggio degli endpoint audio (render / capture) | core | otel | In chiaro. |
| ID e nome friendly dell'endpoint audio | core | otel | Hashato di default — i nomi friendly possono identificare dispositivi esterni ("AirPods di Marco"). |
| Tutti i display (vista Electron): bounds, scaleFactor, colorDepth, colorSpace, rotation, touchSupport | ui | otel | In chiaro. Emessi come display.inventory, display.inventory_changed, display.window_mapping. |
| Impostazione del profilo colore (sRGB / Adobe RGB / Display P3) | ui | otel | In chiaro. |
| Flag di accelerazione GPU configurati | ui | otel | In chiaro. |
Sistema operativo e ambiente
| Voce | Component | Destination | Note |
|---|---|---|---|
| Versione di Windows (major.minor.build) | core | otel | In chiaro. |
| Tipo di prodotto Windows (workstation / server) | core | otel | In chiaro. |
| Architettura del processo, tipo di build (debug / release) | core | otel | In chiaro. |
| Hostname | ui | otel | In chiaro. Inviato in ogni batch OTel come host.name. |
os.type() e os.release() | ui | otel | In chiaro. |
| Username Windows | core | otel | Hashato di default; loggato tramite GetUserNameW. |
| Nome del computer | core | otel | Hashato di default. |
| Percorso dell'eseguibile e directory di lavoro corrente | core | otel | Hashato di default — i percorsi dei file rivelano lo username Windows. |
| Process ID, parent process ID | core | otel | In chiaro. |
| Integrity level, elevation type, elevated flag | core | otel | In chiaro. |
Session ID di Windows, console session ID, remote-session flag, SESSIONNAME | core | otel | In chiaro. |
| Variabili d'ambiente (tutte, all'avvio) | core | otel | Iterate e loggate. Le chiavi corrispondenti a API_KEY, PASSWORD, TOKEN, SECRET, AUTH, CREDENTIAL, CERT, KEY, PRIVATE, BEARER, ACCESS_TOKEN sono sempre hashate, indipendentemente dalla modalità. Tutti gli altri valori sono hashati di default. |
| Argomenti della command-line | core | otel | Stessa policy di redazione delle env var. |
PLAYROLL_RELEASE_TRACK, PLAYROLL_INSTALLER_VERSION | core | otel | Hashati di default. |
Libreria giochi e monitoraggio dei processi
| Voce | Component | Destination | Note |
|---|---|---|---|
| Elenco degli eseguibili dei giochi monitorati | core | local | Caricato da res/games.json. Definisce quali processi il core osserva. |
| Giochi installati rilevati (Steam, Epic, GOG, EA, Ubisoft, Battle.net, Amazon, Xbox, Riot, itch.io) | ui | local, supabase | I detector della libreria scansionano directory degli store e registri. L'elenco di giochi eligibili risultante è sincronizzato nella tabella Supabase eligible_games_per_user per il filtraggio del catalogo. |
| Dati di manifest Steam (app ID, percorsi della cartella di installazione, install state) | ui | local | Parsificati dai file Steam VDF locali. Non trasmessi. |
Chiavi di registry Steam (HKCU\Software\Valve\Steam — SteamPath, ModInstallPath) | ui | local | Lette per localizzare la libreria Steam. Non trasmesse. |
| Catalogo Xbox Game Pass | ui | local | Recuperato da Xbox Live usando il token Xbox memorizzato, cachato localmente. |
| Nome e slug del gioco rilevato | core | local, supabase, s3, otel | Es. "Elden Ring" / "elden-ring". Incorporato nei percorsi delle chiavi S3 e nei payload di notifica degli upload. |
| IGDB game ID, Supabase game-store ID | core | local, supabase | Memorizzati sulla riga di sessione per deduplicare rispetto al catalogo canonico. |
| Handle (HWND) e titolo della finestra in primo piano | core | otel (solo diagnostica) | Usati dal watchdog delle finestre. I titoli delle finestre vengono loggati negli eventi di diagnostica delle finestre. |
Artefatti di registrazione (i file che catturiamo)
Questi sono gli output effettivi della registrazione del gioco. Contengono il contenuto più sensibile che il client produca mai. Risiedono su disco per impostazione predefinita in %USERPROFILE%\Videos\PlayrollCaptures e vengono caricati su S3 quando una sessione è eligibile.
| Artefatto | Contiene | Destination |
|---|---|---|
*.mp4 | Pixel video grezzi della finestra di gioco catturata più audio di sistema (loopback) codificato AAC, multiplexati nello stesso file MP4. La traccia video contiene qualunque cosa visibile sulla superficie catturata — overlay di chat, UI di voice-chat, HUD trapelati, tab del browser se riflessi dal gioco. La traccia audio può includere voice chat, Discord, musica, notifiche di sistema. Il microfono non è catturato. | local, s3 |
*_input.csv | Eventi di input con timestamp: scancode di tastiera, delta e clic del mouse, pulsanti / stick / trigger del controller, scroll, delta di posizione del cursore. Sincronizzati ai numeri di frame del video. | local, s3 |
| Snapshot JSON di inizio/fine | Vettore di stato completo degli input ai confini della sessione. | local, s3 |
I file di registrazione vengono mantenuti su disco dopo l'upload per impostazione predefinita. La disinstallazione li conserva a meno che l'utente non deselezioni "Keep recordings" nell'uninstaller.
Metadata di upload e sessione
Il core effettua due tipi di chiamate di rete per conto dell'utente durante una registrazione: richieste di URL presigned per gli upload S3 e notifiche di confine della sessione.
| Voce | Destination | Note |
|---|---|---|
session_id (UUID), game_name, game_slug, lobby_id, lobby_code, recording_started_at | supabase (API presigned) | Inviati all'avvio e alla fine della sessione. |
Prefisso chiave S3 <user_id>/<game_slug>/<YYYY>/<MM>/<DD>/<session_id>/ | s3 | Le chiavi degli oggetti sono correlabili per costruzione a utente e gioco. |
Metadata per-file: file_type (mp4/csv/json), filename, size_bytes, s3_key, retry count | local (SQLite), s3 | Persistiti in upload_state.db. |
Stato SQLite locale (upload_state.db)
Il core mantiene la sua bookkeeping di sessione e upload in %LOCALAPPDATA%\Playroll\upload_state.db. Il database è SQLite semplice, non cifrato.
| Tabella | Colonne notevoli |
|---|---|
sessions | session_id, owner_id (= UUID utente Supabase), game_name, game_slug, game_store_id, igdb_id, lobby_id, lobby_code, status, created_at, started_at, ended_at, peer_interacted, error_message, detected_resolution (blob JSON con width/height/fullscreen mode). |
files | session_id, file_type, file_path (percorso assoluto sul disco locale — rivela lo username Windows), filename, size_bytes, status, retry_count, uploaded_at, s3_key, error_message. |
app_settings | Righe key/value di formato libero per la configurazione del core. |
API HTTP locale (http://127.0.0.1:8080)
Il core espone un control plane su localhost per la UI. L'API è vincolata alla sola interfaccia di loopback ed è gestita tramite l'header X-Session-Secret, ma qualunque processo eseguito come lo stesso utente può raggiungerla.
| Endpoint | Rivela |
|---|---|
GET /api/status, GET /api/recorder/status | Stato corrente della registrazione, gioco attivo, dettagli della sessione. |
GET /api/uploader/status | Upload corrente, file in coda, avanzamento. |
GET /api/uploader/history | Cronologia recente degli upload con nomi dei giochi, timestamp, percorsi. |
GET /api/games | Elenco dei giochi monitorati e stato di detection. |
POST /api/auth | Riceve il JWT Supabase dalla UI. |
POST /api/lobby/set | Lobby ID, lobby code, game slug per il contesto multiplayer attivo. |
Telemetria e log
Tutti gli eventi strutturati provenienti da entrambi i processi vengono inviati al collector SigNoz su https://otel.playroll.gg/v1/logs. La dimensione del batch è 50 eventi / 10 s.
| Stream | Component | Campi in chiaro sempre presenti |
|---|---|---|
Core LOG_EVENT(...) | core | service.name=playroll, versione, release track, versione dell'installer, riepilogo OS/hardware al boot, payload per evento (vedi Telemetry Event Catalog). |
| UI OTel logger | ui | host.name (hostname in chiaro), os.type, os.release, process.pid, service.version, app.channel, enduser.id (= UUID utente Supabase, in chiaro), session.id (UUID per-process), opzionale deployment.environment. |
| UI console bridge | ui | Cattura console.log/info/warn/error/debug da main e renderer e li inoltra come log OTel con log.source=console.*. |
| File di log locali | both | playroll_core.log, playroll_node.log e un opzionale file di log UI per-process. Ruotati periodicamente. Il layout dei percorsi include lo username Windows. |
enduser.id e host.username nei record OTel sono inviati in chiaro dalla UI — non c'è hashing sul lato UI. La policy di redazione del contesto di startup del core si applica solo all'interno del processo core.
Controlli di aggiornamento e versione
| Voce | Destination | Note |
|---|---|---|
| Install ID | supabase | Inviato a ogni controllo di aggiornamento all'Edge Function resolve-update. |
InstallerVersion, CoreVersion, UIVersion installate | supabase | Lette da HKCU\Software\Playroll. |
Release track (stable / dev / test) | supabase | Usata per selezionare il rollout corretto. |
| Bucket di rollout (A/B) restituito e chiave dell'esperimento | local | Memorizzati per mantenere lo stesso bucket tra i check. |
Deep link
La UI registra l'handler del protocollo playroll://. Le callback di auth in arrivo su questo protocollo trasportano access_token, refresh_token Supabase e un oggetto JSON user (id, steamId, steamUsername, steamAvatarUrl). Questi token sono immediatamente memorizzati cifrati e non vengono mai loggati.
Cosa non raccogliamo
Quanto segue non viene esplicitamente catturato dal client oggi. Questa lista è intesa come uno scope negativo non esaustivo:
- Audio del microfono. Solo l'audio di loopback (di sistema) viene registrato.
- Video della webcam.
- Contenuto delle digitazioni come caratteri in chiaro — il recorder degli input scrive scancode / virtual-key code sincronizzati ai numeri di frame, non flussi di caratteri. Tutto ciò che viene digitato nella finestra di gioco catturata è comunque visibile nel video.
- Cronologia del browser, file al di fuori di
%USERPROFILE%\Videos\PlayrollCaptures, o qualunque contenuto non prodotto dal gioco catturato. - Informazioni di pagamento. I flussi di payout non sono implementati nel client e nessun campo bancario / KYC viene raccolto dall'app desktop.
- Indirizzi MAC, numeri seriali dei dischi o qualunque altro fingerprint hardware dedicato oltre ai campi GPU/CPU/audio/display elencati sopra.
Conservazione ed eliminazione dei dati
- Registrazioni locali: mantenute sotto
%USERPROFILE%\Videos\PlayrollCapturesfinché l'utente non le elimina. La disinstallazione le mantiene di default (checkbox di opt-out nell'uninstaller). upload_state.db: rimosso alla disinstallazione.- File credenziali cifrati (
auth.json,xbox-auth.json,core-session-secret.txt): sotto%LOCALAPPDATA%\Playroll; rimossi alla disinstallazione. - Voci di registry (
HKCU\Software\Playroll): rimosse alla disinstallazione. - Registrazioni S3: conservate lato server secondo la policy di lifecycle del bucket delle registrazioni.
- Log OTel: conservati da SigNoz secondo la retention configurata sul backend.