# Touch Grass Tales: go for a walk, come back with a picture book

> Source: <https://dev.to/ritik_verma_a6c3b5117cfd5/touch-grass-tales-go-for-a-walk-come-back-with-a-picture-book-2co>
> Published: 2026-10-09 21:21:42+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass](https://dev.to/challenges/hacktoberfest-week1-2026-10-05)*

**Touch Grass Tales** turns a short walk into an illustrated children's story.

You step outside, photograph 5 to 10 random things (a park bench, a pigeon, a weird sign, a lamp post), and an open-weight model, **Gemma**, turns them into a **story**, a **rhyming poem** or a **comic strip**. The pictures in the finished tale are *your own photos*. You pick the mood: **funny**, **spooky** (never gory) or **mystery**.

The screen is the shortest part of the experience on purpose:

**Who it's for:**

**Live app:** [https://touch-grass-flutonp.onrender.com/](https://touch-grass-flutonp.onrender.com/)

No API key? The app has a built-in demo (a canned walk with a park bench, a lamp post and a pigeon) and a gallery of sample tales.

How a tale gets made, step by step:

Go outside, photograph 5 to 10 random things, and Gemma AI turns them into a children's **story**, a rhyming **poem** or a **comic strip** (funny, spooky or mystery), illustrated with your own photos. Everything is written in simple words: short sentences, no idioms, about CEFR A2, so young readers and beginner English learners can follow it.

`/setup.html` walks through both.
**The open-source AI core: Gemma, an open-weight model.** Every word in a tale comes from Gemma. I use two Gemma 4 models, each for the job it's best at:

| Task | Model | Why | 
|---|---|---|
| Look at each photo | Gemma 4 26B-A4B | Fast mixture-of-experts model; one small (384px) photo at a time | 
| Plan the plot and pick a photo for each moment | Gemma 4 26B-A4B | Fast, structured JSON planning | 
| Write each scene or verse, then proofread and fix it | Gemma 4 31B | The best prose and rhyme | 
| Write comic panel captions and speech bubbles | Gemma 4 26B-A4B | Fast; a caption plus up to two bubbles per panel | 

**Many small calls, never one long reply.** Instead of asking for a whole story at once, the app builds it piece by piece:

Small calls keep the model focused, make each reply cheap to retry, and let the page show progress the whole time.

**The rest of the stack:**

**1. The same open model runs in the cloud *or* on your own machine.**

Because Gemma's weights are open, the app has two interchangeable back ends: Google AI Studio (free key, nothing to install) and **LM Studio**, which runs Gemma locally. Switching is one click in the app, with no code changes. With LM Studio, your photos never leave your computer: the model that looks at your walk runs on your own hardware. A closed, API-only model can't offer that choice.

**2. Your walk stays yours.**

Photos of a walk can reveal where you live. So:

**3. I pick the right model for each job.**

Open weights come in many sizes, so the app uses a fast mixture-of-experts Gemma for looking and planning, and the large dense Gemma for writing and editing. In LM Studio you can swap in any Gemma build you've downloaded, per task, from a dropdown.

**4. It costs nothing to run.**

Gemma is free to use through a free AI Studio key, and completely free (and limitless) when run locally. A family can make a tale every weekend without a subscription.

**Where open worked better than closed:** <!-- TODO: in one or two sentences, add a concrete moment from building this, e.g. swapping models in LM Studio, testing locally for free, or keeping photos on your machine -->

**Best Use of Gemma:** every tale is written, planned and proofread by Gemma 4 (26B-A4B and 31B), and the photos are read by Gemma too. LM Studio runs Gemma locally.

**Best Use of MongoDB Atlas:** every tale's pipeline state lives in MongoDB Atlas, which is what lets a failed step resume exactly where it stopped. We don't save user generated tales.  

**Best Use of Render:** the app is deployed as a single Render web service (`render.yaml` in the repo).
