DEV Community

Ashutosh Ranjan
Ashutosh Ranjan

Posted on

Kagaz: An Offline AI That Prints a Nature Scavenger Hunt So Kids Go Touch Grass

Hacktoberfest: Maintainer Spotlight

Kagaz (कागज़, "paper") is an offline-first tool that generates printable bilingual Hindi and English nature scavenger hunts for kids. A parent enters a city, an age range, and a month. A local open-weight LLM writes the hunt, a seasonal filter keeps it realistic for that time of year, and ReportLab renders an A4 PDF with a checkbox grid. You print it, hand it to a kid, and they go outside to find a dry leaf with a hole in it, a crow on a wire, the smell of wet earth.

Total screen time: about 30 seconds. Total nature time: one to two hours.

This is my Hacktoberfest 2026 Week 1 submission for the "Touch Grass" theme.

Why open models matter here

I didn't pick a local model for ideology. For this particular project, the open route was just the better fit:

  • It runs offline. After a one-time ollama pull qwen2.5:7b, nothing needs the internet. That matters in small towns with flaky connections, on a plane, or during a power cut when a parent wants an activity ready on the laptop.
  • Kids' data never leaves the laptop. No cloud, no account, no logs, no training data. A child's age and city stay on the machine that typed them.
  • Zero API cost. A teacher can print 100 copies for a class and it costs paper and ink.
  • Model swap is one line in .env. I started on gemma2:2b and moved to qwen2.5:7b for better multilingual output. No API docs, no rate limits, no billing account.
  • A local fine-tuning path is real. I could fine-tune on Marathi species names, which is impossible with a closed endpoint.
  • Everything is inspectable. When the model returned bad Hindi, I could trace the prompt, the temperature, and the model itself without paying per experiment.

The "Touch Grass" angle

A scavenger hunt app is easy to build and easy to get wrong. The failure mode is an app that gets kids to look at their phones about trees. So every design decision in Kagaz pushes away from the screen:

  • Print-only PDF, not a mobile app. There's no app to open mid-hunt.
  • Physical checkboxes, not tap-to-tick. You tick with a pencil, outside.
  • 12 items. The hunt has an end. It's about completion, not doom-scrolling.
  • Bilingual output. A grandparent reading Hindi and a child reading English can hunt together, which gets two generations off the sofa.

The software's job is to disappear after 30 seconds.

The stack

  • Ollama as the local model runtime
  • Qwen 2.5 7B, an open-weight LLM, for generation
  • TabPFN for the seasonal filter, with a pandas fallback (TabPFN didn't cooperate on Python 3.13)
  • ReportLab for PDF generation
  • Streamlit for the parent-facing UI

Python 3.13 on Windows 11, on a 15 GB RAM laptop. No GPU heroics.

How it works

The pipeline is deliberately short:

  1. Parent form. City, age range, month, and item count.
  2. Seasonal filter. Picks the item types likely to exist that month. October leans toward dry leaves and twigs; June leans toward monsoon smells.
  3. Generation. Qwen returns JSON with 12 bilingual items.
  4. Safety validator. Rejects any item containing words like "touch", "eat", "pick mushroom", or "taste." This is a kids' tool, and a language model shouldn't be allowed to suggest tasting a wild mushroom.
  5. Rendering. ReportLab lays out an A4 PDF with a 2-column checkbox grid.

Each item looks like this:


json
{
  "emoji": "🍂",
  "text_en": "Find a dry brown leaf with a hole in it",
  "text_hi": "छेद वाला सूखा भूरा पत्ता ढूंढो",
  "hint": "Look under trees near the gate",
  "type": "spot"
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)