[{"data":1,"prerenderedAt":240},["ShallowReactive",2],{"navigation":3,"\u002Fcarrot-crunch":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":232,"extension":233,"meta":234,"navigation":235,"path":236,"seo":237,"stem":238,"__hash__":239},"carrotCrunch\u002Fcarrot-crunch\u002Findex.md","Carrot Crunch",{"type":154,"value":155,"toc":225},"minimark",[156,160,165,200,204,213,217],[157,158,159],"p",{},"Carrot Crunch started as a game for my own two kids. Each round is a row of stepping stones. The bunny sits on a number, the sky asks what comes next (6 + 2 = ?), and the child taps the pad with the answer. Each right answer hops the bunny along, and a round ends with stars and carrots for the bunny to crunch.",[161,162,164],"h2",{"id":163},"how-it-plays","How it plays",[166,167,168,176,182,188,194],"ul",{},[169,170,171,175],"li",{},[172,173,174],"strong",{},"Nine areas in four chapters:"," counting forward in 2s, 5s and 10s, counting back in the same steps, then 3s and 4s, then counting from any start.",[169,177,178,181],{},[172,179,180],{},"90 levels",", and 27 challenge levels beside the path that mix adding and taking away.",[169,183,184,187],{},[172,185,186],{},"Golden carrots"," hide on some stones, found by answering right first time.",[169,189,190,193],{},[172,191,192],{},"Up to six bunnies"," on one device, each named and dressed by its child.",[169,195,196,199],{},[172,197,198],{},"A grown-ups view"," showing where each child slows down and which numbers they miss.",[161,201,203],{"id":202},"for-families","For families",[157,205,206,207,212],{},"Carrot Crunch currently has no ads, no accounts and no in-app purchases, and everything it keeps stays on the device. The ",[208,209,211],"a",{"href":210},"\u002Fcarrot-crunch\u002Fprivacy","privacy policy"," has the detail.",[161,214,216],{"id":215},"getting-it","Getting it",[157,218,219,220,224],{},"Carrot Crunch is in a closed test on Google Play with a small group of families. To join, email ",[208,221,223],{"href":222},"mailto:peter@oliha.dev","peter@oliha.dev",".",{"title":226,"searchDepth":227,"depth":227,"links":228},"",2,[229,230,231],{"id":163,"depth":227,"text":164},{"id":202,"depth":227,"text":203},{"id":215,"depth":227,"text":216},"A counting game for young children. Hop the bunny across the stones, counting in 2s, 5s and 10s, forward and back.","md",{},true,"\u002Fcarrot-crunch",{"title":152,"description":232},"carrot-crunch\u002Findex","Qyteh6DWfzi6NWE5yCyGrsf8aq53BU3GQfdc76z0XIA",1792731165578]