Privacy Policy
Effective 24 October 2026
- You can play Windwright without giving us your name or email address.
- Your garden, your code and your settings are saved in your own browser. We cannot see them.
- We count visits and a few game moments (like "first creature woken") without cookies and without knowing who you are.
- Players under 16 are never asked for an email address or a name.
- If you send feedback, write to us through the contact page, or ask for a note about new clearings, that message comes to our inbox. You can ask us to delete it at any time.
- We do not sell your information, show ads, or let anyone else use it for their own purposes.
1. Who we are
Windwright is a free browser game that teaches Python, currently in a private, invite-only playtest at windwright.dev. It is made by William Hsu, an individual developer in Ontario, Canada ("we", "us"). We are responsible for the personal information described here.
Contact for anything in this policy, including access and deletion requests: hello@windwright.dev
2. What this policy covers
This policy covers the Windwright game and the pages about it at windwright.dev, and the forms on them. It does not cover other websites we link to, or LinkedIn or any other site where you found your invite.
3. What we collect and why
3.1 When you enter an invite code
- What: the code you type, the time it was used, and your IP address.
- Why: to check the code, make sure each invite code is used only once and each shared code (one code given to a group) no more times than it allows, and slow down anyone trying to guess codes.
- How long: your IP address is held for 60 seconds by the attempt counter that slows down guessing, then deleted. It is not stored with the code. The record that an invite code was used (the code and the time) is kept for the length of the playtest. For a shared code we keep only the number of times it has been used, not when or by whom.
- Legal basis (UK and EU): our legitimate interest in keeping the playtest private and secure.
After a code is accepted, your browser gets a cookie called ww_access that lets
you back in without a code for 180 days. When the game is open to everyone without a code,
a computer gets the same cookie the first time it opens the game. It contains only the date
it was issued, a random number made up for this browser, and a signature, and, if you came
in with a shared code or a friend's code, or without a code, a group name (see 3.5). It does
not contain your code, your IP address, or anything that identifies you.
Once you finish the First Clearing, the game gives you three codes to pass on to friends. Our server keeps those three codes under your cookie's random number, so it can show you the same three each time and mark the ones a friend has used. Nothing else is stored with them: no name, no email address, no IP address, and nothing about the friends who use them. The record of your three codes is deleted 180 days after they are made. A code nobody has used yet keeps working until it is used.
If you finish every clearing while the playtest is invite-only, the game asks our server for your First Seed, a numbered keepsake for your own garden. The server keeps a count of how many it has given and, under your cookie's random number, the number it gave you, so it can give you the same one if it is asked again. Nothing else is stored with it: no name, no email address, no IP address. That record is deleted 180 days after the number is given; the number itself stays in your browser's save. The game shows everyone the count, never who holds them.
3.2 The age question
Before either letter in the game (feedback, or a note about new clearings) lets you write,
it asks how old you are. The game turns the answer into one of two results, 16 or older, or
under 16, and keeps only that result in your browser's local storage
(windwright.agecheck). Your age itself is not kept and is not sent anywhere. The
question is asked once per browser.
If you are under 16, the game does not show an email field or a name field, and asks you not to put personal details in feedback.
3.3 When you send feedback
The "Send feedback" letter is optional.
- What you choose to write: the kind of note (something broke, an idea, something else) and your message. If you are 16 or older you may also sign it with a first name or nickname. Players under 16 send feedback anonymously.
- What is added automatically to help us fix bugs: which clearing you are in, which creatures are active and unlocked, the game speed, the page address, your window size, your browser's user agent string (browser, version and operating system), and the time. The letter tells you this before you send.
- Where it goes: it is sent through Web3Forms, a form relay service, which emails it to our inbox. Web3Forms receives your IP address as part of the connection when you send.
-
A copy stays in your browser: the last 20 reports you sent are kept in your browser's local
storage (
windwright.feedback) so a report is never lost if sending fails. Only you can see that copy. "Start over" in the Guide deletes it, and so does clearing this site's data. - How long we keep it: up to 12 months, then we delete the email.
- Please do not include your email, address, phone number, or other personal details in feedback.
- Legal basis (UK and EU): our legitimate interest in fixing and improving the game.
3.4 When you ask for a note about new clearings
The new-clearings letter is optional and is only offered to players who answered the age question 16 or older. You can choose "Keep playing" and nothing is sent.
- What: your email address, and a line saying the age question was answered 16 or older.
- Why: only to tell you when new clearings open, and, if you asked from the code screen, when Windwright opens to everyone.
- Where it goes: through Web3Forms to our inbox. It is never sold or given to anyone else. Your address is not stored in the game or in your browser; the game only remembers that you signed up, so it does not ask again.
- What happens today: we are only collecting addresses. No update has been sent yet. When we do send one, it will say who it is from, give a way to contact us, and include a working unsubscribe link, as Canada's Anti-Spam Legislation (CASL) requires.
- How long we keep it: until you unsubscribe, or until the game's development ends, whichever comes first.
- How to stop: reply to any note with "unsubscribe", use the unsubscribe link in it, or email hello@windwright.dev. We will remove you within 10 business days.
- Legal basis: your consent. You can withdraw it at any time.
3.5 Visit and game-moment counts (analytics)
We use Vercel Web Analytics to understand how many people play and where new players get stuck.
- It does not use cookies and does not store anything on your device.
- For each page view it records the page address, the referring site, the time, your approximate location (country, region and city, worked out from your IP address, which is not stored), and your browser, operating system and device type.
- To count unique visitors, Vercel uses a hash made from your request that is thrown away after 24 hours. We cannot use it to identify you.
-
We also send a short list of named game moments, each with at most two small values. The
full list:
- Getting started: session started (comfort setting, returning or new), tutorial started, first Wake (worked or errored, and how long it took), first watering, first garden finished, a whole bed watered (comfort setting and how long it took), the beetle reached (comfort setting, returning or new).
- Places: a clearing finished (which clearing), Wild Gardens or Keeper's Garden entered, the tour of the garden finished (which place) or skipped (which stop), each with whether it played at the start or was asked for again, a garden visitor seen (which animal), the Lantern Night carving opened or finished (comfort setting).
- Learning: a short scene played or skipped (which scene, and how it was shown or where it was skipped), a new idea's introduction seen or skipped (which idea, and which part), a task's first Wake and the task finished (which task and how long it took), Teach me started, a step passed or shown, a line shown, left or finished (which task, and the step or number of tries), the game noticing a creature stuck (which task and what kind), a creature sent home (which task, and whether by whistle or peg), a page turned back (which task).
- Letters: the what's-new letter opened, the new-clearings letter shown, sent or declined, feedback sent (the kind only).
- Graphics problems, so we know how many players cannot see the garden: the browser has graphics acceleration turned off (your browser's family, such as Chrome or Firefox, and whether an older graphics mode is available), the browser is drawing without the graphics card (browser family only), and the browser dropped the picture while playing (no values).
- So that a moment is not counted twice, the page remembers which moments it has sent. That list lives only in the page's memory and is gone when you close or reload the tab.
- Legal basis (UK and EU): our legitimate interest in understanding and improving the game, using aggregated statistics only.
If you came in with a shared code (one code given to a group, such as a class or the readers
of an article) or with a code a friend passed on to you (everyone who came in that way
counts as one group), our own server also counts how many players from that group reach a
few points in the game: getting in, the garden finishing loading, the first Wake, the first
watering, reaching the beetle,
starting Teach me, and finishing each clearing. It keeps only one total for each group and
point. It does not keep your IP address, when you reached each point, or anything else that
could tell one player from another. The group comes from your ww_access cookie,
and your saved game remembers which points it has already counted, so each is counted once.
The totals are kept for the length of the playtest. Players who came in with a personal
invite code are not counted this way.
When the game is open to everyone without a code, players who come in that way are counted the same way. Their group is the place the link they followed was posted, when the link names one of a short list we keep (for example our Instagram bio or a Reddit post), and otherwise "direct". The link names only the place, the same for everyone who follows it, and nothing else is kept.
The same totals also say how people from that group arrived. When a code is accepted, the
page says whether it is on a phone or a computer, and the server adds one to the group's
count of people let in on a computer. A phone is never let in: when you press Come in on a
phone, the page sends the code so the server can tell which group it belongs to, and the
code is not used up. That adds one to the group's count of phones sent to a computer. A
phone that was let in by an older version and comes back, and a browser that cannot run the
game and comes back holding a group's cookie, each add one to a count of their own. Your
browser remembers in its local storage which of these it has sent
(windwright.arrivals), so each is counted at most once per browser. Like the
rest, these are totals only.
For players from a group, the same totals also count how many pass set amounts of play time
(15 minutes, 30 minutes, 1 hour, 2 hours and 5 hours), roughly how long the First Clearing
took (under 15 minutes, under 30, under an hour, under two hours, or longer), and how many
come back to the game on a later visit, on a later day, and a week or more after their
first. Play time here is time the game is showing on your screen while you have typed,
clicked or scrolled in the last two minutes, or have creatures running; a tab left open with
nothing happening stops counting two minutes after the last of these. Your saved
game keeps its running play time and the date of its first visit, and works out the band
itself. Only the band reached is sent, each at most once per save: never a time, a date or
anything that could identify you. A visit starts when the game opens in a new tab or window;
so that a reload is not counted as coming back, the tab keeps a mark in its session storage
(windwright.visit), which your browser removes when the tab is closed. Like the
rest, these are totals only.
If the game stops with an error (the "garden paused" card), or part of the garden fails to download three times in a row, the page sends our server a short crash report: the error message, the names of the parts of the game's own code where it happened, and the game's version number. It is sent only from a browser that has been let in, at most once of each kind per page. It never contains your IP address, your browser or device details, your saved game, your code or anything you typed, and it is not stored with your cookie. To stop one browser sending too many, a counter holds a scrambled form of your cookie for at most an hour. We keep only the newest 200 reports, and a count of how often each message came in.
While the game is open and showing on your screen, the page tells our server every two minutes that it is still there, so we can count how many people are playing right now. Each message carries only a random number the open tab makes up for itself. It lives in the tab's memory, is never saved in your browser, and is not stored with your cookie, your IP address or anything else. The server forgets it a few minutes after the tab stops sending (closing the tab, or switching to another one, stops it), and keeps only an estimate of how many tabs were open each day, which cannot be turned back into the numbers. Separately, when you tap "Send it to my computer" on a phone, the server adds one to a count for that page and way of sending (share, email or copy) for the day. And when a browser cannot run the game (some browsers inside apps, such as Instagram's, cannot), the page that says so adds one to a count of such visits for the day, as inside an app or not. Nothing about you or your device goes with either.
The phone demo (the minute in the first garden that plays on a phone) is counted the same
way. The server adds one to a count for the day when a phone is shown the offer to try it,
when the demo is started, when it reaches its end, and when the game is sent to a computer
from it. A link sent from a phone to a computer ends in via=phone, the same
for everyone, and when a computer opens such a link the server adds one to a count for the
day of links that came back. None of these counts carries anything about you, your device
or the link's code, and none is kept with your cookie. So that each is counted at most once,
your browser remembers which of them it has sent (windwright.demo).
3.6 Things that stay on your device
These are saved in your browser's local storage and are never sent to us:
- your game progress (the whole garden, including any names you give creatures)
- how long you have actively played, and the date of your first visit, which your saved game uses to work out the group counts in 3.5 (only the band reached is ever sent)
- the Python code you write for each creature
- your settings (sound, music style, speed, graphics detail, editor text size, how much the wren teaches, the lesson camera, seasonal decorations)
- small flags such as whether you have seen the welcome, the tour or the trailer, whether the Tasks note is folded, whether you closed the note about graphics acceleration, which group counts and phone demo counts this browser has already sent, and the result of the age question
If your saved garden cannot be read, or you replace it with a copy you bring back, a copy of the old one is kept in your browser until the next one replaces it; a copy you keep from the Guide is a file holding the same data, and it goes only where you put it.
Your Python code runs inside your own browser. It is not uploaded. The Python interpreter, the code editor and the fonts are all served from windwright.dev itself, not from another company's servers.
"Start over" in the Guide resets your progress, your code and the feedback copies. Clearing this site's data in your browser removes everything listed above.
3.7 Ordinary web server logs
Like every website, our host Vercel receives your IP address, browser details, and the address of each file your browser requests, and keeps short-lived logs for security and troubleshooting. We do not use these logs to identify players. Vercel sets how long they are kept.
3.8 The playtest survey
The survey at windwright.dev/survey is optional, and only the question about how far you got needs an answer. When you send it, we receive your answers and which link you opened it from (for example the game's own link or a volunteer group's link), through Web3Forms to our inbox, like feedback; Web3Forms receives your IP address as part of the connection. Nothing about your computer or browser is added unless you write it in. If you answered the age question 16 or older, you may also give an email address so we can tell you when the open Beta starts. That address is optional, is used only for that one note, and is deleted once the note is sent or when you ask. We keep survey answers for up to 12 months. Legal basis (UK and EU): our legitimate interest in improving the game for the answers, and your consent for the email address.
3.9 The contact form
The letter at windwright.dev/contact is optional. Like the letters in the game, it first asks how old you are and keeps only whether you are 16 or older (see 3.2).
- What: if you are 16 or older, who you are writing as (teacher, parent or guardian, player, press, or something else), your email address so we can reply, your message, and your name if you choose to give it. If you are under 16, only your message is sent, marked as from a player under 16, with no name and no email address, so we cannot reply.
- Where it goes: through Web3Forms to our inbox, like feedback. Web3Forms receives your IP address as part of the connection when you send. Nothing about your computer or browser is added.
- Why: to read your letter and answer it.
- How long we keep it: up to 12 months after our last reply, then we delete the email.
- Legal basis (UK and EU): our legitimate interest in answering people who write to us.
4. What we do not do
- We do not sell or rent personal information, and we do not share it for advertising.
- We do not show ads or use advertising or social media trackers.
- We do not build profiles of players or make automated decisions about you.
- We do not ask for your real name, location, or account details to play.
5. Who else handles your information
We use these service providers. Each handles information only to provide its service to us.
| Provider | What it does for us | Information it handles | Where |
|---|---|---|---|
| Vercel Inc. | Hosts the game, runs the invite check, provides analytics | IP address, request details, analytics data points | United States and Vercel's global network |
| Upstash, Inc. | Stores invite codes and the record of which were used | Codes and the time each was used; your IP address for 60 seconds in the attempt counter; crash reports, and counts of players, phone taps and phone demo steps (see 3.5) | Upstash data centres (United States or elsewhere) |
| Web3Forms | Relays feedback, sign-ups and contact letters to our inbox | Everything in a feedback report, sign-up or contact letter, plus your IP address | Web3Forms' servers (outside Canada) |
| Our email provider | Holds our inbox | Feedback reports, sign-up emails and contact letters | The provider's data centres |
We may also disclose information if the law requires it, or to protect the game and its players from fraud or abuse.
6. Cookies and similar storage
We use one cookie, some local storage and one session storage mark, all of it needed for the game to work or to remember choices you made. None of it is used for analytics, advertising, or to follow you across other sites, so there is no cookie banner. If that ever changes, we will ask first.
| Name | Type | Purpose | Lasts |
|---|---|---|---|
ww_access |
Cookie (first-party, HttpOnly, Secure) | Remembers that this browser entered a valid invite code | 180 days |
windwright.save, windwright.script.* |
Local storage | Your game progress and code | Until you start over or clear site data |
windwright.save.unreadable |
Local storage | A copy of a saved garden that could not be read or was replaced, so it is not lost | Until the next such copy replaces it, or you clear site data |
windwright.feedback |
Local storage | Your last 20 feedback reports, as a backup | Until you start over or clear site data |
windwright.agecheck |
Local storage | Whether the age question was answered 16 or older, or under 16 (never the age) | Until you clear site data |
windwright.arrivals |
Local storage | Which group arrival counts this browser has already sent (see 3.5), so each is counted once | Until you clear site data |
windwright.demo |
Local storage | Which phone demo counts this browser has already sent (see 3.5), so each is counted once | Until you clear site data |
windwright.visit |
Session storage | Marks that this tab has already opened the game, so a reload is not counted as coming back (see 3.5) | Until the tab is closed |
Settings and onboarding keys (windwright.audio, .muted, .speed, .detail, .detail.probed, .editorFontSize, .welcomed, .gatehint, .comfortasked, .wren.tier, .wren.seen, .marks.seen, .lastOpen) |
Local storage | Remember your settings and what you have already seen | Until you clear site data |
7. Children
Windwright is a game for beginners, and some players are young. Anyone aged 10 or older may play.
- You do not need to give any personal information to play.
- We do not collect personal information from players under 16. A player who answers the age question under 16 is not shown an email field or a name field, their feedback is anonymous, and they are asked not to include personal details.
- The new-clearings email note is only for people aged 16 or older.
- If you are a parent or guardian and believe your child has sent us personal information, email hello@windwright.dev and we will delete it.
- We aim to follow the spirit of the UK Age Appropriate Design Code: privacy-friendly settings by default, no nudges to share more, and only the information we need.
8. How long we keep information
| Information | Kept for |
|---|---|
| IP address in the invite attempt counter | 60 seconds |
| Record that a code was used (code and time) | Length of the playtest, then deleted |
| Your three friend codes, kept under your cookie's random number | 180 days after they are made |
| Your First Seed number, kept under your cookie's random number | 180 days after it is given |
| Random number of an open game tab | Up to 10 minutes after the tab last sends it |
| Daily counts of open game tabs, phone taps, phone demo steps and browsers that cannot run the game | 9 days |
| Crash reports | Only the newest 200; each older one is deleted as a new one arrives |
| Feedback emails | Up to 12 months |
| Contact letters | Up to 12 months after our last reply |
| Sign-up email addresses | Until you unsubscribe or development ends |
| Analytics visitor hash | 24 hours (Vercel keeps the aggregated statistics) |
| Server logs | As set by Vercel |
| Anything in your browser | Until you clear it; we never see it |
When information reaches the end of its period, we delete it.
9. Your choices and rights
Wherever you live, you can ask us to:
- tell you what personal information we hold about you and give you a copy
- correct it
- delete it
- stop sending you emails (unsubscribe), or withdraw any consent you gave
In Canada, the Personal Information Protection and Electronic Documents Act (PIPEDA) gives you the right to access and correct your personal information. If you are not satisfied with our answer, you can complain to the Office of the Privacy Commissioner of Canada at priv.gc.ca.
If you are in the UK, the EU or the EEA, you also have the right to object to processing based on legitimate interests, to restrict processing, and to data portability, and you can complain to your data protection authority (in the UK, the Information Commissioner's Office at ico.org.uk).
If you are in California or another US state with a consumer privacy law, you have similar rights to know, delete and correct, and we do not sell or share personal information.
We would appreciate the chance to help before you go to a regulator.
How to ask
Email hello@windwright.dev with what you would like us to do. To help us find your information, tell us any of: the email address you signed up with, roughly when you sent feedback and what it was about, or the invite code you used.
We do not ask you to create an account or send ID. We will reply within 30 days. We will not treat you differently for asking.
Deleting what is on your device
Your progress, code, settings and feedback copies are only in your browser. To delete them, use your browser's "clear site data" option for windwright.dev. To reset only your progress, code and feedback copies, use "Start over" in the Guide.
10. Where information is processed
We are based in Ontario, Canada. Our service providers process information in the United States and other countries, where it is protected by those providers' terms and may be accessible to courts and authorities under local law. Where UK or EU law applies, we rely on our providers' data processing terms, including standard contractual clauses or the EU-US Data Privacy Framework where the provider takes part.
11. Security
Invite codes are long and random, checked on the server, and usable once. The access cookie is signed and cannot be read by page scripts. Information is sent over HTTPS. No system is perfectly secure, so please do not send us anything sensitive.
12. Changes
If we change this policy we will update the date at the top. If a change affects how we use information you have already given us, we will tell you in the game, or by email if you signed up, before it takes effect.
13. Contact
William Hsu
Ontario, Canada
hello@windwright.dev