Passa al contenuto principale

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 tramite 127.0.0.1:8080. Non lascia mai la macchina di per sé.
  • otel — inviato a https://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à

VoceComponentDestinationNote
UUID utente Supabasebothlocal, supabase, otel, s3Usato 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)bothlocal (encrypted), supabase, core ↔ uiMemorizzato 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)uilocal (encrypted), supabaseCatturato dalla callback Steam OpenID; incorporato nell'email sintetica steam_<steamId>@playroll.gg usata come email dell'account Supabase.
Username Steamuilocal (encrypted), supabase, otelMostrato nella UI dell'account; raggiungibile anche dal claim user_metadata del JWT che il core legge.
URL dell'avatar Steamuilocal (unencrypted), supabaseUsato dall'avatar del launcher. L'URL punta alla CDN di Steam.
Token Xbox Live (access, refresh, XSTS, XUID)uilocal (encrypted)Cifrati tramite safeStorage in %LOCALAPPDATA%\Playroll\xbox-auth.json. Usati solo per enumerare la libreria Xbox Game Pass.
Install IDuilocal (registry), supabaseUUID 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 corebothlocal, core ↔ uiStringa 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)uilocal, supabasePersistito nel gate-store locale e replicato su Supabase come parte del flusso di onboarding.
Richiesta di collegamento contributoruisupabaseL'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 distanzaPLAYROLL_STARTUP_CONTEXT_LOG_MODE=plaintext disabilita l'hashing per i campi non sensibili.

VoceComponentDestinationNote
Architettura CPU, conteggio core logici, page sizecoreotelIn chiaro.
Memoria fisica totale / disponibile (byte)coreotelIn chiaro.
Uptime del sistemacoreotelIn chiaro.
Vendor GPU (NVIDIA / AMD / Intel / altro)coreotelIn chiaro.
Modello GPU, versione driver, vendor ID, device IDcoreotelPer-adapter, in chiaro.
Memoria GPU dedicata e condivisacoreotelIn chiaro.
Capability dell'encoder (presenza NVENC)coreotelIn chiaro. Riportato dal probe di selezione dell'encoder. Pure-v2 è NVENC-only; i path AMD/software sono stati rimossi in EC-173.
Conteggio dei monitorcoreotelIn chiaro.
Risoluzione, refresh rate, profondità colore, orientamento per monitorcoreotelIn chiaro.
Nome del dispositivo monitorcoreotelHashato di default.
Conteggio degli endpoint audio (render / capture)coreotelIn chiaro.
ID e nome friendly dell'endpoint audiocoreotelHashato di default — i nomi friendly possono identificare dispositivi esterni ("AirPods di Marco").
Tutti i display (vista Electron): bounds, scaleFactor, colorDepth, colorSpace, rotation, touchSupportuiotelIn chiaro. Emessi come display.inventory, display.inventory_changed, display.window_mapping.
Impostazione del profilo colore (sRGB / Adobe RGB / Display P3)uiotelIn chiaro.
Flag di accelerazione GPU configuratiuiotelIn chiaro.

Sistema operativo e ambiente

VoceComponentDestinationNote
Versione di Windows (major.minor.build)coreotelIn chiaro.
Tipo di prodotto Windows (workstation / server)coreotelIn chiaro.
Architettura del processo, tipo di build (debug / release)coreotelIn chiaro.
HostnameuiotelIn chiaro. Inviato in ogni batch OTel come host.name.
os.type() e os.release()uiotelIn chiaro.
Username WindowscoreotelHashato di default; loggato tramite GetUserNameW.
Nome del computercoreotelHashato di default.
Percorso dell'eseguibile e directory di lavoro correntecoreotelHashato di default — i percorsi dei file rivelano lo username Windows.
Process ID, parent process IDcoreotelIn chiaro.
Integrity level, elevation type, elevated flagcoreotelIn chiaro.
Session ID di Windows, console session ID, remote-session flag, SESSIONNAMEcoreotelIn chiaro.
Variabili d'ambiente (tutte, all'avvio)coreotelIterate 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-linecoreotelStessa policy di redazione delle env var.
PLAYROLL_RELEASE_TRACK, PLAYROLL_INSTALLER_VERSIONcoreotelHashati di default.

Libreria giochi e monitoraggio dei processi

VoceComponentDestinationNote
Elenco degli eseguibili dei giochi monitoraticorelocalCaricato 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)uilocal, supabaseI 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)uilocalParsificati dai file Steam VDF locali. Non trasmessi.
Chiavi di registry Steam (HKCU\Software\Valve\Steam — SteamPath, ModInstallPath)uilocalLette per localizzare la libreria Steam. Non trasmesse.
Catalogo Xbox Game PassuilocalRecuperato da Xbox Live usando il token Xbox memorizzato, cachato localmente.
Nome e slug del gioco rilevatocorelocal, supabase, s3, otelEs. "Elden Ring" / "elden-ring". Incorporato nei percorsi delle chiavi S3 e nei payload di notifica degli upload.
IGDB game ID, Supabase game-store IDcorelocal, supabaseMemorizzati sulla riga di sessione per deduplicare rispetto al catalogo canonico.
Handle (HWND) e titolo della finestra in primo pianocoreotel (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.

ArtefattoContieneDestination
*.mp4Pixel 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.csvEventi 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/fineVettore 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.

VoceDestinationNote
session_id (UUID), game_name, game_slug, lobby_id, lobby_code, recording_started_atsupabase (API presigned)Inviati all'avvio e alla fine della sessione.
Prefisso chiave S3 <user_id>/<game_slug>/<YYYY>/<MM>/<DD>/<session_id>/s3Le 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 countlocal (SQLite), s3Persistiti 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.

TabellaColonne notevoli
sessionssession_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).
filessession_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_settingsRighe 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.

EndpointRivela
GET /api/status, GET /api/recorder/statusStato corrente della registrazione, gioco attivo, dettagli della sessione.
GET /api/uploader/statusUpload corrente, file in coda, avanzamento.
GET /api/uploader/historyCronologia recente degli upload con nomi dei giochi, timestamp, percorsi.
GET /api/gamesElenco dei giochi monitorati e stato di detection.
POST /api/authRiceve il JWT Supabase dalla UI.
POST /api/lobby/setLobby 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.

StreamComponentCampi in chiaro sempre presenti
Core LOG_EVENT(...)coreservice.name=playroll, versione, release track, versione dell'installer, riepilogo OS/hardware al boot, payload per evento (vedi Telemetry Event Catalog).
UI OTel loggeruihost.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 bridgeuiCattura console.log/info/warn/error/debug da main e renderer e li inoltra come log OTel con log.source=console.*.
File di log localibothplayroll_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

VoceDestinationNote
Install IDsupabaseInviato a ogni controllo di aggiornamento all'Edge Function resolve-update.
InstallerVersion, CoreVersion, UIVersion installatesupabaseLette da HKCU\Software\Playroll.
Release track (stable / dev / test)supabaseUsata per selezionare il rollout corretto.
Bucket di rollout (A/B) restituito e chiave dell'esperimentolocalMemorizzati per mantenere lo stesso bucket tra i check.

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\PlayrollCaptures finché 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.