Privacy Policy
Summary. CarryForge is in a closed beta; there is no public download. The current desktop app (version 0.2.x) needs a CarryForge account and reads statistics and player data from CarryForge’s own service; the app itself never calls the Riot API. It reads the League Client and Riot’s Live Client Data on your PC and sends the service only what a feature needs: the Riot ID of your own League account (for your Home page and profile), Riot IDs you search or open, the match you just played (for the post-game report) and, only if you switch the loading-screen panel on, the visible Riot IDs of the players in your game (section 3). Bug reports and their diagnostic logs are sent only when you submit a report (section 7b). Recordings stay on your PC and are never uploaded. There is no advertising SDK and no third-party analytics, and CarryForge does not sell personal data. Separately, the CarryForge service keeps Riot match data on its servers, including data about players who do not use CarryForge, encrypted and indexed by pseudonyms; section 4 explains what is kept and what you can ask us to do. Earlier app versions (0.1.x) offered the features described in sections 5b and 6; data they sent is kept and can be deleted as described there.
Private loading cards. Once a day, the server prepares bounded summaries from already stored Ranked Solo/Duo matches for known sampled accounts. These summaries include 60-day observed match and champion counts, measured solo kills and champion damage where at least 30 matches record that field, and the predominant observed role only after 30 classified games and a strict majority. Recent results are described as a consecutive sequence only when the canonical match-history page chain and accepted matches prove that interval complete. A low-level/high-win-rate candidate describes only a recorded account level and a complete 30-game sample; it does not identify another account or a person. Snapshot identifiers and source-match references stay private. Loading requests use only an exact stored public name and never collect additional Riot data; hidden names, opted-out players, withdrawn source matches, and expired snapshots are not returned. A snapshot may be displayed for at most 48 hours; rank and account-level observations show their original time and are omitted after 7 days. Daily refresh replaces the previous per-account snapshot; access and erasure requests apply to this derived record as well.
1. Who controls the data
CarryForge is operated by Ziya, an independent developer. Privacy and deletion questions can be sent to [email protected].
2. Website data
carryforge.net does not set marketing cookies and does not embed a third-party video player; the product walkthrough is served from the same site. The web host and Cloudflare network may process standard connection information such as IP address, date/time, requested URL, response status, user agent and security signals to deliver the site, prevent abuse and troubleshoot faults. Their own infrastructure and legal retention rules also apply. The desktop app’s updater (on by default, can be switched off in Settings) requests latest.yml, the installer and its .blockmap from https://carryforge.net/updates/preview/ at start-up and every four hours; these requests carry the same standard connection information and no account or player identifier.
Private account workspace. The separately restricted development workspace uses a secure, HttpOnly session cookie shared across its pages. Its Companion Premium and Academy video rights are independent. The private coaching service stores chosen services, reservation times, quoted amounts, provider references, payment/refund/dispute and coach payout status; live payments are not configured yet. Coaches see only the notes and match identifiers you explicitly share for a booked session, not your whole archive. Both participants must confirm a finished paid session before its learner can review it; approved review text and rating may be shown on the coach profile. Academy progress stores the lesson, playback position and completion. Licensed video playback requires server-authorized temporary access. Device-bound account access stores a hash of a random installation/browser credential, not a hardware fingerprint; credentials remain on the device. The coaching, Academy and payment features are not part of the desktop app, which has no payment function.
3. The desktop app and your CarryForge account (version 0.2.x)
Account and sign-in. The app needs a CarryForge account. Signing in happens in your browser on carryforge.net; the browser hands a one-time code back to the app (carryforge:// link), which exchanges it for a session. The account stores a username, a display name, your email address (verified with a one-time code when you register; the code is kept only in server memory for 15 minutes) and your password only as a salted scrypt digest. Registration and verification emails are sent through our email provider (Resend). An account whose email is never verified is deleted after 7 days. On the server a session is kept only as a SHA-256 digest of its token, lasts 30 days and is renewed while you use the app; signing out deletes it.
One device per account. On first start the app creates a random installation secret (not a hardware fingerprint). It is sent with every request to our service, and the service keeps only a one-way digest of it, combined with your account id, and the time the device was bound. Requests from another device are refused. There is no self-service device change yet; email us to move an account to another PC.
On your PC. The session token and the installation secret are stored encrypted with Windows’ own data protection (DPAPI) in the app’s data folder; they are never written to logs.
What the app sends to the CarryForge service (always over HTTPS, with your session):
- Your own League account: the app follows the account signed in to your League Client and asks the service for that Riot ID’s stored profile (rank, rank history, recent games) for your Home page and profile. The accounts the app has seen are remembered only on your PC (Riot ID, region, icon, level, last seen; no PUUID).
- Profiles and searches you open: the Riot IDs and search text you enter, a profile’s “Update now”, its live-game tab, kill heatmap, Game Compass and ladder lookups.
- Post-game report: after a game the app asks the service for that match by its match ID. If whole-game recording is on, it may also ask the service to refresh your own profile so the match timeline arrives for automatic highlight clips.
- Loading-screen panel (off by default; also used when you compare the in-game benchmark with your lane opponent’s rank): the Riot IDs and champions of up to ten players in your game, as the League client and Riot’s Live Client Data show them, including your own seat. Players who hide their name and bots are never sent. See section 4 for how the service stores these lookups.
- Statistics and other pages: tier lists, builds, matchups, synergies, leaderboards, Team SoloQ, jungle routes, in-game benchmark targets and similar reads carry no player identity beyond your session; public statistics tables are fetched without your session.
- Watching a live game: when you click Watch, the platform and game ID; the League client then opens the spectator stream itself.
Apart from the loading-screen Riot IDs, Live Client Data (your in-game stats, items and events) is used only on your PC. League Client lockfile credentials are read locally and never sent to us. The service answers from its stored copies and its encrypted Riot response cache and asks Riot only through its own rate-limited server key; the app contains no Riot API key.
4. Server-side match store and aggregate statistics
To calculate aggregate champion, build, matchup and trend statistics, the CarryForge service keeps a server-side match store. Its data comes from two sources: matches sampled from players listed on Riot’s public ranked ladders (Ranked Solo/Duo and, where enabled, other matchmade queues such as ARAM, ARAM Mayhem and Arena), and match data fetched when CarryForge users look up players or matches as described in section 3. Sampled players do not need to use CarryForge.
- Match records: complete Match-V5 match and timeline data as returned by Riot, which include every participant’s PUUID, Riot ID and gameplay data. They are stored compressed and encrypted at rest. An encrypted copy of each record (the same ciphertext, encrypted before it leaves the server) is kept in Cloudflare R2 object storage in the European Union jurisdiction, together with encrypted database backups; the decryption keys stay on the CarryForge server and with the operator, never with Cloudflare. A daily job deletes raw timeline data from the server once it is at least 14 days old, its analytics projection has been stored and its encrypted copy is confirmed in that storage.
- Riot API response cache: successful non-spectator Riot GET responses outside canonical Match-V5 detail records (including account, rank, mastery and match-history ID responses) are stored in a private encrypted database cache. Cache keys are keyed HMACs, not raw Riot IDs or request paths; the encrypted cache table is included in the server’s encrypted database backups. Entries expire after 5 minutes to 6 hours and expired rows are purged by a scheduled job. Reading a valid entry spends no Riot quota; a refresh after expiry uses the shared rate limiter. Match-V5 summaries and timelines remain in the canonical match store and follow its withdrawal and retention rules. Active-game spectator credentials are not cached.
- Stored player data (only where the operator enables stored player reads, 6 October 2026; off by default): instead of asking Riot while you look at a profile, the service answers from a copy it collected earlier in the background and labels it with the time Riot was asked. That copy (account, level and icon, rank, mastery, challenges, Clash registration and match-history ID lists) is kept in the same encrypted cache under keyed-HMAC keys for up to 7 days and refreshed in the background (rank every few hours, match lists every few minutes while viewed, the rest daily). Pending background fills additionally keep an encrypted, size-bounded server checkpoint containing the lookup identity, retry count and next eligible attempt time for up to 7 days, so a restart can resume work without refreshing its observation timestamp or resetting its rate budget. Its encryption key is derived for this purpose separately from identity indexing; opted-out accounts are checked before another fill. Linked accounts: when you link a Riot account, the service additionally records its PUUID, region, Riot ID, the link time and the time it was last read, so it can keep that account’s data fresh without a request from you. An account no one has read for 30 days is removed from this list automatically; an account on the opt-out list (below) is never added and is removed at the next daily check. The legal basis is our legitimate interest in showing your own profile quickly without spending Riot quota on every view.
- Timeline analytics projection: per-minute gold and farm, item purchases, kills and building events, keyed by in-match seat number, without player identifiers.
- Derived gameplay rows: each participant’s champion, role, result, kills/deaths/assists, farm, gold and damage, and in ARAM Mayhem and Arena the augments they picked, without player identifiers. Augments feed only an anonymous per-champion popularity count (how often an augment was picked, with sample size); no augment win rate is calculated or shown.
- Pseudonymous index: each participant is linked to a keyed-HMAC pseudonym instead of a raw PUUID, so that matches played by the same account can be recognised. Ranked tier lookups are recorded with a timestamp against a one-way digest of the account rather than the raw PUUID. Since 29 September 2026 these dated Ranked Solo/Duo observations (tier, division, league points, wins and losses) are kept for 90 days and then deleted by a daily job; they also serve the LP history described in section 5b. Since 13 October 2026 the Ranked Flex entry contained in the same Riot answer (tier, division, league points, wins and losses) is stored the same way, under the same pseudonym and with the same 90-day deletion; no additional Riot request is made for it.
- Sampling registry: for the ladder accounts selected for sampling, the PUUID, Riot ID, server and ladder tier, plus scheduling state. Where enabled, visible loading-screen players whose match history is collected (section 4) are added with their PUUID, visible Riot ID and server.
- Stored apex ladder (only where the operator enables it): Riot’s official Challenger, Grandmaster and Master lists of Ranked Solo/Duo and Ranked Flex for the regions the service collects, saved on the server and refreshed at a fixed interval (every 30 minutes by default), so that the ladder page reads this copy and does not call Riot while it is viewed. Each row holds the PUUID, league points, wins and losses; each successful refresh replaces the whole list, and a failed refresh keeps the previous one. The public Riot ID of a listed account is looked up in the background, a limited number per refresh and in rank order, and stored exactly as Riot’s account service returned it, with the time of the lookup; it is asked again after 7 days and is not shown once it has gone 14 days without confirmation. A name is never invented: a row without a confirmed Riot ID is shown without a name. Positions are within one tier and queue, never a global ranking.
Aggregate statistics contain no PUUID, Riot ID or other player identifier. Where the public player archive is enabled, a separate index links current public Riot IDs to encrypted match records and time-stamped ranked observations. Requested profiles show stored match history and observed rank; OTP lists and the champion page’s OTP / high-ELO showcase rows show public Riot IDs, official rank, champion participation, observed builds and KDA on that champion. Ranked ladder rows may add, from the same stored snapshot of a player’s last 30 observed ranked games, the profile icon seen in the newest game, the most played role and its share, the most played champions and KDA; below 10 observed games these statistics are not shown. Since 13 October 2026 a ladder row may also carry a label for an account that a reviewed public source names: a professional player (public handle, team and league, from the same roster as the tracked Pro builds below) or a streamer who declared the account (Twitch channel name); the ladder page may also show how many of the listed players have each role as their most played role (counts only). A player on the opt-out list is shown on Riot’s ladder without a name, statistics or label, and every profile, OTP list and label read drops opted-out accounts. Requested profiles may page through every stored queue of the player, newest first, with up to 90 days of dated Solo/Duo and Flex rank observations and the highest rank observed in that window. These lists cover tracked players and verified history windows, not every player or an entire season. Previous Riot IDs are not provided as a name-history feature. The index and derived player snapshots persist across service restarts and currently have no automatic deletion period. They are separate from anonymous community contributions and are not linked to a CarryForge account record.
Ranks of other players in your loading screen (since 30 September 2026; in the current app only while the loading-screen panel is on, see section 3). When a game loads, the app may ask our service for the current Ranked Solo/Duo entry of up to ten players in that match, including you, once per player, using the Riot ID the League client shows. Players who hide their name in-game (streamer mode, hidden or masked names) and bots are never looked up. For each answer the service stores a dated observation — tier, division, league points, wins and losses, and the time it was observed — under a keyed-HMAC pseudonym of the account, and next to it that player’s public Riot ID (game name and tag) exactly as Riot’s own account service returned it, with the time it was last seen. The Riot ID is a label, not the key: a renamed player keeps one history and the newer name replaces the old one; previous names are not kept. A name is never invented — if Riot returns none, the observation is stored without a name. We keep these observations to build rank and LP history for rank and lobby insights (legal basis: our legitimate interest in accurate rank information); the dated ranks also feed the anonymous rank statistics above, and the names are not currently shown to other users. They are deleted after 90 days by the same daily job as every dated rank observation, and the stored name is deleted with them. Since 6 October 2026 the app sends the visible players of one loading screen in a single request, and the service answers each of them from its stored copy first: the latest answer for that Riot ID is also kept in the encrypted Riot API response cache (section 4) for up to three hours, under a keyed HMAC of the region and Riot ID rather than the name itself, so another loading screen with the same player in that time is answered without asking Riot again and shows the time the rank was observed. For players on the stored apex ladder, the ladder’s own copy may answer instead. A player is asked from Riot at most once per game, and two app users in the same game share one request. Any player can ask for these records to be removed by emailing [email protected] with their Riot ID and region: the account is placed on the same opt-out list used for tracked builds (below), its stored observations and name are deleted at once, its cached loading-screen copy is replaced at once by a marker that only says “not stored”, and no new observation is stored or shown for it.
Match history from visible loading-screen players. In the current app, a successful rank lookup for a visible, named, non-bot lobby seat can register that player with the same server-side canonical Match-V5 crawler used for other tracked accounts. The desktop does not fan out Match-V5 requests for each seat. The paced server worker retrieves history through the shared Riot rate limiter; accepted match records are encrypted and handled under the retention, withdrawal and aggregate-statistics rules above. Hidden or masked names and bots are not seeded by the loading-screen flow. Cached Riot responses are reused without another Riot API request. Where the operator enables it (since 13 October 2026), such a player’s history is collected once: one request for their newest Ranked Solo/Duo matches (at most 30, from the last 60 days), queued as ordinary background work of the same crawler, never for a player on the opt-out list, and not at all when we already store 30 such matches for them; matches we already hold are not downloaded again. To do this once only, the service keeps a request record under the account’s keyed-HMAC pseudonym (its state, the crawl cycle, the number of match IDs found and the times), and the player’s PUUID, visible Riot ID and server are added to the private sampling registry so the request survives a restart; from then on the account is crawled like other registry accounts. The loading screen then shows the stored record of that player’s newest 30 matches (overall and on the picked champion) and says when collection is still running. Where champion mastery is enabled for the loading screen, the answer for that player and champion is kept in the encrypted Riot API response cache for up to six hours under a keyed HMAC, so a later game in that window does not ask Riot again.
Tracked Pro and one-trick (OTP) builds. Since 28 September 2026 the service also publishes, once a day, the most recent build that tracked players played on each champion, shown in the app’s draft screen (build sets “Pro” and “OTP”) and on the champion page. Two groups are tracked: (a) professional players taken from public sources the operator has reviewed: an official league roster, or Leaguepedia’s public player and team tables (a community wiki under CC BY-SA 3.0, read through its public API), which list active players who state a current team, or a team they left within the last year, and their Riot IDs with region and tag (a full Riot ID the page gives without a region is kept only on a platform of the player’s stated residency where Riot’s own ranked data shows that account; where the page gives a name on EUW, KR or NA without its tag, we try only the default tag Riot assigned in that region when summoner names became Riot IDs, and keep the account only if Riot’s own ranked data shows it at Master tier or above in that region); for them we store a keyed-HMAC pseudonym of the account (resolved from the public Riot ID with Riot’s own API, the PUUID and Riot ID are not stored in this list; a separate private file on our server remembers which account each listed Riot ID resolved to and when, so that an account renamed after the page was written keeps its entry while Riot still knows that account and at most 180 days after the ID last matched it; that file entry is deleted 60 days after the page stops listing the ID, and its account is removed from it at once on opt-out), the public professional handle, team and league, the validity period and the SHA-256 of the operator’s private proof note; and (b) one-trick players detected automatically from the ladder accounts we already sample, when more than half of their last 30 Ranked Solo/Duo games (at least 10, within 60 days) are on one champion. No other website or pro list is read or scraped, and a professional is linked only to the accounts that source states; no account is linked by co-play statistics or by matching similar names, and apart from the default-tag check above no tag is guessed. Each published entry holds one observed game: its date, patch, role and result, the completed items in purchase order, boots, starting items, rune page, summoner spells and skill order, plus the player’s number of games on that champion. The stored publication contains no name or identifier; names are attached when the app reads it: the professional handle for professional players, and for others their current public Riot ID only where the public player archive is enabled (otherwise the entry reads “OTP 1”, “OTP 2”…). A player who hides their name in-game is not named in the in-game overlay; lists inside the app show public Riot IDs as described above. Tracked accounts are also polled first by our match crawler (within the same Riot rate limits). The legal basis is our legitimate interest in showing how experienced players build a champion; a publication is kept for up to 7 days and the roster until the operator removes it; an entry taken from Leaguepedia is checked daily, re-confirmed with Riot and renewed weekly, and lapses 14 days after the page stops listing the player. Any player can ask to be removed (see below): the account is then placed on an opt-out list, its entries are deleted from every stored publication at once, it is no longer detected or named, and a professional entry is revoked. Player photos and team logos: the app shows a player photo or team logo from Leaguepedia or the official LoL Esports API, matching the reviewed public professional handle and team; each stored image records its actual source. Once a week our server reads the reviewed source through its public API and keeps a small thumbnail (at most 96 pixels wide) with its source and checksum. Leaguepedia reads require the operator’s authenticated bot session; an unavailable source does not trigger an anonymous retry. When a photo cannot be verified or downloaded, the app uses a monogram. A thumbnail is deleted the week after Leaguepedia no longer lists the player with that team, and a removed or opted-out player’s entries are never shown, so their photo is not shown either. Image rights belong to their respective owners; a Leaguepedia image retains its file-page attribution.
Roster evidence and name updates (3 October 2026). The private roster audit also records whether an account tag was explicitly declared, completed with a regional default, or unknown; the source reference, revision, observation date, license reference, review status and source person identifier when available. These fields remain unknown for older records unless separately reviewed. Riot account checks can refresh a tracked account’s name; the private sampling registry keeps at most 20 previous names and the last verification time. A name change does not establish who owns the account. Audit records remain until the operator changes or removes them; rename backups are private and are not individually erased automatically.
Streamer match videos. When the operator enables it, the service also indexes games that streamers played while broadcasting on Twitch, so the app can link a matchup (for example “Jinx against Caitlyn”) to the moment that game starts in the streamer’s public past broadcast. The roster is written by hand by the operator: a Twitch channel and the Riot accounts the streamer has declared publicly (on their channel, in a stream command, or on a public page such as Leaguepedia that the operator reviewed). No account is ever linked to a streamer by guessing, co-play statistics, stream titles, chat or screen reading. For each channel we store the Twitch login, user id and display name, the stream delay the operator calibrated, and the source of each account link with the SHA-256 of the operator’s private proof note; accounts are stored only as the keyed-HMAC pseudonym used by our match store (the PUUID and Riot ID are not kept in this list). From Twitch’s public API we read whether the channel is live and the list of its past broadcasts (video id, start time, length and muted parts; never the video, chat or viewers). For each game of a declared account we store the champion, role, lane opponent’s champion, result, K/D/A, patch, start time and the position inside the video. Where our canonical match summary and timeline provide evidence, the index also stores the same game’s observed item purchase order, starting items, boots, rune page, summoner spells, skill order and measured event timestamps. These facts are never filled from another player or game. The Twitch player loads only after you choose a video or a moment; loading it connects your browser or app directly to Twitch, which receives normal connection information such as your IP address and the embedding hostname and applies its own privacy policy. Opening a video externally likewise connects you to Twitch. The app shows only the Twitch channel, the video link and those game facts; no Riot ID, match id or account pseudonym is sent to the app. While a listed streamer is live in League of Legends, their accounts are read sooner by our match crawler (within the same Riot rate limits). The legal basis is our legitimate interest in letting players learn a matchup from public broadcasts. Index rows of a video that Twitch no longer lists are deleted 7 days after it disappears, and “no video found” decisions after 90 days. A streamer can ask to be removed (see below): the channel stops being shown at once, its index rows are deleted, and an account opt-out also removes that account’s link and rows.
Your requests. Whether or not you use CarryForge, you can email [email protected] to object to this processing. We can then stop sampling your account, withdraw the matches you appear in from published statistics and the public player archive, and delete your dated rank observations and stored Riot ID. Encrypted match records and backups are not individually erased at present; see section 10.
An older interim sample, still used where the store above is not available, removes direct player identifiers before disk storage, is capped per server and patch, and expires after 30 days by default (the server permits a 1–90 day setting).
5. Data kept on your device
The app keeps its data in its Windows user-data folder: preferences (language, theme, sounds, updates, draft and post-game choices), overlay and recording settings, the remembered League accounts described in section 3, cached copies of statistics tables and Riot’s public game data, a post-game session log (summaries of your games of the last three days and the latest full report, which lists the Riot IDs and PUUIDs of that game’s players as the League client reports them) and cached copies of matches you opened (Riot’s match records, which contain all ten players’ Riot IDs and PUUIDs). These files stay on your PC until you clear the app’s data or uninstall; the match cache currently has no automatic clean-up. Diagnostic logs are described in section 7b.
Local recording is off by default and starts only after you enable it and accept its consent text; adding microphone or system audio needs its own consent. When enabled, the Windows app captures video of the verified League of Legends.exe game window and the audio rendered by that game process (process-scoped loopback, which needs Windows build 20348 or newer); that audio can include in-game voice chat. There is no silent fallback to another audio source. Captured pixels can include anything League displays, including chat and visible player names. You can keep clips, whole games or both; a whole game is kept until its clips are made, for 1 or 7 days, or until you delete it, and favourites are kept. A disk budget (20 GiB by default) limits the folder. Recordings and clips are never uploaded to CarryForge or anywhere else.
The app does not collect keystrokes, read game or process memory, or inspect network packets. Screen capture happens only through local recording and, if you choose it, the one screenshot of the CarryForge window in a bug report (section 7b).
Earlier versions (0.1.x): local and server match archives
Versions before 0.2 kept a local match archive, LP log, suggestion log, death-review notes and achievements in %LOCALAPPDATA%\CarryForge, and a server-connected build could store a private match archive under a CarryForge account. The current app does not create or upload these. Local copies stay until you delete that folder; for a server archive created by an earlier build, email [email protected] to have it deleted.
5b. Earlier account features (versions 0.1.x)
The current account and sign-in are described in section 3; the current app offers none of the features below (custom sets, linked Riot accounts, skin sync, server LP history, Duo Finder). If you created an account or used them in an earlier version, you can ask for the account and everything stored under it to be deleted by email at [email protected]; include your username. The rest of this section describes what that account stores.
The account is optional. Local custom sets and curated sets do not require an account. The server-connected private match archive requires sign-in and current personal-storage permission.
What an account itself stores. A username you choose, a display name, and a password that is never stored in readable form — only a salted scrypt digest. Session tokens are stored as SHA-256 digests, not in the clear, and expire after 30 days or when you sign out. We do not ask for or store an email address, so account recovery by email is not available.
Nothing personal is stored until you say yes, separately. Creating an account is not consent to store your data. The app shows a separate permission screen listing exactly what would be stored, with an unchecked box you must tick yourself. Until that permission is recorded on the server, every personal endpoint refuses the request and writes nothing.
What is stored once you give permission:
- The custom item sets and rune pages you build (item and rune identifiers only).
- For each Riot account you choose to link — at most ten — its PUUID, game name, tag line, region and the time it was linked. Since 29 September 2026 an account is linked only after you prove you own it in the League client: on your click, CarryForge temporarily changes your profile icon to a free starter icon, our server reads that account’s public profile icon from Riot, and your original icon is restored immediately. The challenge (Riot account identifier, region and the requested icon) is kept only in server memory for at most 5 minutes; after a successful verification only the linked account is stored, as above. Typing a Riot ID alone no longer links an account.
- Server LP history (earlier versions only): after each Ranked Solo/Duo game you finish, the app asks our service once to read the current Ranked Solo/Duo entry of your linked account from Riot. The service stores that answer as a dated observation — tier, division, league points, wins and losses — under a keyed-HMAC pseudonym of the account, not under your CarryForge account. It is shown back to you as the LP chart on Home and Profile (“server-recorded, last 30 days”), is not polled in the background and is kept for 90 days, after which a daily job deletes it. The same observation table also receives the answers our ladder sampling reads (section 4), so an account on a sampled ladder has observations whether or not it is linked. The service additionally keeps a private file copy of each such League-V4 answer, filed under a one-way digest of the account and region, which is used only to tell the rank of a sampled match and is likewise kept for 90 days, after which it is deleted automatically.
- If you switch on skin sync, the numeric identifiers of skins your League account owns. Skin names are resolved on your device, not stored on the server.
- Duo Finder listing (since 1 October 2026; only in builds that offer the account screen and only once the operator switches the feature on). Nothing is listed unless you open the Duo Finder, tick its own, separate unchecked box and press “Publish listing”. The listing is built on one of your linked Riot accounts whose ownership was verified with the profile icon check. It stores: that account’s PUUID (to tie the listing to the linked account; it is never shown to anyone), its Riot ID and region, its Ranked Solo/Duo tier, division and league points as our service read them from Riot (never as your device reports them), the roles you play and want your partner to play, up to five champions per role, the queues and languages you choose, your rank range, an optional “playing now” flag that switches itself off after 2 hours, the players you chose to hide, and the times the listing was created and last refreshed. There is no free-text field and no chat. Who sees it: only other signed-in CarryForge users who have a visible listing of their own and fit you (same region, a shared queue and language, roles that do not clash, both rank ranges) see your Riot ID, region, rank, roles, champion pool, shared queues and languages and the “playing now” flag. Your CarryForge username, PUUID and match history are not shown. Hiding a player works both ways: neither of you sees the other any more. Contact happens outside CarryForge, through a friend request in the League client; CarryForge never sends one. Legal basis: your consent, which you can withdraw at any time. Retention: a listing that is not refreshed for 14 days stops being shown and is deleted from the server after 30 days; removing the listing, withdrawing the account permission below or unlinking its Riot account deletes it immediately. The Duo Finder permission is versioned separately (version 1); if its text changes, the listing stops being shown until you agree again.
What is never stored under your account: your local match archive, your League Client credentials, an email address, an IP-based profile, or any advertising identifier. Community statistics remain anonymous and are not linked to your account; the server rejects any anonymous row that carries a PUUID or other identifier.
Permission is versioned and withdrawable. If this text changes materially the permission version changes and you are asked again, because you cannot be said to have agreed to text you never saw. Withdrawing permission in versions that offer the account screen (Account → “Withdraw permission and delete my data”), or asking us by email, deletes your custom sets, linked Riot accounts, skin collection and any Duo Finder listing from the server immediately. Removing the linked accounts also removes the only record connecting your CarryForge account to their LP observations: the observations themselves are keyed by the account pseudonym, are not linked to you afterwards and are deleted when they reach 90 days. If you want them removed sooner, email us with the Riot ID. Records on your own device are not touched by that action; deleting those is a separate button in Settings. This permission text is version 2 (29 September 2026, adding server LP history); a permission given to version 1 is no longer valid and you are asked again.
Roles. Ordinary accounts can read and write only their own data. An elevated “developer” role, used to publish the server-wide curated sets, cannot be requested or granted through the app or any network endpoint; it is set directly on the server by the operator.
6. Optional sharing and cloud backup (earlier versions)
The current app sends no community tallies, preference backups or usage statistics. The descriptions below explain what earlier versions sent and how that data is kept.
Anonymous community build tallies (on by default in those versions). In those versions this feature was enabled by default because the recommendation quality every user receives depends on the size of a shared, mutual pool. You can disable it at any moment with “Contribute anonymous community data” in Settings, and disabling it stops all future contributions immediately. While it is enabled, the app sends identity-free build records derived from your local match archive: champion name, role, game patch, queue type, the full rune page (trees, selected runes, stat shards), the first three completed legendary items, the boots, the skill-max order, and whether the game was won. A record is sent for every player in the match, not only for you — this is what makes the aggregate large enough to be useful, and it is exactly the same identity-free shape in both cases. The same setting also contributes one team-composition record per match — the champion names of the winning five and the losing five, each with the lane that champion played (top, jungle, mid, bot or support), plus patch and queue — which is what duo-synergy ratings and lane-matchup win rates are computed from. The lane is a property of the match, not of a person: it is what makes it possible to tell which two of the ten champions actually faced each other, and without it a “lane matchup” figure would be guesswork. It contains no player identifier of any kind and no match id; the pairs themselves are derived on the server. No PUUID, Riot ID, summoner name, match ID or any other identifier is included, and the server additionally rejects any record that carries an identity field. These records are merged into aggregate build statistics served to all users; champions with fewer than 20 contributed games are not served at all. Because records are anonymous by construction, they cannot be attributed back to you afterwards and therefore cannot be individually retrieved or deleted; turning the toggle off stops all future contributions immediately.
Cloud backup of app preferences (opt-in). If you enable “Cloud sync” in Settings, the app can back up your application preferences (region, recommendation profile and weighting, HUD and overlay settings) and your starred champion pool to CarryForge servers, and restore them on demand. The backup is keyed to a random installation identifier generated on first run — not to your Riot account. It never contains your PUUID, linked Riot accounts, match archive, learned build history or any match data, and the server rejects payloads carrying such fields. Backups are kept until overwritten by a newer backup; you can request deletion at [email protected] (include the wish to delete cloud preferences; no account details are needed because none are stored).
Anonymous usage statistics (opt-in). If you enable “Send anonymous usage data” in Settings, the app reports which of its screens you open and for how long, plus error category codes from a fixed list (for example “stats service unavailable”). Screen names come from a fixed allowlist; free-form text, error messages, champion names and identifiers are never sent, and the server drops anything outside the allowlist. Events are merged into day-level totals that are not stored per user or per installation, so they cannot be attributed to you. Turning the toggle off stops reporting and discards any queued events.
7. League Client actions and Live Client Data
The app writes to the League Client only on your click: a ban, a pick with lock-in on your own turn, and the rune page, item set and summoner spells you choose. A separate Settings option, off by default, writes the chosen build once after you have locked a champion in a Summoner’s Rift 5v5 lobby; it never picks, bans or locks a champion. Overlays are separate windows that read Riot’s Live Client Data on your PC and remain read-only; their positions and choices are stored locally.
7b. Bug reports and diagnostic logs
Local logs. The app writes diagnostic logs to its data folder. The main app and window logs (at most 25 MB and 3 MB) are encrypted on your PC to a key that only CarryForge holds, so they cannot be read on the PC. Smaller recording and sign-in logs are kept as plain text without credentials. Logs never leave your PC on their own.
Sending a report. Only when you open the report dialog and press send does the app upload a report to our service: a category, your description, the app version and Windows version, optionally one screenshot of the CarryForge window taken when the dialog opened, and, if “diagnostic logs” stays ticked, a diagnostics bundle: system details (Windows, graphics card and driver, displays, League install folder, recording capabilities), a summary of your app settings, recent warnings and errors, the newest app logs, the end of the recording and sign-in logs, and copies of League’s own log files of your last three games (r3dlog, netlog, netstats). Before sending, the app removes tokens, passwords, cookies, API keys, League Client credentials, email addresses, query strings and your Windows user name from paths; PUUIDs and other players’ Riot IDs are replaced by keyed hashes, while your own Riot ID stays readable. The bundle is compressed and encrypted on your PC (RSA-3072 and AES-256-GCM) to a key the PC does not hold; the description and screenshot travel over HTTPS and are sealed with the same kind of encryption, together with your account id, before they are stored. Reports are limited in size (8 MiB) and number.
Who reads them and how long they are kept. Only the operator can decrypt reports, to fix the problem described. Reports are deleted automatically 180 days after they arrive; you can ask for an earlier deletion of your report by email at [email protected].
8. Service security and rate limiting
The service uses HTTPS, a server-side Riot API key, origin restrictions, bearer access controls and short-lived per-IP rate-limit state. Riot API keys are never included in the desktop binary. Stored match records are encrypted at rest, player pseudonyms are computed with a secret key held only on the server, and server backups are encrypted to a key that is not kept on the server. Operational logs may be reviewed only for security, reliability and abuse prevention.
9. Recipients and international processing
Data is processed only as needed by the following categories of recipient: Riot Games for Riot API requests, the cloud host and Cloudflare for delivery, security and encrypted object storage, our email provider (Resend) for account emails, and, when the app loads game images, Riot’s Data Dragon CDN and the Community Dragon CDN, which receive standard connection information. When a champion page shows a streamer video, the embedded Twitch player connects to Twitch, as described in section 4. These providers may process data in other countries under their own terms and safeguards.
10. Retention and deletion
- Local app data (settings, remembered accounts, table and match caches, post-game log, logs): until you clear the app’s data or uninstall; the post-game log keeps the last three days.
- Local recordings: in the app’s media folder until you delete them or the retention and disk budget you chose remove them; favourites are not removed automatically. Uninstalling may not remove this folder. Nothing is uploaded.
- Account and sessions: until you ask us to delete the account; sessions expire after 30 days without renewal; unverified registrations after 7 days.
- Bug reports: deleted automatically 180 days after they arrive, or earlier on request.
- Earlier local archives (0.1.x): on your device until you delete them; not stored on CarryForge servers.
- Server memory caches: match and timeline responses up to 24 hours, other personal responses up to 30 minutes; cleared when the service restarts.
- Server-side match store (section 4): raw timeline data is deleted once it is at least 14 days old and its analytics projection is stored. Dated ranked observations (ranked tier lookups, the server LP history of section 5b and the loading-screen rank observations of other players described in section 4) are kept for 90 days and deleted by a daily job, together with the last seen Riot ID stored beside them; the private file copy of League-V4 answers described in section 5b is also kept for 90 days and deleted automatically. Other match records, derived rows, the pseudonymous index and the sampling registry have no automatic deletion period yet. Tracked Pro/OTP build publications are kept for up to 7 days (older ones are deleted daily); the professional roster and the opt-out list stay until the operator changes them. Streamer video index rows are deleted 7 days after Twitch stops listing the video and “no video found” decisions after 90 days; the streamer roster stays until the operator removes a channel. Stored player data (section 4, where enabled) expires after 7 days; the linked-account list drops an account after 30 days without a read or at the next daily check once it is on the opt-out list. The stored apex ladder keeps only the latest list of each region, queue and tier; a stored Riot ID is deleted as soon as its account no longer appears on any stored list of that region, and when the operator switches the feature off the stored lists and names are deleted. On request we stop sampling an account and withdraw its matches from published statistics, but encrypted match records are not individually erased at present. This policy will be updated when further retention periods are introduced.
- Published aggregate statistics: tier lists, builds and champion pages contain no personal data; Cloudflare may cache a copy for up to 20 minutes, so a withdrawal from published statistics reaches every copy within that time.
- Encrypted server backups: stored in Cloudflare R2 (European Union bucket, encrypted, no public access) and kept for a limited rotation, after which older copies are deleted automatically.
- Interim sanitised match samples: 30 days by default, never more than the configured 90-day maximum.
- Per-IP rate-limit state: short-lived in memory and removed after inactivity or a service restart.
- Anonymous community build tallies (earlier versions): retained as anonymous aggregate rows; not attributable, so not individually deletable. The current app sends none.
- Cloud preference backups (earlier versions): until overwritten by a newer backup or deleted on request.
- Anonymous usage statistics (earlier versions): day-level totals only; no per-user records exist.
- Infrastructure/security logs: according to operational need and hosting-provider controls.
Server-side account data is kept until you withdraw permission or ask for the account to be removed; withdrawing permission, or asking us by email, deletes your stored custom sets, linked Riot accounts and skin collection right away; LP observations of formerly linked accounts are no longer connected to you and expire after 90 days (section 5b). Ownership-verification challenges live only in server memory and expire after 5 minutes. A Duo Finder listing stops being shown after 14 days without a refresh and is deleted after 30 days, or at once when you remove it, withdraw permission or unlink its Riot account (section 5b). Unlinking removes the account link from your device; it does not call Riot to delete Riot’s own records. For access, correction or deletion questions about data controlled by CarryForge, email [email protected] with enough information to identify the request. Identity may need to be verified before a request is completed.
11. Legal basis and your choices
Where data-protection law applies, optional Riot ID processing is based on your request/consent and providing the feature; security and aggregate service operation, including the server-side match store in section 4, rely on legitimate interests in running a safe, useful product; players who do not use CarryForge can object as described in section 4. You can keep local recording disabled, delete recordings and clips, turn off HUD modules and post-lock sync, or stop using the app; the loading-screen panel and diagnostic logs in bug reports are optional, and the current app sends none of the data described in section 6. Depending on your location, you may have rights to access, correct, erase, restrict or object to processing, and to complain to a regulator.
12. Children and changes
CarryForge is not directed to children under 13 and does not knowingly collect personal data from them. This policy will be updated before any materially different processing starts; the date above shows the current version.
13. Riot Games
Riot’s own privacy notice applies to data Riot controls: Riot Games Privacy Notice.
