Skip to content

Privacy Policy

Last updated: May 02, 2026

RAOfflineProxy ("the app") is a local proxy tool for Android that enables offline RetroAchievements support with RetroArch. This privacy policy explains what data is handled by the app, how it is stored, and when it is transmitted.

Summary

  • The app does not collect, store, or transmit any data to its developer.
  • The app does not contain ads, analytics, or crash reporting SDKs.
  • All data handled by the app stays on your device or is sent directly to RetroAchievements.org on your behalf: the same requests RetroArch would have made itself.

What data is handled

RetroAchievements credentials

When the proxy starts, the app reads your saved RetroAchievements login from RetroArch's retroarch.cfg. It first uses cheevos_token when present. If no token is available, it uses cheevos_username and cheevos_password once to retrieve a token from RetroAchievements, then stores that token in its local cache. This cache is used to authenticate requests when your device is offline.

Your credentials are never sent to the app developer. They are only ever forwarded to retroachievements.org, exactly as RetroArch would do directly.

Game and achievement data

The app caches game patch data (achievement lists, point values, badge names) and your unlock state in the local database. This is what allows achievements to display correctly when you are offline.

Pending (offline) award queue

When you unlock an achievement while offline, the app queues the award in the local database and sends it to RetroAchievements when your connection is restored. Each queued award is signed with a device-local cryptographic key (stored in Android Keystore) and chained to the previous award for tamper evidence. The public key is included in the flushed request; the private key never leaves Android Keystore.

ROM file hashes

When you scan a ROM file or folder, the app computes an MD5 hash of each file and sends that hash to RetroAchievements to look up the corresponding game. ROM file contents are never stored or transmitted: only the MD5 hash.

RetroArch user-agent string

The app caches the User-Agent header sent by RetroArch (e.g. rcheevos/11.4.0) and appends its own identifier (RAOfflineProxy/<version>) when forwarding requests to RetroAchievements so the server can distinguish proxied traffic.

Game icon images

Game badge and icon images are downloaded from RetroAchievements and stored in local app storage for display in the UI. They are never transmitted elsewhere.


Data storage

All data is stored locally on your device in:

  • A SQLite database (raofflineproxy.db) managed by Android Room
  • App-internal file storage for cached images

Both are excluded from Android Auto-Backup and device-to-device transfer (as declared in backup_rules.xml and data_extraction_rules.xml). Your credentials will not appear in cloud backups.


Data transmission

The app transmits data only to retroachievements.org over HTTPS. This includes:

DataWhen
Username + API tokenOn every proxied API request
Achievement awardWhen flushing the offline queue after reconnecting
ROM MD5 hashWhen scanning ROM files
ECDSA public keyAttached to flushed award requests for chain verification
Seconds-since-unlock offsetAttached to flushed award requests

No data is sent to any other server. The developer does not receive any data.


Data deletion

You can delete all locally stored data at any time:

  • Clear Cache (Settings screen): removes cached game and achievement data. Does not remove credentials or pending awards.
  • Clear Database (Settings screen): removes all locally stored data including credentials, cached game data, and pending awards.

Deleting the app also removes all app data.


Third-party services

The app communicates exclusively with RetroAchievements.org. Their privacy policy governs how they handle data you send to their servers: https://retroachievements.org/terms.


Children

The app does not knowingly collect data from children. It is a utility for interacting with RetroAchievements, which has its own terms of service.


Changes to this policy

If this policy changes materially, the updated version will be published at this URL with a new "Last updated" date.


Contact

For questions about this privacy policy, open an issue or discussion on the GitHub repository.