privacy

Everything we know about you. It is a short list.

Last reviewed 6 September 2026. This covers touchgrass.family and the Android app you can download from it. Every number below was read out of the code that produces it, so where a rule is missing it says the rule is missing rather than rounding it up to ninety days.

who is responsible

A person is responsible. The company is still paperwork.

The law calls whoever decides what happens to your data the controller. That is not a job that waits for a registration: somebody is deciding today, which means there is a controller today. Earlier versions of this page said there was none yet. That was wrong, and it turned a real obligation into a blank line.

controller today
The individual who operates touchgrass.family
legal name and postal address
Sent by return of email, on request
contact that works today

A controller has to publish a name and a postal address, and this page prints neither yet. That is a real gap and it is not waiting on a registry — it is owed to you now. Ask at support@touchgrass.family and you get both by reply, from a person.

A company is being registered. When it exists it becomes the controller and takes this over, and its name, address and registration number appear here on the day that happens rather than the month after. Nothing about how your data is handled changes when it does — the rows further down this page are the answer either way.

One address carries every request on this page, and it is read by a person rather than a queue:

There is an @touchgrassrwa on X. It posts announcements. It is not where rights requests go, and nobody should ever send a wallet address or a document proving who they are into a public reply or a DM — we never ask for either there, we never message first, and the support page explains why anyone doing so is not us.

A rights request has a legal deadline of one month, and we would rather not use all of it. One thing has a shorter promise on it: a catch you believe was wrongly refused is looked at by a person within 72 hours. That is the same 72 hours the Legendary rules screen commits to, it is the only response deadline this product has, and inventing a second one for everything else would be a number made up on the spot.

the short version

Six sentences, then the detail.

  • Your position is read only while a catch screen is open. Never in the background — the Android app does not carry the permission, so it could not do it if we changed our minds.
  • The GPS trail you send is scored and thrown away. What survives a catch is a handful of numbers about the shape of that walk, and, only if you won something, your four most recent accepted fixes for a week.
  • There is no analytics SDK, no advertising identifier, no tracking pixel and no cookie banner, because there is nothing to put in one.
  • Nothing is sold to anybody. There would be very little to sell: we do not know your name unless you typed one in.
  • Signing in is OAuth through Google, X or Apple. We never see a password and never ask for one.
  • Your catches are transfers on a public blockchain. Those cannot be deleted, by us or by anyone. That is the wall Article 17 hits here and it has its own card below rather than a footnote.
what the website reads

On a browser. Only while you are catching.

Your precise position
Only while the catch screen at /app is open, and only after your browser has asked you. Close the tab and the reading stops.
A trail of recent fixes
At most 40 of them, each a latitude, a longitude, an accuracy in metres and a timestamp. Nothing older than three minutes counts, and the server wants at least four fixes spanning twenty seconds before it will look at a catch. That twenty seconds is the hold.
A motion figure, if the browser gives one
Two numbers: how many accelerometer samples were taken, and the standard deviation of the acceleration. Not a recording of how you moved — a measure of whether the phone was being held by a body. iOS asks first, and some in-app browsers hand back zeroes, which the server treats as one weak signal among several rather than as proof of anything.
Your timezone offset
One integer, in minutes. A clock that says Manila attached to a position that says Madrid is worth a second look.
Your IP address
Every web request carries one. It is used for the daily counters described under retention, and it is part of the key those counters live under, so it sits in the store for a day and then expires on its own.
Three headers your browser sends anyway
User-Agent, Accept-Language and sec-ch-ua-platform. Those three and the IP are hashed together into a sixteen-character device fingerprint. The hash is what gets stored and compared; it is one way, and a whole mobile carrier can collapse into a single one of them, which is a known weakness of the technique and the reason it never decides anything on its own.
What your sign-in hands us
A subject identifier, the wallet address derived for it, and — from Google — an email address and a name. They travel inside the signed identity token your browser sends with every authenticated request, so they pass through our server constantly. Only the identifier and the address are written down. The email and the name are read to check the token and go when the request ends; the copy that lasts is Privy's, not ours.
Your account, if you sign in
A handle, a display name, an avatar (a picture you pick, stored inline, 24 KB at the very most), a bio, whether your profile is private, your wallet address, and the list of what you have caught. Every one of those except the address and the history is optional, and a blank profile plays exactly the same game.
what the android app adds

Four more things. Three of them are the point.

Everything in the card above applies to the app as well — same position, same trail, same timezone, same IP, same account. These are the additions, and the first three exist because a phone can prove something a web page cannot.

The mocked flag
Android tells an app, for each fix, whether a mock-location app produced it. One boolean, per fix. A browser has no equivalent and iOS has none worth building on, which is the single biggest reason the app can accept a catch a website has to think harder about.
A real accelerometer
Read four times a second at a known rate rather than through a browser event a wrapper can stub with zeroes. The same two numbers leave the phone — a count and a standard deviation. No raw trace is ever sent.
A denser trail, foreground only
The phone delivers fixes on its own instead of being poked every three seconds, so the log is better. Leave the screen and the trail is deleted outright and rebuilt when you come back, which is why a call in the middle of a hold costs you the twenty seconds.
Which build is talking
A header reading mobile/1.0.0 (build 1) or whatever version you installed. The server ignores it today; it is sent from the first build anyway, because a client identifier added in 1.1 cannot identify 1.0.
Things that stay on the phone
Your answer to the 18-or-over and not-a-US-person questions, and a flag saying you have seen the intro. Both live in the operating system keychain and neither is ever sent anywhere. Nothing on our servers knows you answered.
what neither of them reads

The list that stays empty.

  • Background location. There is no such permission in the manifest, on either platform.
  • Your contacts, your calendar, your messages, your other apps.
  • Your microphone. The permission for it was declared by a library and cut from the manifest before the build, along with the one for drawing over other apps.
  • Your step count. A pedometer permission is declared by the sensors package and never once called.
  • Your photos, beyond the single image you choose for an avatar and crop yourself.
  • An advertising identifier, on either platform. Nothing here reads one.

The download page lists the whole Android manifest, line by line, including the permissions our own libraries tried to add and the two that were cut before the build. It is the same file this page describes.

read the manifest
why we have it, and what makes it lawful

Every field, with its reason. Article 13, out loud.

Your position at the moment you tap

Working out whether you are inside about 40 m of the drop (a little more when your fix is coarse), which is the entire game.

basisContract, Article 6(1)(b). It is the thing you asked us to do; there is no way to do it without knowing where you are.

The operating system location permission itself

Turning the sensor on at all.

basisConsent, Article 6(1)(a). The system prompt is the consent — we do not put a second dialog in front of it asking the same question, because that is theatre. A screen naming something the system never asks about, like the motion reading, is not theatre, and the app has one. Turning the permission off in Settings is how you withdraw all of it, and it takes effect immediately.

The trail, the motion figure, the timezone offset, the mocked flag

Telling a walk from a script. Five weighted tells, scored against a threshold.

basisConsent, Article 6(1)(a) — and before that, the consent the ePrivacy rules want for anything read off the device itself, which all four are. In the app they are named on the screen that asks for location, and they are asked for together: the trail, the motion reading and the timezone go with the position or they do not go at all. Turn the location permission off and all four stop, because the catch screen stops reading anything. Why we then want them is the legitimate interest in the rows below — a spoofer with a fleet of fresh wallets empties a vault other players paid for in an afternoon — but an interest is not what lets us read a sensor. Consent is. The website's version of that consent is unfinished, and the next row says so rather than hiding behind this one.

The motion figure, on the website specifically

Same job, on a browser that has no prompt for it.

basisNothing yet on the site, and that is the gap. The Android app gets this right: the screen before the location prompt says in as many words that a short trail and a motion reading are sent, because an accelerometer triggers no system prompt on Android and that screen is the only place it can be disclosed. The website has no equivalent. iOS Safari asks before a page reads acceleration; Android and desktop browsers do not ask at all, so there the only thing you were asked about is location, which is a different question. The fix is ours, not your browser's — the catch screen has to name motion and the trail before the first read, the way the app already does. Until it does, this is an admission and not a basis.

Your IP, the device hash, and the daily counters keyed on them

Stopping one machine from taking a whole day of the allowance with twenty fresh wallets.

basisLegitimate interest, Article 6(1)(f). A per-wallet cap alone is useless, because a wallet is free to make. These are keyed on things a new wallet does not reset.

An 11-metre square, derived from where the catch happened

Capping how many catches come out of one exact spot per day.

basisLegitimate interest, Article 6(1)(f). It is a coordinate rounded to four decimals, not a track, and it lasts a day.

Handle, display name, avatar, bio

Being a person on the leaderboard instead of a hex string.

basisContract, Article 6(1)(b). All four are optional and all four can be blank or cleared without leaving.

Wallet address and catch history

Paying out, showing you what you own, and stopping the same drop paying twice.

basisContract, Article 6(1)(b). The address comes out of your signed identity token, never out of a request body, which is what stops somebody claiming into your wallet or reading your history.

What your sign-in provider puts in the token

Knowing which account is asking, on every single request.

basisContract, Article 6(1)(b). Your signed identity token carries a subject identifier, the wallet derived for it, and — from Google — an email address and a display name. The server reads it to answer the only question it has, which is whether you are you. It keeps the subject and the address; the email and the name are read and dropped with the request.

The public feed of the last 30 catches

A game with an invisible leaderboard is not a game.

basisLegitimate interest, Article 6(1)(f). Addresses are truncated to six characters and four. Read the objection right below before you assume the private switch covers this — it does not, yet.

Your 18-or-over and not-a-US-person answers

Not handing a derivative to someone who must not be offered one.

basisContract, and the upstream terms we are bound by. The answer never leaves your phone today, which means it is a declaration and not yet an enforced gate. That is stated on this page because it is true, not because it is comfortable.

Legitimate interest is not a free pass, and it is not a synonym for “we felt like it”. It obliges us to keep the intrusion as small as the job allows, which is why the trail is scored and dropped instead of stored, why the fingerprint is sixteen characters of a one-way hash rather than anything that can be reversed, and why none of it decides a refusal on its own.

how long any of it lasts

Real numbers. Including the one we are missing.

the raw GPS trail
Not stored. It arrives with your tap, gets scored, and goes when the request ends. There is no table of walks.
the shape of a walk
One hour, as a 24-character hash. It exists so the same recorded log cannot win twice. You cannot get a position back out of it.
the summary of one attempt
How many fixes, over how long, how much they wobbled, the best and worst accuracy, how far you were from the drop, your timezone, the two motion numbers, 90 characters of User-Agent, 30 of Accept-Language, and the city your IP resolves to with the distance between it and you — all of it filed under your wallet address, with which drop it was and the time it happened. Kept as the last 200 refusals and the last 300 acceptances, worldwide. That is a cap on volume, not a clock: an entry falls off the end when newer ones arrive, which on a quiet week can be a while. It is the weakest retention rule on this page and it needs a real expiry it does not have.
why a catch was refused
Written every time a check past the physical ones says no: your wallet address, which drop it was, the city the drop is in, the reason, and the time. Kept as the last 300 refusals worldwide, with no clock on it at all. It exists because being told to come back in ten minutes with no record of why is not an answer, and it is the log a person reads when you contest a refusal. It has the same missing expiry as the row above.
a wallet marked as a fleet
Thirty days. If the gas for your redemptions is paid by an address that has paid for a crowd of other wallets, that address and every wallet it funded are marked, and the mark holds the funder's address, how many wallets it had paid for, and when. It is read on the claim path and it refuses you with the funder's address in the message, so it is not a secret list. It expires by itself; a walker who pays their own gas never meets it.
the email and name in your token
Not kept. They arrive in the signed token on every request, get checked, and are gone when the request ends — nothing writes them to our store. Privy holds that copy for as long as your account exists, which is a question for their policy and for the deletion page, not for this row.
your last accepted fixes
Seven days. Four of them, kept against your wallet and against your device hash, so a wallet that catches in Lyon and Lisbon eleven minutes apart is visible. Full precision, because a rounded one would not answer the question.
the daily counters
24 hours, then Redis expires them by itself. One per IP, one per device hash, one per 11-metre square, one per wallet, one per drop. The IP and the square are part of the key, so they are in the store for that day.
wallets seen from one connection
24 hours, up to twenty addresses per IP and per device hash. This is the sybil check that a new wallet does not reset.
your catch history
No expiry. The last 500 catches per wallet, and the last 200 in the shared feed. Deleting your account is what removes yours.
your profile
No expiry, deliberately. It is written with no TTL at all because it is meant to outlive every other key here. Same answer: deleting the account is what removes it.

Retention here is written as expiry times in a key-value store, not as a sentence in a document. Where a number is missing above, it is missing in the code too. Two rows genuinely need a clock and have only a count — the forensic summaries and the refusal log — and both hold your wallet address next to a place and a time. Saying so here is what makes it hard to leave that way.

who else touches it

Everyone who touches it. Plus a map we do not run.

Privy
Identity and the wallet. They run the sign-in with Google, X or Apple, they hold the account, and they derive an embedded Ethereum wallet for it whose key you can export at any time. Their session is what keeps you signed in on both the site and the app.
Vercel
Hosting. Every request to touchgrass.family passes through them, which means they see the IP and headers described above in the ordinary course of serving the page.
Upstash Redis, provisioned through Vercel
The store everything above lives in: profiles, catch history, the counters, the anti-fraud logs. When this page says a key expires in 24 hours, it is a Redis TTL doing it.
Expo, for the Android app only
On launch the app asks u.expo.dev whether there is a JavaScript update, which tells Expo your IP and which build you are on. A sideloaded APK has no store to update it, so this is the only route a fix has to reach you.
Google, X or Apple
Whichever one you signed in with learns that you have an account here. We receive a subject identifier, and from Google an email address and a name. We do not get your password, your contacts or your posts. It is one row and three companies, which is why the heading on this card does not count them.
Whoever hosts our email
Every right on this page is exercised by writing to support@touchgrass.family, so the mail host holds whatever you put in the message: your wallet address, your handle, which provider you signed in with, and any evidence you send to prove the account is yours. The deletion page opens a draft with the first three already filled in. The mail host is listed here rather than left off the list because that is what it is: a processor.

And one that is not ours at all. The map tiles come from OpenFreeMap. Your browser or your phone fetches those squares straight from tiles.openfreemap.org, which means they see your IP address and roughly which part of the world you are looking at. That request never passes through us and we cannot see it, which is exactly why it is named here rather than left for somebody to find in a network tab.

There is no analytics provider, no advertising network and no crash reporter. There is a mailbox, and it is in the table above precisely because writing to us is how every right on this page gets used. The two typefaces are compiled into the site at build time and served from our own domain, so Google is not told when you load a page. If any of that changes, this page changes before the code ships, not after.

Leaving the EU. Privy, Vercel, Upstash and Expo are American companies, and nothing in this deployment pins a region, so your data does leave the European Union. The law wants a named safeguard for that — a processing agreement with the Commission’s standard contractual clauses in it, or a provider certified under the EU–US Data Privacy Framework — and it wants you to be able to ask for a copy.

An earlier version of this paragraph said that paperwork had to wait for the company to exist. That was wrong, and it was a convenient thing to be wrong about. Every one of these agreements is a click-through that a person can accept in their own name, so the missing registration never blocked it and cannot be the excuse.

No transfer safeguard is documented yet — not standard contractual clauses, not a Data Privacy Framework certification, provider by provider. That is a gap rather than a position, and it is stated here in its own box rather than in a sentence you would skim past.

Until each one is named, the honest reading is that these transfers run without a documented safeguard. As each agreement is accepted the mechanism is named on this page, and a copy comes to anyone who asks at support@touchgrass.family.

the part we cannot delete

A public chain is public. Forever, and by design.

Your wallet is non-custodial. Privy derives the key on your device; we never hold it, cannot sign with it, and cannot move anything out of it. That is the good half of the same fact.

The other half: a catch that pays out is a token transfer signed by our vault on Robinhood Chain, and it lands on a public ledger. Anyone can read it. It will still be readable after the company exists, and after it stops existing. No request to us can remove it — not because we would refuse, but because it was never ours to remove. Nobody has that button, including us.

What is on the chain: a wallet address, a token, an amount and a time. What is not on the chain: your handle, your name, your avatar, your position, or the place you walked to. Those live in our store, and those we can delete on request, completely.

So the right to erasure works on everything we hold and stops at the chain. If that trade is not one you want to make, the honest advice is to not catch anything — the map, the drops and the rules are all readable without an account. There is no version of this where the payout is both real and erasable.

your rights, and the button for each

Eight of them. None need a lawyer.

  1. 01. Access

    Your profile and every catch on your wallet are already on screen at /app/settings — that part needs no request. Ask on the support page for the rest, including whatever is still sitting in the anti-fraud logs against your wallet or your device hash, and you get it.

  2. 02. Rectification

    The profile editor, in the app and on the site. Name, handle, avatar and bio are all editable and all clearable. Nothing there is derived from anything you cannot change.

  3. 03. Erasure

    /delete-account, which writes the request rather than firing it: the page opens a mail draft with your wallet address in it, one reply asks you to prove the address is yours, and then the profile, the handle, the catch history and your place on the leaderboard go. There is no self-service button, and the deletion page says so on its own face rather than letting you find out. It cannot touch the chain, and the card below that one explains exactly why. Export your wallet key from /app/settings first: deleting the account does not delete the tokens, and without the key that wallet is gone for good.

  4. 04. Restriction

    Ask, and we stop processing what is in dispute while it is in dispute. In practice that means we leave your record alone rather than deleting it, and we do not act on the refusal until a person has looked at it. There is no freeze switch built for this: a profile has no suspended flag on it, and the one mark that can stop a wallet claiming is the anti-farm one described under retention, which is aimed at fleets funded from a single gas payer and is not a tool for holding your account still while we argue about a refusal. So this is a person keeping their hands off a record and writing back to say so. Saying that is more use to you than describing a button that does not exist.

  5. 05. Portability

    Ask, and you get JSON: the profile, plus the catch history, in the shape the API already serves it in. Machine-readable, because a PDF of a table is not portability. It is assembled by a person and not exported by a button — there is no export endpoint — so give it a couple of days.

  6. 06. Objection

    Aimed at the legitimate-interest rows above. The public feed is the one most people mean, and here is the honest state of it: making your profile private hides your profile page, but it does not currently pull your handle out of the feed, because the feed reads a separate address-to-handle index that does not check the switch. The switch in the editor says it hides your catches entirely, and that label is ahead of the code — the label is the part that misleads, and both it and the feed are being fixed. Until they are, ask and we will unpick it by hand. Objecting to the anti-fraud checks themselves means you cannot claim — we would rather say that plainly than pretend the check is optional.

  7. 07. Withdraw consent

    The location permission, in your operating system settings. Turn it off and the sensor stops immediately, on the site and in the app. The map still works at city scale. The catch does not, and cannot.

  8. 08. Judged by a machine, argued with a person

    The first decision is a machine's, and pretending otherwise would be flattering: five weighted tells, a threshold, a refusal, nobody in the loop. This is a solely automated decision, and it is permitted because it is necessary for the contract you asked us to perform — Article 22(2)(a). What it costs you when it goes wrong is a payout you had already walked for: the fragment is not sent, and the refusal is written to a log with your wallet address, the drop and the city on it. The fleet mark in the retention table is a second automated refusal and works the same way, including the thirty days it lasts. The three safeguards the Article requires are the answer to both. You can get a person involved, you can tell them what actually happened, and you can contest the outcome — that is what the 72 hours is. Nothing here is profiling for advertising, because there is no advertising.

And the ninth, which is not one of the eight: you can complain to the data protection authority where you live, and you do not have to ask us first or wait for us to answer. The list of every authority in the Union is published at edpb.europa.eu.

in your browser, on your phone

No banner. Because there is nothing to ask about.

This site sets no cookies of its own. Your session travels as two request headers rather than as a cookie, which is also what makes a forged cross-site POST impossible — a browser attaches cookies to a hostile page’s request all by itself, and it will not attach a header that page cannot read.

The site writes nothing to local storage. Privy’s sign-in library keeps your session in the browser so you are not signed out on every reload; that is the login working, not tracking, and signing out clears it.

On the phone, three things sit in the operating system keychain: the Privy session, your 18-or-over and not-a-US-person answer, and a flag saying you have seen the intro screen. The first is what keeps you signed in. The other two never leave the device — no server here knows you answered, which is exactly why the app calls it a declaration and not a gate.

No advertising identifier is read on either platform, and no fingerprinting script runs in the page. The device hash described further up is computed on our server, from headers your browser already sent, and never in your browser.

who this is for

18+, EU only. And it is not a share.

Touch Grass hands out fragments of Robinhood Chain Stock Tokens. A Stock Token is a token representing a derivative contract with Robinhood Europe UAB that tracks the price of a listed share. It is not a share, it confers no shareholder rights, its value can fall, and it is not covered by any investor compensation or deposit insurance scheme.

You must be 18 or over. It is offered in the European Union and not to US persons. Walking does not earn you money, nothing here is investment advice, and none of this is a reason to go outside. Going outside is the reason to go outside.

We do not knowingly hold data about anyone under 18. If a child has an account here, say so on the support page and it goes, with everything attached to it — except the chain, which is the same wall as everywhere else on this page and applies to everyone equally.

when this changes

It changes in public.

This page is a file in the repository that builds the site, so every change to it is a commit with a date on it. When something material moves — a processor added, a field collected, a retention lengthened — this page is updated before the code ships, and the date under the headline moves with it. The app’s Legal and support card points at this same URL and always will.

Several things on this page are honestly unfinished, and every one of them is admitted in the card it belongs to rather than collected out of the way down here: the controller’s name and postal address are owed and not printed, no transfer safeguard is named for the four American providers, the motion figure is read on browsers that were never asked for it, the forensic summaries and the refusal log are bounded by a count instead of by a clock, the private switch does not yet pull your handle out of the feed, and two of the rights above — restriction and portability — are worked by a person because neither a freeze switch nor an export button has been built. When one of those is fixed, the sentence admitting it disappears from wherever it sits.

Terms · Legendary rules · Support · Delete my account