Simon Willison用手机+Claude Code搭建iNaturalist观察记录工具
Simon Willison用手机+Claude Code搭建iNatura…
Simon Willison露营时用手机和Claude Code完成了零服务器的iNaturalist数据展示工具
Simon Willison在露营中仅用手机和Claude Code完成了一个iNaturalist观察记录展示工具。项目采用三层零服务器架构:Python CLI按时空规则聚合数据,Git Scraping通过GitHub Actions自动更新JSON数据,最后用一条prompt让AI生成交互式前端页面。该项目展示了「人类做架构决策、AI做实现细节」的高效分工模式。
背景:一次露营中的即兴开发
Simon Willison——知名开发者、Datasette 创始人——在一次周末露营中,仅用手机和 Claude Code 就完成了一个完整的自然观察记录展示工具。这个项目展示了 AI 辅助编程在移动端的实际生产力,也提供了一个值得参考的轻量级数据管道设计范例。
Simon Willison 是 Python 和数据工具领域最具影响力的独立开发者之一。他是 Django 框架的联合创始人,后来创建了 Datasette——一个将 SQLite 数据库即时转化为可交互 API 和数据浏览界面的工具。Datasette 的核心理念是「数据即发布」:任何一个 SQLite 文件都可以在几秒内变成一个可搜索、可过滤、支持 SQL 查询的 Web 应用。这种对轻量级数据工具的长期探索,直接影响了他在本项目中的架构选择——追求最小化依赖、最大化可组合性。
他的需求很简单:将自己在 iNaturalist(一个全球性的自然观察社区平台)上两个不同账号的观察记录,按时间和地点聚合后统一展示。
iNaturalist 是由加州科学院和国家地理学会联合运营的公民科学平台,截至 2024 年已积累超过 2 亿条观察记录,覆盖超过 40 万个物种。用户上传野外拍摄的动植物照片后,平台会结合计算机视觉模型和社区专家的人工审核来确定物种身份——当一条记录获得社区共识后,它会被标记为「研究级」(Research Grade),并自动同步到全球生物多样性信息网络(GBIF)等科研数据库中。这意味着 iNaturalist 不仅是一个爱好者社区,它产出的数据正在被全球生态学研究广泛引用。Simon 作为活跃用户,在多个账号上积累了大量观察记录,因此产生了跨账号聚合展示的需求。
三层架构:CLI → Git Scraping → 前端展示
整个项目的架构设计简洁而巧妙,分为三个层次,每一层都值得细看。
第一层:Python CLI 数据聚合工具
Simon 首先构建了一个名为 inaturalist-clumper 的 Python 命令行工具,用于从 iNaturalist API 拉取观察数据,并按照「时间窗口 + 地理距离」进行聚合(clumping)。默认规则是:2小时内、5公里范围内的观察记录会被归为同一组。
这种时空聚合的思路在地理信息系统(GIS)和轨迹分析领域有成熟的理论基础。地理距离的计算通常基于 Haversine 公式——它通过两点的经纬度计算球面上的大圆距离,在短距离场景下精度足够且计算开销极低。而「时间窗口 + 空间半径」的双重约束本质上是一种简化的 ST-DBSCAN(时空密度聚类)思想:不需要引入复杂的聚类库,仅通过排序和线性扫描就能高效完成分组。Simon 选择 2 小时和 5 公里作为默认阈值,恰好匹配了一次典型的户外观察活动的时空范围——这种基于领域直觉的参数设定,往往比复杂的自适应算法更实用。
这种聚合逻辑非常实用——当你在某个地点进行一次自然观察活动时,拍摄的多张照片自然会在时空上聚集,将它们归为一次「目击事件」比逐条浏览更有意义。
第二层:Git Scraping 实现自动化数据更新
Simon 使用了他自己推广的 Git Scraping 模式——通过 GitHub Actions 定时运行 CLI 工具,将结果写入仓库中的 clumps.json 文件。每次运行都会自动提交更新,GitHub 既充当了数据库,又充当了版本控制系统和 CDN。
Git Scraping 是 Simon 在 2020 年提出并大力推广的一种数据采集模式,其核心思想极其简洁:利用 GitHub Actions 的 cron 定时触发功能,周期性地运行一个脚本去抓取外部数据源,然后将结果以 JSON、CSV 等结构化格式提交到 Git 仓库中。由于 Git 天然记录每次提交的差异(diff),你不仅获得了最新的数据快照,还自动获得了完整的数据变更历史——这在监控政府公开数据、追踪价格变动、记录 API 响应变化等场景中极为有用。GitHub Actions 的免费额度(公开仓库无限制,私有仓库每月 2000 分钟)使得这种模式的运行成本几乎为零。相比传统的数据管道方案(需要部署服务器、配置数据库、设置定时任务),Git Scraping 将整个基础设施压缩到了一个 .github/workflows/ 目录下的 YAML 文件中。
这一层的精妙之处在于:GitHub 上托管的 JSON 文件天然支持 CORS 跨域访问,任何前端页面都可以直接通过 fetch() 获取数据,完全不需要额外搭建后端服务。具体来说,通过 raw.githubusercontent.com 域名访问的文件会返回正确的 Access-Control-Allow-Origin: * 响应头,允许任意来源的网页直接请求。不过需要注意的是,GitHub 的 raw 文件服务会通过 CDN 缓存,默认缓存时间约为 5 分钟(通过 Cache-Control: max-age=300 控制),这意味着数据更新后前端不会立即看到变化。对于 Simon 这种每日更新一次的场景,这个延迟完全可以接受;但如果用于需要实时性的应用,就需要考虑添加缓存破坏参数或使用 GitHub Pages 等替代方案。
第三层:一条 Prompt 生成前端页面
最令人印象深刻的部分来了。Simon 对 Claude Code 发出了一条结构清晰的 prompt,要求它生成一个 HTML 页面,功能包括:
- 从 GitHub 原始文件 URL 拉取 JSON 数据
- 使用 iNaturalist 的缩略图 URL 展示所有观察记录
- 支持
loading=lazy懒加载优化性能 - 点击缩略图时在模态框中显示大图
- 同时展示物种的常见名称
一条 prompt,一个完整的交互式前端应用。整个过程在手机上完成。
这里需要理解 Claude Code 的独特定位。与 GitHub Copilot 这类嵌入 IDE 的代码补全工具不同,Claude Code 是 Anthropic 推出的一个运行在终端中的 AI 编程代理(agentic coding tool)。它可以直接读写本地文件系统、执行 shell 命令、运行测试,并根据执行结果自主迭代修改代码。这意味着用户不需要逐行指导,只需描述目标,Claude Code 就能自主完成从创建文件到调试运行的完整流程。正因为它是基于终端而非 IDE 的,所以在手机上通过 SSH 客户端或终端应用也能完整使用——这正是 Simon 能在露营时用手机完成开发的技术前提。
技术亮点与启示
零服务器架构的运维优势
这个项目完全不需要传统意义上的服务器。数据处理由 GitHub Actions 完成,数据存储和分发由 GitHub 仓库承担,前端是纯静态 HTML。这种零服务器架构的运维成本几乎为零,却能持续稳定运行——对个人项目和小团队来说,这是性价比极高的技术选型。
这种架构思路与近年来兴起的 JAMstack(JavaScript + API + Markup)理念一脉相承。JAMstack 的核心主张是:将动态逻辑从服务器端剥离,前端通过预构建的静态资源和客户端 API 调用来实现功能。Netlify、Vercel 等平台的崛起正是这一趋势的产物。Simon 的项目可以看作 JAMstack 的一个极简实现——甚至比典型的 JAMstack 应用更轻量,因为它连构建步骤都省略了:没有 React、没有 Webpack、没有 Node.js 依赖,只有一个纯 HTML 文件直接从 GitHub 拉取 JSON 数据。这种「反复杂性」的技术选型在个人项目中尤其有价值:没有依赖就没有依赖更新的负担,没有服务器就没有服务器宕机的风险,没有构建流程就没有构建失败的可能。项目的长期可维护性因此得到了极大保障。
AI 辅助编程的高效分工模式
Simon 的使用方式值得借鉴:他并没有让 AI 从零设计整个系统架构,而是自己完成了架构设计和核心逻辑(CLI 工具、数据管道),只在最后的前端展示层交给 Claude Code 生成。这种「人类做架构决策,AI 做实现细节」的分工模式,是当前 AI 辅助编程最高效的实践方式。
这种分工模式的有效性有其深层原因。当前的大语言模型在「给定明确约束条件下生成符合规范的代码」方面表现出色,但在「跨系统的架构权衡」和「长期可维护性的设计决策」方面仍然不够可靠。例如,选择 Git Scraping 而非传统数据库、选择纯静态 HTML 而非 SPA 框架——这些决策需要综合考虑运维成本、团队规模、项目生命周期等非技术因素,而这恰恰是经验丰富的开发者的核心价值所在。Simon 的做法本质上是将问题空间分割为「需要判断力的决策」和「需要执行力的实现」,然后把后者交给 AI。这个原则不仅适用于编程,也适用于写作、设计等其他 AI 辅助工作场景。
手机编程不再是噱头
Claude Code 让「手机上写代码」变成了真实的生产力场景。在露营这种远离工作站的环境下,依然能完成一个有实际价值的项目,这对开发者的工作灵活性是实质性的提升。
总结
这个项目虽然规模不大,但它完美展示了现代开发者工具链的组合威力:Git Scraping 解决数据自动化,GitHub 充当免费基础设施,Claude Code 加速前端开发。更重要的是,它验证了一个观点——好的架构设计能让 AI 工具发挥最大价值。当你把问题拆解到足够清晰,AI 就能在每个环节给出高质量的输出。
核心要点
- Simon Willison 在露营时仅用手机和 Claude Code 完成了一个完整的 iNaturalist 观察记录展示工具
- 项目采用三层架构:Python CLI 数据聚合 → Git Scraping 自动化更新 → AI 生成前端页面,完全无需传统服务器
- Git Scraping 模式利用 GitHub Actions 定时抓取数据并存储为 JSON,GitHub 同时充当数据库和 CDN
- AI 辅助编程的最佳实践是人类负责架构设计,AI 负责具体实现,而非让 AI 从零设计整个系统
- 观察记录按「2小时内、5公里范围内」的规则自动聚合,将零散数据转化为有意义的目击事件
相关推荐
科技前沿GitHub Agent HQ发布:AI编程工具进入平台化竞争时代
GitHub Universe大会发布Agent HQ平台,统一管理编码Agent,Copilot升级支持多模型集成。同期OpenAI完成重组,Anthropic新模型测试,NVIDIA开源系列AI模型,AI编程工具格局加速整合。
科技前沿Gemini 3.5 Flash在GDPval基准上实现巨大飞跃
Google Gemini 3.5 Flash在GDPval基准测试中超越Gemini 3.1 Pro,轻量级Flash模型借助后训练技术逼近前沿水平,重新定义性能与成本的平衡点,为AI应用开发者带来重大利好。
科技前沿Google Gemini Antigravity周配额三倍提升,AI编程不再受限
Google Gemini团队再次将Antigravity周配额提升至三倍,继日配额提升后再次加码。本文解析此次配额调整对开发者的实际影响,以及在AI编程助手竞争格局中的战略意义。