这是为 DEV Hacktoberfest 开源 AI 挑战赛提交的作品:第 1 周 - Touch Grass。
🌿 我构建了什么
大多数健身应用和位置游戏都在拼命争夺你的视觉注意力。它们给你明亮的地图、弹出式奖励和复杂的菜单,让你在自以为“享受自然”的时候,眼睛却牢牢粘在玻璃屏幕上。
我想要的恰恰相反。我想要一种冒险,屏幕是体验中最短暂、最不重要的部分。
来认识一下 Zero-Screen Dungeon Master(ZSDM):一款语音旁白、口袋优先的音频 RPG,由你在现实世界中的脚步推动故事前进。
一次散步是这样运作的:
选择一个冒险(或使用开源权重 Gemma AI 在本地锻造一个自定义冒险)。
戴上耳机,点击开始,然后把手机滑进口袋。
向前走。当你走过实际距离时,GPS 距离计算会触发氛围故事检查点(例如每约 80 米)。
盲选战术决策:当你到达叙事中的岔路口时,旁白会描述两条路径,你的手机在口袋里震动。无需掏出手机,你只需点击口袋里屏幕的左半边或右半边来做出选择。
Touch Grass 分数:散步结束后,应用会显示你的探险指标——精确测量你的屏幕关闭与开启了多少分钟,并奖励你一个“Touch Grass 分数”(目标是屏幕关闭时间 >90%!)。
🚀 在线演示与代码
🌐 在线 Web 应用(PWA):https://vidishagupta.github.io/zero-screen-dungeon-master/
💻 开源 GitHub 仓库:https://github.com/vidishagupta/zero-screen-dungeon-master
视频演示:https://youtu.be/JrDVzizeZKI?si=B0bG5MJPdZwKPc6o
🛠️ 我是如何构建的
该项目分为两个核心开源组件:
├── /web # 移动优先的 React + Vite PWA(通过 Service Worker 实现离线可用)
├── /forge # 本地开源 AI 生成器(通过 Ollama 使用 Gemma + Zod schema 验证)
└── /stories # Gemma 生成的交互式分支 JSON 冒险
- 零屏幕音频 UI 与离线 PWA (/web) Web Speech API (speechSynthesis):提供离线语音旁白,支持音调、语速和设备语音控制。零云端延迟,零外部语音 API 费用。 合成 Web Audio API:应用内提示音和空间音频反馈完全由数学和振荡器合成——无需下载沉重的音频资源。 自适应地理定位追踪:使用 navigator.geolocation.watchPosition 配合 Haversine 距离累积、GPS 噪声过滤和速度合理性检查(丢弃大于 6 m/s 的抖动跳变或精度大于 35m 的数据)。它在地球上任何地方都能工作,无需固定的预定义地图坐标。 口袋模式与唤醒锁:使用 Screen Wake Lock API 防止移动浏览器在步行期间挂起后台音频,并搭配超低功耗 OLED 黑色口袋覆盖层。 盲操作分屏控制:巨大的 50/50 分屏触摸区域搭配 navigator.vibrate 振动模式,让玩家可以隔着衣物或在口袋里盲点做出决策。
- Story Forge:以开源 AI 为核心 (/forge) 为了创造无尽的非线性冒险,我使用 Gemma(Google 的轻量级、高性能开源权重模型)通过 Ollama 在本地运行来构建 Story Forge。
分支冒险模式:我们强制执行严格的 Zod 模式,确保每个故事形成一个有效的有向无环图(DAG),包含检查点、每个节点 2 个二元选择,以及 3 个不同的高潮结局。
自动修复循环:如果本地模型输出有格式错误的 JSON 或损坏的图引用,forge 会自动将具体的验证错误反馈给 Gemma,实现零干预自我修正。
离线打包:部署的 PWA 预捆绑了 3 个 Gemma 冒险(The Whispering Canopy、Signal in the Rain、The Forgotten Campus Bell),并包含一个 JSON 导入器,让任何人都能在偏远小径上零网络连接加载社区锻造的故事。
// 使用 Zod 验证本地 Gemma 故事结构
export const StorySchema = z.object({
id: z.string(),
title: z.string().min(3),
theme: z.string(),
vibe: z.string(),
checkpointDistanceMeters: z.number().default(80),
intro: z.object({ text: z.string(), nextCheckpointId: z.string() }),
checkpoints: z.array(CheckpointSchema).min(3),
endings: z.array(EndingSchema).min(2)
});
🌲 真实的户外实地测试
我走过的地方:[例如,当地社区公园步道 / 大学方庭 / 社区绿化带]
天气与氛围:[例如,清爽的秋日清晨,薄雾,14°C]
发生了什么:[例如,我戴上 AirPods,选择「低语的树冠」,把手机塞进夹克口袋。当我穿行于松树间时,听着古老树林的故事徐徐展开,感觉不可思议——落叶的沙沙声与旁白完美契合。当提示音响起,示意到达检查点时,我轻拍夹克口袋左侧,选择了柳树隧道。用 9 分钟走完了 580 米,Touch Grass 得分 94%!]
💡 为什么开放创新与开源权重 AI 如此重要?
这个项目凸显了为什么开源权重、可本地运行的 AI 具有根本性的变革意义:
1.在偏远步道上的真正离线独立:当你在茂密的国家森林或峡谷中徒步,完全没有手机信号时,封闭的云端 API 根本派不上用场。Gemma 在笔记本电脑上本地运行,或打包进静态开放图谱文件中,意味着游戏永远不会中断。
2.零监控与绝对隐私:位置数据和 GPS 轨迹属于最敏感的个人数据。由于 Zero-Screen Dungeon Master 运行本地语音合成和客户端 GPS 处理,没有任何一个字节的位置数据会离开你的设备。
3.没有计量费用或 token 焦虑:Story Forge 在普通硬件上免费生成丰富的多检查点冒险,不会带来意外的 API 账单。
4.社区可修改性与微调:任何人都可以克隆仓库、分叉 forge 提示词、微调 Gemma 模型以适配本地民间传说,并与开源社区分享冒险 JSON。
🏆 奖项类别
Google Gemma:Story Forge 从一开始就设计为利用开源权重 Gemma 模型(gemma2:2b),通过 Ollama 在本地运行,并带有结构化 JSON schema 修复。
Render 部署:前端 PWA 静态部署,并通过 Render 的免费套餐向全球提供服务。
项目在 Hacktoberfest 2026「Touch Grass」挑战窗口期(2026 年 10 月)创建并开源。
这是 Hacktoberfest 开源 AI 挑战赛第 1 周:Touch Grass 的参赛作品
(https://dev.to/challenges/hacktoberfest-week1-2026-10-05)
