Bullet-AI 是一个以 Today 为入口的个人生活工作区,用于记录生活、沉淀感悟、安排目标和追踪习惯。当前版本来说,AI 只负责把大目标拆成可执行步骤,不承担泛聊天、陪伴或自动读取个人记录。
2025 年 10 月版: https://bullet-ai.vercel.app/
2026 年 1 月版:https://www.bulletai.top/
2026 年 7 月版:在 Preview 中获取新版网址来体验
- Today:聚合今日目标、当前周期习惯和近期记录。
- Moments:按发生日期组织的图文生活记录。
- Reflections:只有标题和正文的思考记录。
- Goals:待安排或安排到某天的目标,可完成、排序,并可由 AI 规划生成。
- Habits:每日或每周习惯;weekly 按用户设置的周起始日计算完成状态和连续周数。
删除采用物理删除。业务页面先隐藏记录并提供 5 秒撤销,倒计时结束后才写入删除 mutation。
Supabase Postgres 是事实源。浏览器中的 IndexedDB 是可丢弃的 90 天近期快照和持久化写队列,不是第二套业务数据库。
React feature hook
-> IndexedDB mutation + optional image Blob (atomic)
-> React Query pending overlay
-> DataSyncWorker (online + visible + Web Lock)
-> Supabase CAS write (client_id + version)
-> remote snapshot / conflict draft
- create 使用稳定
clientId,可幂等重试。 - patch/delete 使用
version做 compare-and-swap,冲突不会静默覆盖云端。 - 临时网络错误无限退避;鉴权错误暂停;永久错误和冲突在设置页可见。
- 首次读取建立 change-log 游标;后续只拉取变更行和物理删除 tombstone,并与游标一起原子写入本地快照。
- Moments/Reflections 离线保留近期快照;在线记录页用稳定 keyset 游标按页加载完整历史,不把旧页整体写入近期缓存。
- IndexedDB 有数据时先立即渲染,云端读取与队列 flush 在后台进行;过期远端响应不能覆盖较新的本地快照。
- 已同步的空集合也有持久标记,冷启动不会因为“没有行”退化成等待慢网络。
- Moment 只持久化私有 Storage 路径,签名 URL 与本地
blob:URL 只存在于内存视图。 - JSON 导出在线分页读取完整云端历史,再叠加本地 pending/conflict,并包含离线附件元数据。
详细边界和不变量见 docs/ARCHITECTURE.md。
- Next.js 15.5、React 19、TypeScript
- Tailwind CSS v4
- TanStack Query v5、IndexedDB (
idb) - Supabase Auth、Postgres、Storage、RLS
- OpenAI-compatible LLM endpoint,仅由
/api/ai服务端路由调用
pnpm install
cp .env.example .env.local
pnpm dev必填环境变量:
NEXT_PUBLIC_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
启用目标规划 AI 时还需配置:
LLM_API_KEY
LLM_BASE_URL
LLM_MODEL
创建 Supabase 项目时执行统一的数据库定义:
db/migrations/000_current_schema.sql
该文件包含完整的表、约束、索引、触发器、RLS 策略、AI 限流函数和 Moments Storage 策略。
pnpm exec tsc --noEmit
pnpm lint
pnpm format:check
pnpm migration:check
pnpm test
pnpm build安装 Docker 后还可运行真实 Supabase/pgTAP 契约测试:
pnpm test:dbdocs/requirements-analysis.md 已按当前业务重写;数据库课程报告的其他章节和 ER 材料仍可能是历史交付快照。当前实现契约以本文、docs/ARCHITECTURE.md 和数据库迁移为准。