[{"data":1,"prerenderedAt":270},["ShallowReactive",2],{"navigation":3,"\u002Fcarrot-crunch\u002Fprivacy":150},[4],{"title":5,"path":6,"stem":7,"children":8,"page":149},"Articles","\u002Farticles","articles",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145],{"title":10,"path":11,"stem":12},"Building a Claude Code Plugin with Hooks","\u002Farticles\u002F2026-01-04-building-claude-code-plugin-with-hooks","articles\u002F2026-01-04-building-claude-code-plugin-with-hooks",{"title":14,"path":15,"stem":16},"Where should I validate? Everywhere, and for different reasons","\u002Farticles\u002F2026-04-18-validation-across-the-stack","articles\u002F2026-04-18-validation-across-the-stack",{"title":18,"path":19,"stem":20},"Error handling across the stack","\u002Farticles\u002F2026-04-23-error-handling-across-the-stack","articles\u002F2026-04-23-error-handling-across-the-stack",{"title":22,"path":23,"stem":24},"3 Ways to Run NestJS Cron Jobs When Running Multiple Instances","\u002Farticles\u002F3-ways-to-run-nestjs-cron-jobs-when-running-multiple-instances","articles\u002F3-ways-to-run-nestjs-cron-jobs-when-running-multiple-instances",{"title":26,"path":27,"stem":28},"Building a Custom Content Slider (Carousel) in Angular","\u002Farticles\u002Fbuilding-a-custom-content-slider-carousel-in-angular","articles\u002Fbuilding-a-custom-content-slider-carousel-in-angular",{"title":30,"path":31,"stem":32},"Building Jobven: Designing a Developer-Friendly API","\u002Farticles\u002Fbuilding-jobven-designing-a-developer-friendly-api","articles\u002Fbuilding-jobven-designing-a-developer-friendly-api",{"title":34,"path":35,"stem":36},"Building MapleStack: AWS S3 for Data Storage","\u002Farticles\u002Fbuilding-maplestack-aws-s3-for-data-storage","articles\u002Fbuilding-maplestack-aws-s3-for-data-storage",{"title":38,"path":39,"stem":40},"Building MapleStack: Enhancing Email Capabilities with Mailgun","\u002Farticles\u002Fbuilding-maplestack-enhancing-email-capabilities-with-mailgun","articles\u002Fbuilding-maplestack-enhancing-email-capabilities-with-mailgun",{"title":42,"path":43,"stem":44},"Building MapleStack: NestJS for Server-Side Operations","\u002Farticles\u002Fbuilding-maplestack-nestjs-for-server-side-operations","articles\u002Fbuilding-maplestack-nestjs-for-server-side-operations",{"title":46,"path":47,"stem":48},"Building MapleStack: PostgreSQL for Data Storage","\u002Farticles\u002Fbuilding-maplestack-postgresql-for-data-storage","articles\u002Fbuilding-maplestack-postgresql-for-data-storage",{"title":50,"path":51,"stem":52},"Building MapleStack: React for an interactive user interface","\u002Farticles\u002Fbuilding-maplestack-react-for-an-interactive-user-interface","articles\u002Fbuilding-maplestack-react-for-an-interactive-user-interface",{"title":54,"path":55,"stem":56},"Building MapleStack: Securing Connections with Let's Encrypt","\u002Farticles\u002Fbuilding-maplestack-securing-connections-with-lets-encrypt","articles\u002Fbuilding-maplestack-securing-connections-with-lets-encrypt",{"title":58,"path":59,"stem":60},"Building MapleStack: Simplifying User Authorization with AWS Cognito","\u002Farticles\u002Fbuilding-maplestack-simplifying-user-authorization-with-aws-cognito","articles\u002Fbuilding-maplestack-simplifying-user-authorization-with-aws-cognito",{"title":62,"path":63,"stem":64},"Building MapleStack: Tailwind CSS for Streamlined Styling","\u002Farticles\u002Fbuilding-maplestack-tailwind-css-for-streamlined-styling","articles\u002Fbuilding-maplestack-tailwind-css-for-streamlined-styling",{"title":66,"path":67,"stem":68},"Nigeria's Postcode API: How It Works and How to Test It","\u002Farticles\u002Fbuilding-on-nigerias-postcode-api","articles\u002Fbuilding-on-nigerias-postcode-api",{"title":70,"path":71,"stem":72},"Debugging Multiple NestJS Applications in VSCode","\u002Farticles\u002Fdebugging-multiple-nestjs-applications-in-vscode","articles\u002Fdebugging-multiple-nestjs-applications-in-vscode",{"title":74,"path":75,"stem":76},"Enums as arrays in PostgreSQL - Updated 2024","\u002Farticles\u002Fenums-as-arrays-in-postgresql","articles\u002Fenums-as-arrays-in-postgresql",{"title":78,"path":79,"stem":80},"FindChildcare.ca","\u002Farticles\u002Ffindchildcare-ca","articles\u002Ffindchildcare-ca",{"title":82,"path":83,"stem":84},"GraphQL Server - Apollo, KoaJS and Typescript implementation","\u002Farticles\u002Fgraphql-server-apollo-koajs-and-typescript-implementation","articles\u002Fgraphql-server-apollo-koajs-and-typescript-implementation",{"title":86,"path":87,"stem":88},"How I built MapleStack's waitlist with AI: ChatGPT vs Bard","\u002Farticles\u002Fhow-i-built-maplestacks-waitlist-with-ai-chatgpt-vs-bard","articles\u002Fhow-i-built-maplestacks-waitlist-with-ai-chatgpt-vs-bard",{"title":90,"path":91,"stem":92},"How to Integrate Google reCAPTCHA v3 with NestJS in 3 Easy Steps","\u002Farticles\u002Fhow-to-integrate-google-recaptcha-v3-with-nestjs-in-3-easy-steps","articles\u002Fhow-to-integrate-google-recaptcha-v3-with-nestjs-in-3-easy-steps",{"title":94,"path":95,"stem":96},"How to resolve a blacklisted domain","\u002Farticles\u002Fhow-to-resolve-a-blacklisted-domain","articles\u002Fhow-to-resolve-a-blacklisted-domain",{"title":98,"path":99,"stem":100},"Implementing WordPress-like Tags in Nuxt Content","\u002Farticles\u002Fimplementing-wordpress-like-tags-in-nuxt","articles\u002Fimplementing-wordpress-like-tags-in-nuxt",{"title":102,"path":103,"stem":104},"Jobven","\u002Farticles\u002Fjobven","articles\u002Fjobven",{"title":106,"path":107,"stem":108},"KidzLog","\u002Farticles\u002Fkidzlog","articles\u002Fkidzlog",{"title":110,"path":111,"stem":112},"MapleStack","\u002Farticles\u002Fmaplestack","articles\u002Fmaplestack",{"title":114,"path":115,"stem":116},"Migrating from WordPress to Nuxt","\u002Farticles\u002Fmigrating-from-wordpress-to-nuxt","articles\u002Fmigrating-from-wordpress-to-nuxt",{"title":118,"path":119,"stem":120},"My Initial Server Setup Checklist","\u002Farticles\u002Fmy-initial-server-setup-checklist","articles\u002Fmy-initial-server-setup-checklist",{"title":122,"path":123,"stem":124},"Pre-authorized transaction on the Stellar network","\u002Farticles\u002Fpre-authorized-transaction-on-the-stellar-network","articles\u002Fpre-authorized-transaction-on-the-stellar-network",{"title":126,"path":127,"stem":128},"Saza: Open Source mobile and desktop Stellar wallet release.","\u002Farticles\u002Fsaza-open-source-mobile-and-desktop-stellar-wallet-release","articles\u002Fsaza-open-source-mobile-and-desktop-stellar-wallet-release",{"title":130,"path":131,"stem":132},"SpellCheckMySite.com","\u002Farticles\u002Fspellcheckmysite-com","articles\u002Fspellcheckmysite-com",{"title":134,"path":135,"stem":136},"Using Check Constraints in PostgreSQL for Value Validation","\u002Farticles\u002Fusing-check-constraints-in-postgresql-for-value-validation","articles\u002Fusing-check-constraints-in-postgresql-for-value-validation",{"title":138,"path":139,"stem":140},"Using DataLoader in GraphQL","\u002Farticles\u002Fusing-dataloader-in-graphql","articles\u002Fusing-dataloader-in-graphql",{"title":142,"path":143,"stem":144},"Using Typescript in NodeJS development","\u002Farticles\u002Fusing-typescript-in-nodejs-development","articles\u002Fusing-typescript-in-nodejs-development",{"title":146,"path":147,"stem":148},"Welcome!","\u002Farticles\u002Fwelcome","articles\u002Fwelcome",false,{"id":151,"title":152,"body":153,"description":262,"extension":263,"meta":264,"navigation":265,"path":266,"seo":267,"stem":268,"__hash__":269},"carrotCrunch\u002Fcarrot-crunch\u002Fprivacy.md","Carrot Crunch privacy policy",{"type":154,"value":155,"toc":249},"minimark",[156,160,163,168,171,175,191,194,198,201,205,208,212,215,219,222,226,229,233,236,240],[157,158,159],"p",{},"Last updated 21 October 2026.",[157,161,162],{},"Carrot Crunch is a counting game for young children, made by Peter Oliha (developer name oliha.dev). This policy covers the Carrot Crunch app.",[164,165,167],"h2",{"id":166},"in-short","In short",[157,169,170],{},"Carrot Crunch collects nothing. It has no accounts, no ads, no analytics and no tracking, and it sends nothing to me or to anyone else. Everything the game keeps stays on the device.",[164,172,174],{"id":173},"what-the-game-keeps-on-the-device","What the game keeps on the device",[176,177,178,182,185,188],"ul",{},[179,180,181],"li",{},"Each bunny's name, colour and what it wears, as the child typed and picked them.",[179,183,184],{},"Progress: levels finished, stars, carrots, golden carrots, best times and crowns.",[179,186,187],{},"A play history: each round, each answer and how long it took, hints, and when the game was opened and closed. The grown-ups view is worked out from it.",[179,189,190],{},"The voice and sound settings.",[157,192,193],{},"All of this lives in the app's own storage on the device. Uninstalling the app deletes it.",[164,195,197],{"id":196},"the-voice","The voice",[157,199,200],{},"The game reads numbers and hints aloud with Android's text-to-speech, and asks for a voice that runs on the device. If a device only has an online voice, Android's speech service may send the words being spoken (numbers and short hints) to its provider, such as Google, to be read aloud. A line with a bunny's name in it is only ever spoken by a voice on the device, and is skipped when there is none. The voice can be turned off in the game's Grown-ups screen.",[164,202,204],{"id":203},"backups","Backups",[157,206,207],{},"Like most apps, Carrot Crunch lets Android back up its save to the Google account on the device, so progress survives a move to a new phone. This is Android's own backup, kept by Google under that account's settings. It can be turned off in the device's Settings, under Google and then Backup.",[164,209,211],{"id":210},"sharing-a-save","Sharing a save",[157,213,214],{},"A grown-up can export a save or the play history from the Grown-ups screen, to keep or to send. It leaves the device only when the grown-up chooses where it goes, through Android's share sheet or by copying it.",[164,216,218],{"id":217},"children","Children",[157,220,221],{},"Carrot Crunch is made for children and follows Google Play's Families policy. Because it collects no personal information, there is nothing for me to see, keep or delete.",[164,223,225],{"id":224},"internet-access","Internet access",[157,227,228],{},"The Android app has permission to use the internet, kept for features that may come later. Today the game makes no network requests of its own.",[164,230,232],{"id":231},"changes","Changes",[157,234,235],{},"If anything here changes, for example if a later version adds something that uses the internet, this page will say so before that version is released, and the date at the top will change.",[164,237,239],{"id":238},"contact","Contact",[157,241,242,243,248],{},"Questions about this policy go to ",[244,245,247],"a",{"href":246},"mailto:peter@oliha.dev","peter@oliha.dev",".",{"title":250,"searchDepth":251,"depth":251,"links":252},"",2,[253,254,255,256,257,258,259,260,261],{"id":166,"depth":251,"text":167},{"id":173,"depth":251,"text":174},{"id":196,"depth":251,"text":197},{"id":203,"depth":251,"text":204},{"id":210,"depth":251,"text":211},{"id":217,"depth":251,"text":218},{"id":224,"depth":251,"text":225},{"id":231,"depth":251,"text":232},{"id":238,"depth":251,"text":239},"What Carrot Crunch keeps, where it keeps it, and what can leave the device.","md",{},true,"\u002Fcarrot-crunch\u002Fprivacy",{"title":152,"description":262},"carrot-crunch\u002Fprivacy","QozIHxuEYqKQ1fKIqZ-HSZlzZcrNM0QiVSztIuX0OIo",1792731165578]