Privacy Policy for Ninehole
Ninehole ("the game") is developed and published by Machinaut Studios LLC ("we", "us"). This policy explains what data the game handles. The short version: we collect nothing, we run no server, and there is no account to make. There is no analytics, no crash reporter, no advertising and no in-app purchase code in the build. Your name, your avatar, your settings, your lifetime stats and the table you are in the middle of are written to your own device and stay there. A solo game against bots and a table played over your own Wi-Fi send nothing past your own network. Online play is the one exception, it is off until you choose it, and the section below says exactly what it sends, to whom, and what it still does not send.
Information we collect
None. We operate no server for Ninehole and we receive nothing from it. There is no analytics SDK, no crash-reporting SDK, no advertising SDK and no attribution SDK in the build. There is no account to create and no sign-up: we never ask for your name, email address, phone number, contacts or anything else. We build no profile of you, we have nothing to sell, rent or trade, and we hold no record that you exist. The name and avatar you pick are for the other players at your table to see; they are not sent to us, because there is no us to send them to.
What the game stores, and where
Everything Ninehole remembers is written to your device's own private app storage and stays there. It is kept under three keys:
- Your settings and your identity (
nh.settings) — the display name you typed (up to 16 characters, and blank until you type one), which of the twelve avatars you picked, sound, haptics, reduce motion, whether card values are shown, which card drawing you prefer, the last room name you used, and a random player id. That id is sixteen hexadecimal characters drawn from your device's cryptographic random source on first run. It is not a device identifier, an advertising identifier or anything derived from your hardware, your account or your name — it exists so that a host can recognise you if your phone drops off the table mid-hand and comes back. - Your lifetime stats (
nh.stats) — games and holes played, games won, your best and worst hole, best game, lines cleared, times you knocked, times that knock cost you 50, total points, and the largest table you have sat at. Numbers only, and there is a "Reset stats" button in Settings. - The table in progress (
nh.table) — so that closing the game mid-hole and coming back does not lose the hole: the room name, the rules in play, whether you are hosting, the seats, the shoe, the bot count, and (for a table you joined) the host's address or join code so the game can redial it.
On iOS, iPadOS, Android, macOS and Windows these live in the ordinary per-app storage the platform gives every app. None of it is uploaded, backed up to us, or synced between your devices — we have nowhere to sync it to, and no copy of it exists anywhere but on the device that wrote it. To erase it, see Deleting your data.
The game also writes diagnostic lines to your platform's ordinary developer console while it runs. Those lines are not saved to a file and are not sent anywhere; they exist for a developer with the device in hand, and they disappear when the app closes.
Permissions
Ninehole is a multiplayer card game, so it needs networking, and networking is the whole permission story. It asks for no camera, no microphone, no location, no contacts, no photo library, no files of yours and no notifications, and it uses no advertising identifier.
- Android — the shipping manifest declares exactly four permissions:
INTERNET,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATEandCHANGE_WIFI_MULTICAST_STATE. All four are normal install-time permissions, so none of them shows you a prompt. They are what lets the host open a table on your network, advertise it so other phones can find it, and keep Android from dropping those announcements while the screen is on battery. There is nothing else in the manifest but a package-visibilityqueriesblock for the system "process text" action, which the Flutter engine includes as standard; it is not a permission and grants access to nothing. - iOS / iPadOS — the only usage string in the app's
Info.plistis the local-network one, and it reads: "Ninehole finds and joins card tables hosted by other players on your local network." That is the one-time prompt iOS shows you the first time you host or look for a table. No other usage description is declared, so there is nothing else iOS can prompt you for. The app also declares that it uses no non-exempt encryption. - macOS — the release build runs inside the App Sandbox and declares exactly two capabilities beyond it: outgoing network connections and incoming ones. Those are what let a sandboxed Mac join a table and host one. There is no camera, microphone, location, contacts or file-access entitlement.
- Windows — the desktop build requests nothing beyond its own network sockets and its own settings folder.
Development builds of any Flutter app carry extra permissions so the tooling can hot-reload over a cable. Those debug and profile builds are never distributed; the release manifest that goes to Google Play is the four-permission one described above.
Playing solo, and playing on the same Wi-Fi
Play vs bots uses no network at all. The whole game — deck, rules, opponents — runs on the device in your hand.
A Same Wi-Fi table stays on your own network and does not touch the internet. One device hosts: it listens on a TCP port and announces the room by UDP broadcast about once a second, so the other devices on the same network can list it without anyone typing an address. The announcement carries the room name the host typed (up to twenty characters), the host's chosen display name, the host's random player id described above, the port, how many seats are taken, how many there are, whether the hole has started, and a protocol version. Once a player joins, what travels between the devices is the game: names, avatars, moves, the six built-in emotes, and each seat's own view of the table. It goes to the other players' devices and to nothing else. It does not pass through us, and it does not leave your network.
One device holds the only true state of the game and sends every other seat a copy with the face-down cards blanked out before it is sent. A face-down card is not "hidden by the interface" — the value is simply not in the message. Nobody at the table, the host included, is sent a card they are not entitled to see.
Online play, and exactly what reaches Epic
Playing across the internet is the one part of Ninehole that involves a company other than the store you bought it from, and it is opt-in twice over.
- The build has to carry Epic Online Services credentials, which are supplied at build time and are not in the source. A build without them cannot offer online play at all; the Online option is greyed out and says so.
- You have to switch the table from Same Wi-Fi to Online on the Host or Join screen. Wi-Fi is what is selected when you get there.
If you never do that, the game never contacts Epic. It does not check in, does not log in in the background, and does not even load Epic's library — that happens the first time an online table is opened or searched for, and not before.
When you do choose Online, this is the complete list of what happens:
- An anonymous, per-device sign-in. The game asks Epic for a Device ID credential and logs in with it. There is no Epic account, no email, no password, no web page and no prompt — nothing for you to sign up for and nothing for you to remember. Two values go with that request: a coarse device model, which is literally the name of your operating system ("ios", "android", "macos" or "windows") and nothing more specific; and a display name, which is hard-coded to the word "Player" rather than anything you typed. Epic returns an anonymous per-device id, and Epic's SDK stores the credential in your device's own local credential store. If that store is reset the credential is gone and cannot be recovered, which is the trade for having no account.
- Hosting publishes a room record to Epic. While your table is open, Epic holds a lobby record for it so other players can find it. It carries the six-character join code, a protocol version, a listed flag, the room name you typed, the display name you typed in Settings, the random player id described above, how many seats are taken, the maximum, and whether the hole has started. Anyone running a compatible build who searches can see those fields. If you would rather not publish a name, change it in Settings before you host — the field is yours and the game does not require it.
- Joining searches Epic's lobbies for that code, or lists the rooms of the same protocol version. That search, and the room list it fills, is a request to Epic.
- The game's packets travel over an Epic peer connection between the players' devices. They are the same messages the Wi-Fi game sends — names, avatars, moves, emotes, and each seat's masked view of the table. Epic's job is to get the two devices talking and, where a direct connection cannot be established, to relay the bytes between them. Epic is a US company and operates that service on its own infrastructure and under its own policies; see the Epic Games privacy policy.
And this is what does not happen, even then:
- The game is still yours. The host's device holds the only true state, runs every rule, and masks every other seat exactly as it does on Wi-Fi. Epic carries bytes and lists rooms. It does not hold the deck, decide a turn, or see a face-down card.
- There is still no account — nothing to create, nothing to sign into, nothing to delete, and no way to link one table to another except by the anonymous per-device identity Epic issued.
- We still receive nothing. There is no Ninehole server, no database and no telemetry of ours anywhere in the picture. Nothing about your game reaches Machinaut Studios, online or otherwise.
- There is no chat. The only things a player can put in front of another player are six fixed emotes, a display name of at most sixteen characters, and — if they are the host — a room name of at most twenty. There is no message box, no voice, no images and no friends list; those two names are the only text anyone types, and the room name of a listed online table is published to Epic's room list along with the host's display name.
Purchases
Ninehole is a premium game: one flat price, no ads, no in-app purchases, no subscription and no currency of any kind. There is nothing to buy inside the game, which is why the build contains no billing or in-app-purchase library at all and why "restore purchases" does not exist. Your purchase of the game itself is processed entirely by the store you bought it from — Apple's App Store or Google Play. We do not receive or store your payment details, card information or billing address; what reaches us is an aggregate sales figure, never anything about an individual buyer. Those stores handle your purchase under their own policies: Apple and Google.
Data sharing
We do not sell, rent or trade your data, and we have none to share. No third party receives anything from a solo game or a same-Wi-Fi table, because those send nothing off your network. The only third parties in the picture at all are the store that distributes Ninehole and processes its purchase, and — only if you choose an online table — Epic Online Services, for the room discovery and packet carriage described above.
Children's privacy
Ninehole is a card game with no gambling, no advertising, no accounts and no chat: the only things one player can put in front of another are six fixed emotes, a display name capped at sixteen characters and, from the host, a room name capped at twenty. We do not knowingly collect personal information from anyone, children included — we collect none from anybody, and there is no advertising identifier in use. A display name is typed by the person playing, so if a child is playing on a shared device it is worth picking a display name that is not their real one — particularly before hosting an online table, where that name and the room name go into Epic's room list for other players to read. Solo and same-Wi-Fi play publish nothing anywhere.
Your choices
- Play solo or on your own Wi-Fi and nothing leaves the building. That is the default, on every screen, every time.
- Leave the name field blank or type any name you like; the game shows "Player" if you leave it empty, and it is editable in Settings whenever you want. The room name you host under is the other thing anyone reads, so name a listed online table with that in mind.
- Never choose Online, and the game never contacts Epic — it does not even load Epic's library.
- Reset your lifetime stats from Settings, with a confirmation, at any time.
- Erase everything the game saved, with no request to file and nobody to ask — see below.
- Delete the app, which removes everything it stored along with it.
Deleting your data
Every piece of Ninehole data lives on your device, so you delete it yourself and it is gone for good. There is no account for us to close, no copy on a server, no backup of ours, and no request to file with us — we could not delete your data if you asked, because we never had it. To erase it:
- 1. Android — open Settings → Apps → Ninehole → Storage and tap Clear storage. Your name, avatar, settings, lifetime stats and any saved table are erased; the app stays installed and starts as if new.
- 2. Android — or touch and hold the Ninehole icon and choose Uninstall. The app and all of its data go together.
- 3. iOS / iPadOS — touch and hold the Ninehole icon, tap Remove App, then Delete App. This removes the app along with everything it stored. (Choosing Offload App instead deliberately keeps the data for when you reinstall.)
- 4. macOS — quit the game, then drag Ninehole from your Applications folder to the Trash and delete the folder ~/Library/
Containers/ com.machinautstudios. ninehole (in Finder, use Go → Go to Folder… and paste that path). The app is sandboxed, so everything it saved is inside that one container. - 5. Windows — quit the game, then delete the Machinaut Studios LLC\
Ninehole folder inside %APPDATA% (paste %APPDATA% into the File Explorer address bar to get there). Uninstalling the game does not remove that folder; deleting it does. - 6. If you played online — removing the app removes the game's own data, including anything it kept about an online table. The anonymous device credential belongs to Epic's SDK rather than to us, and any record Epic keeps of it is governed by the Epic Games privacy policy; Epic is who to ask about it, and there is no name, email or account attached to it in the first place. A room record disappears from Epic's lobby list when the table closes.
- 7. Any platform — that is the entire procedure. Nothing about you exists on any machine of ours, so there is nothing left to request, revoke, export or wait on.
Your purchase is the one thing this does not erase, and it is not ours to erase: the record of what you bought is held by Apple or Google. Deleting the game does not refund or cancel it, and reinstalling from the same store account gives you the game back — without your old stats, which are gone.
Changes to this policy
We may update this policy from time to time. Material changes will be reflected by updating the "Last updated" date above. If Ninehole ever gained a feature that sent something new anywhere, this page would say so before that version shipped.
Contact
Questions about this policy can be sent to info@machinautstudios.com.