DEV Community

Cover image for Pandal Quest: A Local-First Guide to Durga Puja Nights
Arpan Sarkar
Arpan Sarkar

Posted on Edited on

Pandal Quest: A Local-First Guide to Durga Puja Nights

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass

What I Built

Durga Puja is a Hindu festival celebrating the goddess Durga. In Kolkata, it transforms the city: neighborhoods build elaborate, temporary shrines called pandals, and people spend several days visiting them, admiring the art, meeting friends, and celebrating together.

The magic can come with a less magical detail: getting stuck in a 9 pm crowd at College Square with no mobile signal—and a phone glowing in your face.

Kash phool—the white, feathery grass that flowers around this time—is one of the signs that Pujo is near. A whole field turns white, and Kolkata remembers it has a body. Satyajit Ray put that grass in Pather Panchali. UNESCO added Kolkata’s Durga Puja to its Intangible Cultural Heritage list in 2021. My mother still says ঠাকুর দেখা (thakur dekha): literally, ā€œseeing the deity,ā€ but really, going to visit a pandal as if you were going to see a person.

I built Pandal Quest for that week.

You describe your evening the way you might tell a friend who knows your neighborhood, or para. For example: ā€œI’m taking my parents from Shyambazar on Saptami around 5. Short walks, no long queues, and they really want to see Kumartuli.ā€ Saptami is the seventh day of the festival.

A local copy of Gemma 4 turns that sentence into a structured request. A route planner that is not allowed to invent places then builds a walking route, treating queues as a real cost. After that, the app tries to disappear.

Pocket mode turns the screen black while keeping GPS active. A synthesized dhak—a traditional Bengali drum—plays when you arrive. A pandal’s story unlocks only when you’re standing nearby. At the end, you get a Touch Grass receipt: time spent looking at the city compared with time spent looking at your screen.

It’s for the family that can’t manage College Square at 10 pm. For someone walking North Kolkata alone on Navami—the festival’s ninth day—because the lanes are the point. And for anyone who can’t be in the city but still wants to experience the shape of a Pujo night.

I’m Bengali. This is the week I want the phone to shut up.

Plan in thirty seconds. Walk all night.

Demo

There’s no hosted demo, and that’s intentional: the language model runs on the computer serving the app. Nothing you type is sent to a remote AI service.

ollama serve
ollama pull gemma4:e2b
npm install
npm run dev
Enter fullscreen mode Exit fullscreen mode

Then open http://127.0.0.1:4317.

The GIF shows a desk run. I tapped Parents, short walks, started the demo walk (it’s clearly labelled, so its stamp stays honest), switched on Pocket mode, unlocked the first story, and finished on the receipt.

A desk run: the route, the black screen, the stamp, the receipt

One Example Evening

Here’s a sample route starting at Shyambazar Metro at 5:00 pm on Saptami: four pandals, 3.0 km of walking, and an estimated 37 minutes of queue time—rather than aiming for the 9 pm crush. The planner estimates that this route avoids about 20 minutes of waiting.

Those crowd curves are heuristics, not live crowd data. The app says so because an estimate should never pretend to be a measurement.

Four stops, and the hour each queue swells

Demo walk. The blue dot moves. The dhak is for the real street.

Pocket mode. The screen stays awake. The eyes do not.

The story doesn’t appear until you arrive. It was written ahead of time by the local model and saved in the app, so a dead mobile tower can’t take it away.

You're here. Shyambazar Nabin Sangha. One question, then pocket it.

Touch Grass receipt. This one caught me looking at glass.

Read that receipt honestly: one pandal, 150 metres, 1 second looking at the city and 6 seconds looking at the phone. I was at a desk, and I ended the walk to take the screenshot. On the street, the phone goes in the pocket and those numbers should swap. The calculation doesn’t change. The receipt is there to make the screen time a little embarrassing.

I also got the trivia question wrong. I tapped Shiva. The card marked Durga in green and marked the stamp ā€œmissed.ā€ Good. A Pujo app that lets you talk your way out of an answer isn’t much of a Pujo app.

The stamp you only get by showing up. Demo, and it says so.

One detail in the corner of every screenshot matters: Rules mode. Ollama wasn’t running when I took these. A small local parser understood ā€œparents, Shyambazar, Saptami, 5 pm, no queues, Kumartuli,ā€ and the route solver built the plan in a few tens of milliseconds.

When Gemma is running, the label says Gemma 4 Ā· local, and the evening guide is written from the solver’s numbers. If you have the model installed, retake the home-screen screenshot so the label matches your setup—and consider using it as the cover image.

Code

GitHub logo iambetaraybill / pandal-quest

Plan in thirty seconds. Walk all night. A Durga Puja companion for Kolkata, powered by local Gemma 4.

Pandal Quest

Plan in thirty seconds. Walk all night.

A Durga Puja pandal-hopping companion for Kolkata. You describe the evening the way you’d tell a friend — Saptami with my parents from Shyambazar, nothing with a long queue, Kumartuli is a must. A local copy of Gemma 4 turns that into a typed request. A deterministic planner then builds a walking route that treats queues as a first-class cost. Then the app tries to disappear.

Pocket mode keeps GPS alive on a black screen. A synthesised dhak drum plays when you arrive. Each pandal’s story card unlocks only when you’re standing there. At the end you get a Touch Grass receipt: minutes looking at Durga versus minutes looking at glass.

Built for the DEV.to Hacktoberfest Open-Source AI Challenge, week 1 — Touch Grass. The screen is the shortest part of the night.

Why this, and why open

Kash…




MIT. Node 20 or newer. Ollama is optional for the walk and required for the voice of the thing.

How I Built It

The model understands the request. Code computes the route.

Gemma 4 E2B runs through Ollama on the same machine that serves the app. There’s no API key or usage meter. You can choose a different local model with PANDAL_QUEST_MODEL.

Gemma is good at understanding a request like, ā€œWe’re a family, we hate queues, and we want to start at Shyambazar.ā€ It’s not the right tool for guaranteeing that a route fits within three hours or avoids the busiest part of the evening.

So the model returns structured JSON. Every pandal name is checked against a curated list of 38 stops. If a name isn’t on that list, it’s dropped instead of being invented and placed on the map.

Then a route solver uses beam search to explore possible stop orders and 2-opt to improve the route. It considers walking time, estimated crowd levels, and the time available. Gemma can write a short guide, but only from the solver’s results—not from facts it makes up.

The crowd estimate uses popularity, the type of puja, the time, and the day. Ashtami morning anjali—prayers offered to the goddess—is handled as its own case. This is not a camera watching the streets. I’d rather admit the estimate may be wrong than pretend I have live crowd data.

Story cards are generated ahead of time with npm run stories (add --lang bn for the Bangla pack) and saved in the repository. If a card is missing, the app uses a curated fallback. Ask Dhaki is Gemma with tools: it can answer using crowd estimates, distances, and nearby metro stations. If the model isn’t running, Dhaki says so. Planning and walking still work.

The rest is deliberately ordinary: Next.js, React, TypeScript, Leaflet, and a service worker that keeps the app shell and previously viewed map tiles available offline. Change a preference chip and the route is recalculated in the browser. The cost to run is $0.

Two unglamorous bugs turned up while I was preparing the screenshots.

CARTO’s keyless Voyager map tiles started returning an ā€œAPI key requiredā€ message. The map was a red route line on top of a warning. I switched to Esri’s World Street Map tiles and included their attribution in the corner. The pandal locations still come from OpenStreetMap.

Pocket mode also lost a fight with Leaflet. Leaflet’s map layers use high z-index values, while my black screen was set to 50, so the map showed through. I moved the black screen above those layers. Now the black screen wins—which is the whole point.

I used a coding agent for much of the build. That agent runs on someone else’s model, in a session that eventually ends. The Gemma that plans the evening runs on the laptop. They’re different machines, and I want the second one to be available on the street.

Why Does Open Innovation Matter?

I’ve stood at College Square with a full battery and no signal, watching people hold their phones above their heads as if a little extra height could find a network. Pujo crowds can overwhelm mobile service. A closed API is an expensive way to fail at exactly the moment you need it.

An open-weight model made this kind of walk possible:

  • Your plans stay local. The sentence about your parents doesn’t have to leave your laptop. A night out shouldn’t become a prompt log.
  • The walk can work offline. Stories are generated ahead of time and packed into the app, so the experience doesn’t disappear when the network does.
  • The app still works without the model. A small rules-based parser and a plain-text guide can plan the route. The solver stays the same; the app simply offers less.
  • You can change the model. One environment variable can point the app to another local model. You don’t have to rent access just to understand a sentence.
  • There’s no usage bill. A family can run it on a computer they already own. There’s no meter on ঠাকুর দেখা.
  • The model has limits. It can’t invent a pandal and add it to the map. The curated list and route solver set that boundary.

A closed model might write a smoother paragraph. It can’t reliably sit in your pocket at 10 pm when the network fails—and it may charge you for every request. Kash phool doesn’t need an API key. The walk shouldn’t either.

An open model, a closed pocket.

My Agent Session

I don’t have a public DevRelay session to embed. The repository is the record: the 38 stops, the crowd clock, the Gemma layer, and the walking experience. If I save a session before the deadline, I’ll replace this paragraph with the embed.

Prize Category: Best Use of Gemma

Gemma is the language layer of the app. It turns a natural-language plan into a typed request, writes a guide from the solver’s results, generates story cards ahead of time, and powers Ask Dhaki’s tool-assisted answers about crowds, distances, and metro stations.

The route, geofence, dhak, and receipt are ordinary code by design. A language model should not be trusted to guess how long a queue will take.


Shashthi, the sixth day of Durga Puja, is only a few days away. If you’re in Kolkata, take this outside. If you’re not, the demo walk can still show you the shape of the night. Either way, look up.

Top comments (0)