Side Quest is a small outdoor quest game. It gives you a tiny real-world mission, you go outside and take a photo of what you found, and Gemma decides whether you found it. If you did, a creature inspired by your photo hatches into your collection.
Gemma (Google's open-weight model) runs in your browser on your own GPU. Nothing about the quest, the judging, or the creature goes to an AI API.
Play it at side-quest.pinkpixel.dev.
I built this for the Hacktoberfest 2026 "Touch Grass" challenge. The joke I couldn't let go of: the AI gives you a reason to leave the AI.
- Tell it roughly where and when you are: park, city, beach, the weather, the season, the time of day. You can also type a place like "London" if you want.
- Gemma writes a quest for that, something like "find something outside that looks like it has a face."
- Go find it and take a photo.
- Gemma looks at the photo. If it matches, a creature hatches. If it doesn't, you get a short reason and can try again.
There are also scavenger hunts: a short list of things to find on one walk, checked all at once at the end.
Open the site, click Wake Gemma, and play. The model is about 3.4 GB and downloads once, then stays cached in the browser. You'll want Wi-Fi for that first load.
Gemma needs WebGPU, so use a recent desktop Chrome or Edge. Solo play doesn't need an account, and your photos never leave the device.
Phones can't really run Gemma. My iPhone 12 kills the tab about 500 MB into the download. So the phone does the walking and your computer does the thinking:
- On your computer, go to Account and sign in with GitHub. That computer becomes your home base.
- Wake Gemma there and leave the tab open.
- Scan the QR code on the home base screen with your phone's camera. Your phone is now signed in to the same account.
- Go outside. Quests and photos go through the site to your computer, Gemma judges them there, and the creatures show up on your phone.
The phone keeps working without signal. Photos wait in a queue and send when you're back online. Your collection syncs to every device signed into the account.
Open the QR link in Safari on an iPhone, not a Home Screen shortcut. A Home Screen web app keeps its own cookies, so the sign-in from the camera won't carry over.
- Solo: photos stay in the browser's storage on that device.
- Signed in: photos go through the site to your computer and stay stored on the server (Cloudflare R2) until you delete your account. The account page has a delete button that removes the account, every stored photo, and every row tied to it.
- No location tracking. The place you type is just text for Gemma's prompt.
- GitHub sign-in only reads your public profile (name, username, avatar). The GitHub token isn't kept.
You need a recent Node.js. I'm on 22, and npm run home runs the server's TypeScript directly with Node, so older versions may not handle that.
npm install
npm run devOpen http://localhost:5173. That's enough for solo play.
The hosted API is a Cloudflare Worker. To run it locally you need a GitHub OAuth app with the callback http://localhost:5173/api/auth/callback. Then create .dev.vars in the repo root:
APP_ORIGIN=http://localhost:5173
GITHUB_CLIENT_ID=your-local-client-id
GITHUB_CLIENT_SECRET=your-local-client-secretSet up the local database once, then run the API and the app side by side:
npm run db:migrate:local
npm run dev:api
npm run devUse localhost:5173 rather than 127.0.0.1:5173. The sign-in cookie is tied to the hostname, so mixing the two breaks the GitHub redirect.
There's also a fully private option where nothing leaves your machine. npm run home builds the app, starts a small server on your computer, and opens a temporary cloudflared tunnel so your phone can reach it. It prints a QR code to pair the phone. Photos are kept in ~/.side-quest. It needs cloudflared installed.
npm run homenpm testThe Worker tests run the real Worker from wrangler.jsonc with local D1 and R2, so they need nothing set up beyond npm install.
The site runs on Cloudflare Workers with a D1 database and an R2 bucket. With wrangler logged in and the production secret set (npx wrangler secret put GITHUB_CLIENT_SECRET):
npm run db:migrate
npm run deploydb:migrate applies any new files in worker/migrations to the production database.
See CHANGELOG.md.
Apache 2.0. See LICENSE.
Made with 💖 by Pink Pixel