title: CityQuest AI emoji: 🗺️ colorFrom: pink colorTo: blue sdk: gradio sdk_version: 6.16.0 python_version: '3.12' app_file: app.py pinned: false license: apache-2.0 short_description: AI-generated multiplayer real-world city games
tags:
Turn any city into a multiplayer real-world game. CityQuest AI generates complete, playable adventures — Scavenger Hunt, Hide & Seek, and Tag — tailored to a real location, your group size, age range, difficulty, and theme. It grounds every quest in the actual city (real districts, landmarks and parks), runs a live multiplayer room with proof-gated tasks and scoring, lets players record voice journals during play, and wraps the session up with an AI narrative recap and a generated poster.
Built for the Build Small Hackathon by Gradio × Hugging Face (June 5–15, 2026). Small models, big adventures — everything runs on models ≤ 4B parameters through llama.cpp, orchestrated on a single GPU.
| 🎮 Live App (HF Space) | https://huggingface.co/spaces/build-small-hackathon/CityQuest-AI |
| 💻 GitHub | https://github.com/NANInithin/CityQuest-AI |
| 🤖 Fine-tuned model | https://huggingface.co/NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF |
| 🏕️ Hackathon | https://huggingface.co/build-small-hackathon |
| 𝕏 **Social Media Post | https://x.com/mnbhargav8/status/2066632722664010144?s=20 |
| 🏃 Demo game run | https://www.youtube.com/watch?v=QtjaA9YZHOc |
| 🏃 Demo game recording | https://youtu.be/wyrfTrp68yw |
Constraints met
Track: primarily Thousand Token Wood (a delightful, original AI experience that gamifies real-world exploration), with strong Backyard AI relevance — it solves a real problem for friends/family: planning a fun, safe group outing in minutes.
| Sponsor | How we use it |
|---|---|
| NVIDIA Nemotron | Nemotron-3-Nano-4B (GGUF) is our core game generator |
| OpenBMB | MiniCPM5-1B (GGUF) powers the episode-recap path |
| Modal | Full LoRA fine-tuning + GGUF conversion pipeline runs on Modal A100s |
| Cohere | cohere-transcribe-03-2026 transcribes in-game voice journals |
| Badge | Status | Evidence |
|---|---|---|
| 🦙 Llama Champion (llama.cpp runtime) | ✅ Earned | Nemotron and MiniCPM run via llama-cpp-python |
| 🪙 Tiny Titan (≤4B models) | ✅ Eligible | Both LLMs are ≤4B; runs on modest hardware |
| 🎛️ Well-Tuned (fine-tuned model on HF) | ✅ Eligible | LoRA fine-tune published at NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF with a full reproducible Modal pipeline (see training/); under active development for location grounding |
| 📓 Field Notes (dev report) | ✅ Eligible | published at Teaching a 4B Model to Run a City-Wide Scavenger Hunt — Without Naming a Single Street |
gr.Timer polling (1.5s when active, eases to ~3s when idle).Everything is built around small, efficient models sequenced on a single GPU (each is loaded for its stage and unloaded to free VRAM for the next — appropriate model sizing by design):
| Stage | Model | Runtime | Notes |
|---|---|---|---|
| 🎯 Game generation | nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF | llama.cpp | Retrieval-grounded + Wikipedia city context; JSON-schema validated & repaired |
| 🗣️ Voice journal ASR | CohereLabs/cohere-transcribe-03-2026 | 🤗 Transformers | 14 languages, lazy-loaded; typed fallback |
| 📖 Episode recap | openbmb/MiniCPM5-1B-GGUF | llama.cpp | Narrative recap (deterministic template fallback for reliability) |
| 🖼️ Poster | black-forest-labs/FLUX.1-schnell | 🤗 Diffusers | Cinematic recap poster |
| 📍 Location context | Wikipedia API | — | Real landmarks/districts/parks per city |
CITYQUEST_FAST_TEST=1 runs the full pipeline without downloading any model weights.
We built a complete, reproducible pipeline to LoRA fine-tune Nemotron 3 Nano 4B on the CityQuest dataset and ship it as a GGUF — all on Modal:
app/data/<game>/dataset.json
│ prepare_dataset.py — serve-matched SFT prompts + game_schema targets (leave-one-out retrieval)
▼
training/data/*.jsonl
│ train_modal.py — transformers + PEFT LoRA on A100 (native nemotron_h + mamba kernels,
│ checkpoint/resume) → merge → GGUF Q4_K_M → upload to HF
▼
🤗 NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF
│ eval_gguf.py — schema-pass evaluation vs the stock base
Honest status: the fine-tune is published on Hugging Face and the pipeline is fully
reproducible. On evaluation it matched the base on structure but regressed on location
grounding (the synthetic training targets used generic descriptions, so it under-used the
real-city context) — so the live app currently serves the stock Nemotron base for the best
player experience. The next iteration regenerates the training targets grounded in real
landmarks. Full details in training/README.md. The fine-tuned model
can be enabled with a one-line change in app/services/generator.py.
pip install -r requirements.txt
python app.py # launches the Gradio app
# Fast smoke test (no model downloads):
CITYQUEST_FAST_TEST=1 python app.py
llama.cpp setup: see NEMOTRON_GGUF_SETUP.md.
Voice-journal ASR setup: see COHERE_ASR_SETUP.md.
llama-cpp-python) for LLM inference| Member | Hugging Face | |
|---|---|---|
| Nithin Sai Kumar Kopparapu | @NANI-Nithin | naniknsk2002@gmail.com |
| Bhargav Malasani Nagaraj | @MNbalu | mnbhargavfr@gmail.com |
Built for the Build Small Hackathon (Gradio × Hugging Face). Thanks to sponsors NVIDIA (Nemotron), OpenBMB (MiniCPM), Cohere (Transcribe), and Modal for the models, tooling and compute that made CityQuest possible.
License: Apache-2.0
72 commits
58 commits
Python
100.0%
title: CityQuest AI emoji: 🗺️ colorFrom: pink colorTo: blue sdk: gradio sdk_version: 6.16.0 python_version: '3.12' app_file: app.py pinned: false license: apache-2.0 short_description: AI-generated multiplayer real-world city games
tags:
Turn any city into a multiplayer real-world game. CityQuest AI generates complete, playable adventures — Scavenger Hunt, Hide & Seek, and Tag — tailored to a real location, your group size, age range, difficulty, and theme. It grounds every quest in the actual city (real districts, landmarks and parks), runs a live multiplayer room with proof-gated tasks and scoring, lets players record voice journals during play, and wraps the session up with an AI narrative recap and a generated poster.
Built for the Build Small Hackathon by Gradio × Hugging Face (June 5–15, 2026). Small models, big adventures — everything runs on models ≤ 4B parameters through llama.cpp, orchestrated on a single GPU.
| 🎮 Live App (HF Space) | https://huggingface.co/spaces/build-small-hackathon/CityQuest-AI |
| 💻 GitHub | https://github.com/NANInithin/CityQuest-AI |
| 🤖 Fine-tuned model | https://huggingface.co/NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF |
| 🏕️ Hackathon | https://huggingface.co/build-small-hackathon |
| 𝕏 **Social Media Post | https://x.com/mnbhargav8/status/2066632722664010144?s=20 |
| 🏃 Demo game run | https://www.youtube.com/watch?v=QtjaA9YZHOc |
| 🏃 Demo game recording | https://youtu.be/wyrfTrp68yw |
Constraints met
Track: primarily Thousand Token Wood (a delightful, original AI experience that gamifies real-world exploration), with strong Backyard AI relevance — it solves a real problem for friends/family: planning a fun, safe group outing in minutes.
| Sponsor | How we use it |
|---|---|
| NVIDIA Nemotron | Nemotron-3-Nano-4B (GGUF) is our core game generator |
| OpenBMB | MiniCPM5-1B (GGUF) powers the episode-recap path |
| Modal | Full LoRA fine-tuning + GGUF conversion pipeline runs on Modal A100s |
| Cohere | cohere-transcribe-03-2026 transcribes in-game voice journals |
| Badge | Status | Evidence |
|---|---|---|
| 🦙 Llama Champion (llama.cpp runtime) | ✅ Earned | Nemotron and MiniCPM run via llama-cpp-python |
| 🪙 Tiny Titan (≤4B models) | ✅ Eligible | Both LLMs are ≤4B; runs on modest hardware |
| 🎛️ Well-Tuned (fine-tuned model on HF) | ✅ Eligible | LoRA fine-tune published at NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF with a full reproducible Modal pipeline (see training/); under active development for location grounding |
| 📓 Field Notes (dev report) | ✅ Eligible | published at Teaching a 4B Model to Run a City-Wide Scavenger Hunt — Without Naming a Single Street |
gr.Timer polling (1.5s when active, eases to ~3s when idle).Everything is built around small, efficient models sequenced on a single GPU (each is loaded for its stage and unloaded to free VRAM for the next — appropriate model sizing by design):
| Stage | Model | Runtime | Notes |
|---|---|---|---|
| 🎯 Game generation | nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF | llama.cpp | Retrieval-grounded + Wikipedia city context; JSON-schema validated & repaired |
| 🗣️ Voice journal ASR | CohereLabs/cohere-transcribe-03-2026 | 🤗 Transformers | 14 languages, lazy-loaded; typed fallback |
| 📖 Episode recap | openbmb/MiniCPM5-1B-GGUF | llama.cpp | Narrative recap (deterministic template fallback for reliability) |
| 🖼️ Poster | black-forest-labs/FLUX.1-schnell | 🤗 Diffusers | Cinematic recap poster |
| 📍 Location context | Wikipedia API | — | Real landmarks/districts/parks per city |
CITYQUEST_FAST_TEST=1 runs the full pipeline without downloading any model weights.
We built a complete, reproducible pipeline to LoRA fine-tune Nemotron 3 Nano 4B on the CityQuest dataset and ship it as a GGUF — all on Modal:
app/data/<game>/dataset.json
│ prepare_dataset.py — serve-matched SFT prompts + game_schema targets (leave-one-out retrieval)
▼
training/data/*.jsonl
│ train_modal.py — transformers + PEFT LoRA on A100 (native nemotron_h + mamba kernels,
│ checkpoint/resume) → merge → GGUF Q4_K_M → upload to HF
▼
🤗 NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF
│ eval_gguf.py — schema-pass evaluation vs the stock base
Honest status: the fine-tune is published on Hugging Face and the pipeline is fully
reproducible. On evaluation it matched the base on structure but regressed on location
grounding (the synthetic training targets used generic descriptions, so it under-used the
real-city context) — so the live app currently serves the stock Nemotron base for the best
player experience. The next iteration regenerates the training targets grounded in real
landmarks. Full details in training/README.md. The fine-tuned model
can be enabled with a one-line change in app/services/generator.py.
pip install -r requirements.txt
python app.py # launches the Gradio app
# Fast smoke test (no model downloads):
CITYQUEST_FAST_TEST=1 python app.py
llama.cpp setup: see NEMOTRON_GGUF_SETUP.md.
Voice-journal ASR setup: see COHERE_ASR_SETUP.md.
llama-cpp-python) for LLM inference| Member | Hugging Face | |
|---|---|---|
| Nithin Sai Kumar Kopparapu | @NANI-Nithin | naniknsk2002@gmail.com |
| Bhargav Malasani Nagaraj | @MNbalu | mnbhargavfr@gmail.com |
Built for the Build Small Hackathon (Gradio × Hugging Face). Thanks to sponsors NVIDIA (Nemotron), OpenBMB (MiniCPM), Cohere (Transcribe), and Modal for the models, tooling and compute that made CityQuest possible.
License: Apache-2.0
72 commits
58 commits
Python
100.0%