Privacy
Last updated: 19 October 2026
Turf War: Taipei is a free browser game. There are no accounts and no passwords. You play anonymously: the game knows you only by a random ID kept in your browser. The game is for players aged 13 and older; pressing Play means you accept the Terms and this Privacy Policy.
Stored in your browser
Your settings, callsign, skins (your knife's look and Militia character), key bindings, touch layout, lobby choices, the game server you chose, your level, daily goal and daily streak (XP, rounds, wins and kills counted on this device, and the last day you played), which latest update you have seen, an anonymous game ID for each game server, a random share code (see Sharing a match), how many match cards and challenges you have shared, the share code of the link that brought you (if any), how many friends your links have brought (for the gold slipper), whether you have made your first kill, whether you have played the first-visit warm-up match (on CrazyGames), the Terms version you accepted by pressing Play and your "Exclude my matches from datasets" choice, a count of how many times you have opened the game, and where you first came from (the UTM tags of the link you followed, such as utm_source=threads, and the website's name from the referrer; never the full address or any ad click ID) are saved in your browser's local storage, so the game remembers them next time. They stay on your device. The analytics service below keeps its own random ID there too.
Sharing a match
When you share a match card or a 1v1 challenge, the picture is made in your browser and goes only where you send it. Its link carries your callsign, the map, your kills in that match, the code of a private room if you opened one, a random share code kept in this browser (when you play online, the game server keeps it with your game ID; see Game server), and plain "utm" tags saying what kind of link it is and which screen it came from (for example a share card from the end screen), so we can count how many players a shared link brings. When someone opens your link, the product analytics below record that a link with that share code was opened, accepted and played to the end.
Invite friends (邀請朋友) opens a private room; its link carries only the room's code and your random share code. The LINE and Threads buttons open that app's own share page with your message and the link, and what you post there is between you and that app. The game server counts how many players arrived through your share code and entered a room, and shows you only that number (three unlock the gold slipper). When a chat app fetches a preview of a challenge or invite link, our server draws the preview picture from what the link already says (callsign, map, kills or room code); it fetches the picture's font from Google Fonts, which is sent no information about you.
Game server
Online matches run on the game server you choose in Settings: Taipei (our own SpacetimeDB server in Taiwan) or US East (SpacetimeDB Maincloud in the United States). Until you choose, a new player whose browser time zone is in the Americas, Europe or Africa starts on US East and everyone else on Taipei; the page decides this from the time zone on your device. A link to a friend's room opens on that room's server. Each server keeps its own players and stats. While you are in an online match the server also holds your skins on your soldier, so the other players see them; they go when you leave. For each anonymous game ID the server keeps:
- your callsign and your gameplay stats (kills, deaths, assists, headshots, rounds and matches played and won);
- when you first and last played, how much time you spent in online matches (in total, per day and per hour), how many sessions and on which days and hours (the hourly records are kept for two weeks), and your browser's time zone and language, which we use to estimate which countries players come from;
- your connection quality in online matches (ping and movement corrections): the round-trip time your browser measured to the server and how often the server corrected your reported movement, in total, per day and per hour, so we can see how well the server serves players in different places;
- your device type (phone, tablet or computer), as the game works it out from your browser, and how many times you connected on each, so we know what players play on;
- how smoothly the game runs for you in online matches (your typical frames per second and the slowest 1%), how long the page took to load and how long it took from pressing Play to being in a match, so we can see where the game is too slow;
- where you first came from (the same UTM source, medium and campaign, or the referring website's name, kept in your browser), whether you opened the game inside an app's built-in browser and which app, your random share code, how many match cards and challenges you have shared, and the share code of the link that brought you, so we can count how many players a share brings (the owner's dashboard shows only counts, never share codes);
- when you first entered an online room, finished a round, made a kill and finished a match, so we can see how far new players get.
- if the server removes you from a match for being away (no movement or action for 90 seconds), which room and when, so that room does not take you straight back; it is deleted within about 4 minutes.
- the Terms version you accepted by pressing Play, whether you excluded your matches from datasets (and whether that came from your setting, your browser's Global Privacy Control or Do Not Track, or CrazyGames), and when, so the match recorder knows whom it may record (see Match recording).
Your callsign and stats are public: other players see them in matches and on the in-game leaderboard. Chat messages go to the players in your room.
Before the move to Taipei, the game ran on a server in Singapore (SpacetimeDB hosted by InstaCloud) and, before that, on the US East one. The Singapore server is no longer offered: it was shut down and its data deleted on 2026-10-11. The US East server can still be chosen in Settings and keeps its data.
Match recording
We record match data (movement, aim, in-game controls and match events) and may license it, de-identified, to companies that build AI. The licensed data contains no callsign, chat or IDs. We do not try to re-identify it, and buyers must agree not to. This applies only to matches recorded from 15 October 2026. You can turn it off in Settings: "Exclude my matches from datasets".
When you play an online match on the Taipei server, we record it: every soldier's position, movement, aim, weapon, health and actions, 30 times a second, and your own in-game controls (mouse or touch movement, presses of the keys and buttons bound to the game, the effect of touch aim assist, and their timing), with your device type, game settings and connection quality (round-trip times). We do not record chat, your callsign, keys that are not game controls, or anything outside the game. We use the recordings to study the game and to train computer players (bots) that play more like people.
We keep two copies. Our internal copy is stored in Cloudflare R2 under a pseudonymous ID made from your game ID with a secret key, so we can delete it when you ask. A licensed copy is made from it and de-identified: it has no callsign, chat, game ID, IP address, share code or time zone; each player gets a new random number in each file, so files cannot be linked to each other; it keeps only the date, not the time; and it leaves out private rooms, 1v1 challenges, every match with a player in the EU, EEA, UK or Switzerland or whose region we cannot tell, and every match with a player who turned the switch on (also their earlier matches, from the next licensed copy on). We publicly commit to keep the licensed copy de-identified and not to try to re-identify it, and every buyer must sign a contract that forbids re-identification.
If you turn on "Exclude my matches from datasets", or your browser sends Global Privacy Control or Do Not Track, your later matches are in neither copy: your inputs are not logged and your soldier is blanked in the recording of the room. Matches played on CrazyGames and on the US East server are not recorded. Recordings with no usable play are deleted after 30 days; the rest are deleted 3 years after they were recorded. Licensed copies already delivered are kept under the buyer's contract.
Product analytics
We use PostHog to learn how the game is played: anonymous events such as page views, opening the lobby, starting or leaving a match, rounds, maps and modes played, vehicles used, store purchases, language changes, errors, how long the game server took to connect and your connection quality in online matches (ping and movement corrections), with your callsign, language, graphics setting, the game server you chose, your device type (phone, tablet or computer) and rounded screen size, and how you play on it: touch controls, whether the phone was held upright, whether the game was opened inside an app's built-in browser (such as Threads, Instagram, Messenger, Facebook, LINE or TikTok), how many times you have opened the game, whether your browser already had saved data for the game when the page loaded (and can save data at all), where you came from (the UTM tags of the link you followed, the referring website's name without its address, and only whether an ad click ID such as gclid or fbclid was present, never its value; the first of these is remembered in your browser and sent with every event), your touch aim assist setting, in each match your knife (slipper) kills, the bubble teas you drank and your frame rate (frames per second and the slowest 1%) with the name of your graphics card as your browser reports it (for example "Intel UHD Graphics 620", or that it draws without one) and the resolution scale the game drew at, the results of the performance check if you run it (frame rate, frame times, hitches and the same graphics card name), how long the page took to load, how long it took from pressing Play to being in a match, and your first kill ever. PostHog estimates your approximate country from the connection; we don't store IP addresses ourselves. When you play online, these events are linked to your anonymous game ID. There are no session recordings of the page. Product analytics capture no clicks or typing; match recording (below) captures your in-game controls in online matches, never chat or your callsign. If your browser sends Do Not Track or Global Privacy Control, no analytics events are sent.
Error reports include cleaned exception messages and stack traces (script URLs without query strings or fragments, function names, line and column numbers), the build version, server host, browser and operating system, in-app browser and whether a match is active. When the browser takes the game's graphics away (a lost WebGL context), the report also says how long the page had been open and in view, how long the graphics were gone, how long the first frame after took, how many times it happened on the page, your graphics setting, the resolution the game drew at and the map. When the game's files fail to load, the report also names the first file that failed (its host and path), how long the page had been open, whether it was in view or had been in the background, whether the browser said it was online and whether the offline cache (service worker) was in use. We remove known secret fields, email addresses and long identity strings from error text, and exclude callsign, room and attribution properties from error events. Error reports retain PostHog's anonymous device and session identifiers. We send at most five distinct failures and one opaque browser error per page. Early errors wait in memory until analytics starts; the same opt-out rules apply. Private source maps help us read minified stacks; they are not served with the website.
Website analytics
An optional server monitor counts panic and ERROR log lines. It can send fixed count summaries to an owner-selected webhook and keep the latest 200 summaries in a private, admin-only database view. These summaries contain no player identifiers or raw log text. Raw diagnostic logs remain on the server.
Vercel Web Analytics counts anonymous page views and visitors, without cookies.
Vercel serves the website, and Cloudflare serves the game's models, textures, sounds and fonts. Like any web host, they receive your IP address and browser details to send you the files.
Playing on CrazyGames
The game is also published on CrazyGames (crazygames.com). There, CrazyGames runs the page around the game and its own software (the CrazyGames SDK) inside it, may show video ads between matches, and handles its own accounts, ads and data under the CrazyGames privacy policy. From CrazyGames the game receives only your browser's language (to choose the game's language), CrazyGames' sound and chat settings, and, if you are logged in to CrazyGames, your CrazyGames username, which becomes your callsign and is shown to other players; we don't receive your CrazyGames account ID or email address. The game tells CrazyGames when it has loaded, when you start and stop playing, and the private room you are in with its code, so your CrazyGames friends can join you. On CrazyGames, CrazyGames' automatic progress save backs up everything the game stores in your browser (the list under "Data stored in your browser", including your callsign and anonymous game ID) and restores it when you come back; when you are logged in to CrazyGames it is kept with your CrazyGames account, so it follows you to other devices. Everything else on this page applies there too, and the product analytics events also say that you played on CrazyGames.
What we don't do
On our own website: no ads. Nowhere do we sell or share your data for advertising, and the game itself adds no third-party advertising trackers (on CrazyGames, their ads are theirs; see Playing on CrazyGames). We may license de-identified match data to companies that build AI (see Match recording).
Clearing your data
Clear this site's data in your browser to remove everything stored there, including your anonymous game ID (you start fresh with a new one). To ask for your stats and match recordings to be removed, open an issue on GitHub with your callsign and roughly when you played. Deletion covers the internal copy and every later licensed copy, within 30 days; licensed copies already delivered hold no ID, so they cannot be found or deleted. Clearing your browser's data does not delete server recordings.