Privacy policy
Last updated: 27 October 2026
1. Controller
CodeCraft, Matthias Steins, Stationsweg 69, 41068 Mönchengladbach, Germany
Email: support@codecraftcom.de
2. In short
- Felt Club has no user account, no email sign-up, no ads, no tracking and no analytics or crash-reporting services.
- Offline, everything stays on your device.
- On Wi-Fi and in a hotspot, the game runs on the host’s device; nothing goes to the internet.
- The statistics (who played with you, which place) as well as skill rating, achievements, the daily game and the weekly house rule exist only on your device; you can export or delete them.
- Online, the game runs through Google Firebase. A name, an avatar (a number for emblem and colour, not an image), a random identifier and the game state are stored there and deleted after fixed periods.
- Purchases go through Apple or Google; to verify purchases and subscriptions we use RevenueCat (USA) as a processor (see 8). Online hours are counted per purchase, not per person.
3. Offline mode
Matches against bots, your profile (name, avatar), settings and a saved game exist only in your device’s storage. They are not transmitted. Deleting the app or its data removes them.
The avatar is not a picture or photo but a number that selects an emblem and a colour. There is no image upload.
The solo features also stay entirely on your device: skill rating (your score against the computer), “Same cards again” (the starting value of the deal is kept with the saved game in protected storage and deleted with it), the weekly house rule, the daily game (the deal derives from the date alone, nothing is synchronised), achievements, titles and history. There is no server, no identifier and no analytics for them. An export happens only if you share it yourself.
4. Local statistics (all modes)
If you like, Felt Club keeps a private record: who played in a room with you and which place each round ended in (for Hold’em also hands won and biggest pot).
- Only on your device. The record is a file in the app’s storage. It is not uploaded, neither to us nor to Google nor to anyone else.
- Player key. The app creates a random key for your device once. It is tied to no account and is not a device or advertising identifier. When you join a room (Wi-Fi and online) it goes to the other players in the room so that their records recognise you in the next round; they keep it only on their devices, together with the name you used in the room. In an online room it is also held by Firebase for the life of the room (deletion periods see 6.6).
- Bot help. Rounds in which a bot played for you (turn timeout or “Back soon”, online also after the app went to the background) do not count for you. The host or the server notes that in the room.
- Export and delete. In Settings you can export the record as a file (what you do with it is up to you) or delete it completely. Deleting creates a new key; removing the app removes everything.
5. “Local Wi-Fi” mode (also hotspot)
Here the host’s device acts as the server. The same applies when the game runs in a device’s personal hotspot: it stays local and does not go to the internet. The following is processed:
- Names, avatars and moves of the participants. They go to the host’s device and from there to the other participants. The host’s device sees all cards at the table, including hidden ones; the other participants see only their own.
- The room is announced on the local network as “Felt Club <name>” (mDNS/Bonjour). Every device on the same Wi-Fi or hotspot that looks for it sees this, together with the host’s IP address and port.
- Participants and host see the IP addresses of each other’s devices on the Wi-Fi or hotspot.
- Late join: where the room allows it, a person can take over a computer seat after the start. Name, avatar and player key go to the host’s device as with joining; the same applies as above.
- Join request and removal: Tapping an announced room sends your name and avatar as a request to the host’s device; you only get a seat once the host lets you in. If the host removes someone from the room, the host’s device remembers that person’s player key so they cannot join again. This block applies to that room only and ends with it.
- The player key for the local statistics (see 4.) and the quick reactions (six fixed symbols such as applause, no free text) travel like the moves through the host’s device to the other players.
The connection between the devices is authenticated and encrypted (AES-256-GCM) with a join secret from the invitation. The join secret is not announced on the network. No server of ours and no Google service is involved. Your operating system asks for local network permission before the first access.
6. “Online” mode (Firebase)
Online rooms run on Google Firebase (Cloud Functions, Firestore, Authentication, App Check, Hosting). The data is stored in the europe-west3 (Frankfurt) region. The provider is Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Ireland, with its parent company Google LLC, USA. Google acts as our processor; Google’s data processing terms apply.
6.1 What is stored
- A random identifier (Firebase UID) from anonymous sign-in. It contains no name or email and relates to your installation.
- The player name and avatar you choose for the room. The avatar is a number (emblem and colour), not an image. Do not use your real name if you prefer not to.
- Late join: a person who wants to take over a computer seat after the start waits in the room. Name, identifier (UID), player key (optional) and the claim to the seat are stored in the room until the seat is taken over or the person leaves the room. After that it is an ordinary seat with the periods below.
- Doorway room for Wi-Fi matches: if the host plays on Wi-Fi or hotspot and has also opened an online room as an entrance for guests from outside, that room carries the flag
wifiPlaying. It then holds only lobby details (names, avatars, seat occupancy of those waiting), no game state. It is deleted after 12 hours at the latest. - First online evening free: if you own neither “Felt Club complete” nor “Felt Club Online”, you can open one online evening for free, once per device. So that the server can limit this, such trial rooms are counted per anonymous identifier for 7 days and limited to 4 hours of online time per room. In addition the app remembers on your device (locally, in protected storage or settings) that the evening has been used; this marker does not leave the device.
- Room data: game, rules, seat assignment, turn-timer settings and the game state including hidden cards and the order of the deck. Each player receives only their own view; the database rules forbid clients access to the full state.
- A seat key: a random key that lets you reclaim your seat after a reinstall. The server holds only its SHA-256 check value; your device holds the key itself in protected storage (Keychain or Keystore). It expires after 30 days.
- Player key (optional): the random key for the local statistics (see 4.). All members of the room see it next to the seats; it stays until the room is deleted.
- Quick reactions: one of six fixed reactions (no free text) with seat and time, at most one per seat and 3 seconds. It sits in the room document for a few seconds only and is overwritten by the next write.
- Presence and bot help: whether your seat is away (you chose “Back soon” or the app was in the background) and for which seats a bot played during the match. Whether rounds count in the statistics depends on it.
- Purchase status and online allowance: To know how many online hours you are entitled to, the server asks RevenueCat about your purchases and keeps the result per identifier (Firebase UID) in a cache (
accounts): which kind of purchase exists (complete, subscription, earlier purchase), purchase time, expiry time of a subscription, the store’s transaction identifier and the time of the last lookup. The server also keeps a ledger per purchase (ledgers): the online seconds used in total and per calendar month. The ledger is not tied to your identifier but to a check value (SHA-256) of the purchase’s transaction identifier, so that hours follow a purchase and not a device. Purpose: performance of the contract (providing and limiting online hours) and abuse prevention. Both records are closed to clients; only the server reads and writes them. Your app receives only your own hours display. - Cost brake and fair use: technical counters per room (number of calls, reads and writes, online time of the room) for cost control and abuse prevention. They contain no personal data and can be attributed only through the room. In case of exceptionally high use, the online time per room may be limited.
6.2 Anonymous sign-in
On the first online start the app signs in anonymously with Firebase Authentication. Google processes device data and the IP address as a technical necessity. The identifier stays in the app until you delete it (uninstall).
6.3 App Check (device attestation)
So that only genuine Felt Club apps can use the backend, Firebase App Check checks every request. On iOS this is done through Apple (App Attest or DeviceCheck), on Android through Google (Play Integrity). Technical information about the device and app is sent to and processed by Apple or Google. The result is a short-lived token; it contains no name.
6.4 Logs
Felt Club’s application logs (function name, duration, error code) contain no names, cards or identifiers. Google’s platform additionally writes request logs automatically, with the IP address, time, path and status code. By Google’s default, logs are kept for 30 days. We use them only for troubleshooting and abuse prevention.
6.5 Invitation links and this website
Invitations are links of the form https://table-kartentisch.web.app/j/<code>. If you open such a link in a browser, the address including the code is sent to Firebase Hosting, where the usual access data arises (IP address, time, requested address, browser identification). The pages load no fonts, scripts or images from third parties, set no cookies and use no analytics. The code grants access to a free seat in the room; share the link only with people who should play.
If the host also plays in the local Wi-Fi, the link additionally carries data about that room (address of the host’s device on the local network, port, join secret and rules check value as the suffix ?h=…&p=…&s=…&f=…). When opened in a browser it also reaches Firebase Hosting. The Wi-Fi secret only entitles to take a free seat in the host’s room before the game starts and to open an encrypted connection there; it gives no access to cards or the game state. Treat the link like a key to this one table.
6.6 Deletion periods
| What | Period |
|---|---|
| Room that was not started | 2 hours after the last activity |
Doorway room of a Wi-Fi match (wifiPlaying) | 12 hours at the most |
| Person waiting to join late (name, UID, claim) | until the seat is taken over or they leave, at the latest with the room |
| Trial-room counter per anonymous identifier | 7 days |
| Finished match | 7 days after the last activity |
| Running room | 30 days after the last activity at the latest |
| Host dissolves the room | immediately |
| Seat key | expires after 30 days, revoked on leaving |
Purchase-status cache (accounts) | as long as the account or purchase exists; no automatic deletion is set up. We delete it on request (see 11); it is recreated the next time you play online. |
Ledger (ledgers) | as long as the purchase exists, because it records the use of the hours; on request it can be deleted only if the entitlement to the hours lapses with it |
| Logs at Google | 30 days by default |
Deletion covers the room including its private state and all participants’ views.
6.7 Transfers to third countries
The data is stored in Frankfurt. Because Google LLC (USA) is the parent company, access from the USA, for example for support or security, cannot be ruled out. Google LLC is certified under the EU-US Data Privacy Framework; standard contractual clauses in Google’s contract terms apply in addition.
7. Sharing an invitation
“Share invitation” opens your operating system’s share sheet with the link. You decide which app to use and what it does with the link; Felt Club does not learn about it.
8. Purchases and purchase verification (RevenueCat)
There are two ways to pay: the one-time purchase “Felt Club complete” and the subscription “Felt Club Online” (monthly or yearly). Both are handled through the Apple App Store or Google Play. Only Apple or Google receive and process payment data (card, account, billing address); we do not see it. Apple’s or Google’s privacy terms apply.
To verify purchases and subscriptions we use RevenueCat, Inc. (USA) as a processor. For this, the app connects to RevenueCat at start (RevenueCat first assigns its own anonymous identifier) and, once available, registers the random identifier from the anonymous sign-in (Firebase UID) with RevenueCat. RevenueCat processes this identifier, the store’s purchase receipts and transaction data (product, time, subscription expiry, transaction identifier) and the store country or currency where the store supplies it; the IP address also arises for technical reasons. We do not give RevenueCat your player name or an email address, and RevenueCat receives no game data from us.
Our server asks RevenueCat which purchases belong to your identifier in order to calculate your online hours (see 6.1, “Purchase status and online allowance”). The app also remembers on your device, in protected storage (Keychain or Keystore), whether a purchase exists. Guests who join an online room never pay.
Because RevenueCat is based in the USA, processing there cannot be ruled out. We base the transfer on the EU Commission’s standard contractual clauses in the data processing agreement with RevenueCat.
9. What does not exist
No ads, no advertising identifier, no tracking, no analytics or crash-reporting services, no disclosure to advertisers, no sale of data, no real money and no purchases of play chips. RevenueCat serves purchase verification only, not analytics or advertising.
10. Legal bases
- Play on Wi-Fi, in a hotspot and online (Art. 6(1)(b) GDPR): the data is needed to provide the room you chose. This includes the player key, the quick reactions, the bot-help marker and late join.
- Local statistics (Art. 6(1)(a) GDPR and Section 25(2) no. 2 TDDDG): you decide to use them, export or delete them at any time; they do not leave the device.
- Anonymous sign-in, App Check, logs, rate limiting, cost counters, cost brake and the counting of trial rooms (Art. 6(1)(f) GDPR): our legitimate interest is secure, abuse-free and affordable operation.
- Purchase, purchase verification through RevenueCat, purchase-status cache and ledger (Art. 6(1)(b) GDPR): performance of the purchase or subscription contract, that is, providing the purchased online hours.
- Storing and reading on the device where necessary to provide the app (Section 25(2) no. 2 TDDDG).
11. Your rights
You have the right of access (Art. 15), rectification (Art. 16), erasure (Art. 17), restriction of processing (Art. 18), data portability (Art. 20) and to object to processing based on legitimate interests (Art. 21 GDPR). You can withdraw consent at any time with effect for the future. Write to support@codecraftcom.de.
Because online data is linked only through a random identifier, we can provide access or erasure only if you tell us the room code, or your player name and the time period. Rooms delete themselves after the periods above; the host can dissolve them immediately.
12. Right to complain
You can lodge a complaint with a data protection authority. The authority responsible for us is the State Commissioner for Data Protection and Freedom of Information of North Rhine-Westphalia (LDI NRW), Postfach 20 04 44, 40102 Düsseldorf, Germany, www.ldi.nrw.de. You can also contact the authority where you live.
13. Changes
We adapt this policy when the processing changes. The date above shows its status.