giovannibrees/travel-roamradar
GitHub: giovannibrees/travel-roamradar
一款自托管的个人旅行管理应用,将所有航班、酒店和行程汇聚在统一时间线上,支持 AI 自动导入和多维度旅行概览。
Stars: 59 | Forks: 7
# ✈️ RoamRadar - 你的个人旅行枢纽
[](LICENSE)



## 自动导入(可选)
这款应用完全可以手动使用。如果想让行程自动填充,请从应用内部(Settings)连接以下
服务 — 无需使用 Cloudflare dashboard:
- **Google Calendar & Gmail** — 在 console.cloud.google.com 上进行一次性设置
(创建项目,启用 Calendar + Gmail APIs,创建 OAuth client;
应用会显示你需要粘贴的专属 origin/redirect 值)。然后在 Settings →
**Connect Google**。行程会被写入你的日历,日历上的预订信息也会自动附加到对应行程中。
- **邮件 → 行程解析(通过 Claude)** — 在 Settings 中粘贴你自己的 Anthropic API key。
收件箱中的预订确认邮件(Booking.com、Airbnb、航空公司、
Uber…)会被自动解析为计划 — 带有门锁 PIN 码的酒店、带有航班号和起降时间的航班、接送车辆信息等。应用关闭时,**每小时的后台检查**也会处理新邮件;每日同步会执行全面检查。
- **转发任何内容**:将任何确认邮件发送给你自己,在 @ 符号前加上 **+trip**
(例如 `you+trip@yourdomain.com`),它会在一小时内被归档处理 —
无论发件人是谁。如果还没有匹配的行程,转发的
**酒店预订或返程票会自动创建行程**。归档功能具备地理感知能力(例如丰沙尔的酒店会被归入你的“马德拉群岛”行程),甚至没有明确日期的酒店消息(比如一条门锁密码通知)也会根据目的地归入正确的行程。应用内的 **Help** 会显示你的个人转发地址。
- 支持 **Calendly** 作为 Worker secret(参见 `docs/dev.vars.example`)。
相比于应用内的 key,更喜欢使用 dashboard secrets?所有凭证也都可以通过
`wrangler secret put` 进行设置 — dashboard secret 的优先级始终高于应用内的副本。
## 工作原理
- `travel-app.html` / `public/index.html` — 前端(单文件,vanilla JS)。
- `worker.js` — Cloudflare Worker:提供应用服务,通过密码进行保护,
运行可选的 Google Calendar + Gmail 导入功能,并将
所有数据存储在一个 KV namespace (`TRIPS`) 中。
- `wrangler.toml` — Worker 配置:包含 KV 绑定,每天执行一次全面同步
(18:00 UTC) 以及每小时的邮件专项检查 — 应用内的 **Sync** 按钮可按需运行完整任务。
```
Trip: { id, from, to, start (YYYY-MM-DD), end, label, notes, segments[] }
```
## 隐私
所有数据都存储在**你的** Cloudflare 账户中:你的行程存储在你的 KV 中,你的 key 位于
你的 Worker 上,并受密码保护。此代码仓库的维护者无法
访问你的实例或你的数据。
### 匿名安装计数
唯一的例外是一个很小的情况:在首次设置时(即你创建密码的那一刻),你的实例可能会发送 **一次** 匿名 ping —
实际上就是 `{ "id": "<一个随机的 128 位数字>" }`,除此之外不包含任何其他信息 — 发送给维护者运行的
一个小型计数器 Worker,仅仅是为了让他们大致了解有多少人在使用这个模板。
事情的全部就是这样。**不发送、不跟踪、不记录任何行程、邮件、key、姓名、位置 — 除了那个随机数字之外,绝没有任何其他数据在任何时间、出于任何原因被发送或提供给任何人。** 该 id 无法追踪到你;它的存在只是为了防止你的实例被重复计数。
要查看当前的总数,请在浏览器中打开 `https://.workers.dev/count?key=`
— 这是一个纯文本页面,只显示数字,没有其他可解析的内容。
双方的代码都是公开的:ping 操作是 `worker.js` 中的 `pingInstallCount()`,而接收它的
计数器代码就是 `counter/counter-worker.js` 的全部内容 — 区区五行代码,用于存储 id 和总数,
别无其他。
它**默认是关闭的** — `TELEMETRY_URL` 在 `wrangler.toml` 中默认留空,
这意味着绝对不会产生任何网络调用,除非你自己部署了计数器并将它的 URL 填进去。如果你是从某个公开克隆的代码仓库部署的,且该仓库已经有人(例如维护者)填入了这一行,这意味着你的实例也会参与统计;将该行留空,或者删除 `worker.js` 中的那个 `ctx.waitUntil
(pingInstallCount(env))` 调用,即可完全退出 — 无论如何,应用中的其他任何功能都不依赖于它。
## 常见问题解答
**RoamRadar 是免费的吗?**
是的。它是开源且自托管的 - 你可以在自己的
Cloudflare 账户上运行自己的副本,个人使用完全免费。
**我的旅行数据存储在哪里?**
存储在你自己的 Cloudflare KV 中,受你自己的密码保护。不会向任何共享服务器发送任何数据,代码仓库作者也无法查看你的行程。
**我必须连接我的邮箱或日历吗?**
不需要。RoamRadar 完全可以手动使用。连接 Google Calendar 和 Gmail 是
可选的,仅仅是为了让你的行程根据现有的预订信息自动填充。
**RoamRadar 是用什么构建的?**
由单个 Cloudflare Worker 提供的 vanilla-JavaScript 前端,并使用了一个 KV
namespace 进行存储。没有框架,没有构建步骤。
**谁开发了 RoamRadar?**
[Giovanni Brees](https://www.giovannibrees.com),一位创始人和 AI-first 创业者。
他的 AI 开发 agent 从零开始构建了这款应用,并由 Claude
Fable 和 Codex 进行了代码审查,Claude 负责了视觉设计。
## 作者
由 **[Giovanni Brees](https://www.giovannibrees.com)** 创建 - 他是一位创始人和
致力于在 AI agents 与自动化前沿领域进行开发和写作的 AI-first 创业者。RoamRadar 是他利用 AI agents 开发完整且实用软件的实验之一。
- Website: https://www.gannibrees.com
- LinkedIn: https://www.linkedin.com/in/giovannibrees/
- Podcast, *The Zero-Employee Company*: https://open.spotify.com/show/033TuF4FmEurDDvBZlOAYr
## 许可证
[PolyForm Noncommercial 1.0.0](LICENSE) — 可免费运行、修改和自托管,仅限于
任何**非商业**用途。不得将其出售或用于商业用途。
更喜欢使用命令行?(可选)
``` git clone https://github.com/giovannibrees/travel-roamradar && cd travel-roamradar npm i -g wrangler && wrangler login wrangler kv namespace create TRIPS # paste the id into wrangler.toml wrangler deploy ```标签:AI代理, 后端开发, 旅行应用, 时间线, 程序员工具, 自托管, 高对比度