回放与搜索 AI 编程助手对话记录的 SaaS 平台
多源解析 · 全文搜索 · 会话回放 · 增量同步
Pika 是一套自托管 SaaS,用于收集、搜索和回放你与 AI 编程助手的对话记录。CLI 工具自动解析本地 5 种 AI 工具的会话文件,增量同步到云端;Web 仪表盘提供全文搜索(FTS5)和逐条消息回放。
┌──────────┐ ┌────────────────────────────────┐
│ CLI │────▶│ pika.hexly.ai │
│ pika │ │ ┌─────────────┐ ┌─────────┐ │
└──────────┘ │ │ Web SPA │ │ /api/* │ │
│ │ (assets) │ │ Hono │ │
│ └─────────────┘ └────┬────┘ │
│ Cloudflare Worker │ │
└────────────────────────┼───────┘
▼
┌──────────────────┐
│ D1 + R2 │
│ metadata + FTS5 │
│ + gzip blobs │
└──────────────────┘
整个站点是 一个 Cloudflare Worker:静态 SPA 资源 + /api/* Hono 子应用同进程同源。鉴权前置 Cloudflare Access(人)+ pk_* API token(CLI)。
- 增量同步 — 基于文件指纹(inode/mtime/size)跟踪变更,仅解析和上传新增内容
- 5 种数据源 — Claude Code、Codex CLI、Gemini CLI、OpenCode(JSON + SQLite)、VSCode Copilot(CRDT JSONL)
- 浏览器认证 — 通过 dashboard
/dashboard/settings/cli创建pk_*token,写入~/.config/pika/ - 并行上传 — metadata 批量 POST + content gzip PUT(presign 直传 R2 或 worker proxy 兜底),并发控制 + 失败回滚
- 全文搜索 — D1 FTS5 索引,结果高亮(
<mark>,XSS 安全),⌘K全局搜索 - 会话回放 — 逐条浏览完整对话,包含代码块、工具调用等结构化内容
- 收藏与标签 — 为重要会话加星标或自定义标签分类
- 软删除回收站 — 误删可恢复
- Token 管理 — 创建、命名、撤销 CLI API token
- Cloudflare Access JWT — 浏览器端通过
nocoo.cloudflareaccess.comSSO,workeraccessAuth中间件验签 - API token 哈希存储 — SHA-256;
pk_*明文仅创建时显示一次 - Gzip 解压上限 — Worker 端流式追踪解压大小,超过 256 MB 自动截断
- Ingest 体积限制 — 内容上传 50 MB,metadata 2 MB,无 Content-Length 直接拒绝(411)
- 本地配置权限 —
~/.config/pika/文件权限 0600
bun install -g @nocoo/pika
pika login # 打开 dashboard 创建 token,粘贴回 CLI
pika sync # 解析本地会话并上传| 命令 | 说明 |
|---|---|
pika login |
打开浏览器到 token 管理页,引导粘贴 pk_* |
pika sync |
解析本地会话并上传到云端 |
pika sync --source claude-code,codex |
仅同步指定来源 |
pika sync --no-upload |
仅本地解析,不上传 |
pika status |
查看同步状态和各来源文件数 |
pika/
├── packages/
│ ├── core/ # 共享类型、常量、校验器
│ ├── cli/ # @nocoo/pika
│ ├── web/ # Vite + React SPA(构建到 ../web-worker/dist)
│ └── web-worker/ # 单 Worker:[assets] SPA + /api/* Hono
│ └── src/
│ ├── api/ # sessions / projects / tags / search / stats / ingest
│ ├── routes/ # me / auth-cli / auth-tokens
│ ├── middleware/ # accessAuth → apiKeyAuth → resolveUser
│ └── lib/ # env、resolve-user、R2Client
├── scripts/
│ ├── migrations/ # D1 schema migrations (001–006)
│ └── dev-all.ts # 并发启动 web (vite :7022) + worker (wrangler :8787)
├── docs/
│ └── 00-architecture.md # 当前架构与部署
└── .github/workflows/
└── ci.yml # quality (base-ci) + CD (wrangler deploy)
| 层 | 技术 |
|---|---|
| 运行时 | Bun |
| 语言 | TypeScript (strict) |
| CLI | citty + consola |
| Web | Vite + React 19 + React Router |
| UI | Tailwind CSS v4 + shadcn/ui + Recharts |
| 边缘 | Cloudflare Workers + Hono |
| 认证 | Cloudflare Access (人) · pk_* API token (CLI) |
| 数据库 | Cloudflare D1 (SQLite + FTS5) |
| 存储 | Cloudflare R2 (gzip blobs,canonical + raw) |
| 测试 | Vitest + Bun test |
| CI/CD | GitHub Actions (nocoo/base-ci) + wrangler deploy |
git clone https://github.com/nocoo/pika.git
cd pika
bun install
bun run dev:all # vite :7022 + wrangler dev :8787| 命令 | 说明 |
|---|---|
bun install |
安装依赖(自动配 husky) |
bun run dev:all |
启动 web (Vite :7022) + web-worker (wrangler :8787) |
bun run build |
构建 SPA 到 packages/web-worker/dist |
bun run lint |
tsc --noEmit (root + web + web-worker) |
bunx vitest run --coverage |
测试 + 覆盖率 |
单 Worker 拓扑:构建产物即部署产物。bun run build 把 SPA 打到 packages/web-worker/dist/,wrangler deploy 上传 worker + assets。
| 环境 | Worker 名 | 域名 |
|---|---|---|
| prod | pika |
pika.hexly.ai · pika-ingest.worker.hexly.ai(旧 CLI 兼容) |
| test | pika-test |
pika-test.hexly.ai |
CI/CD(.github/workflows/ci.yml)在 push to main 时自动跑 quality gate(typecheck + L1 + biome + gitleaks + osv)然后 wrangler deploy --env=""。需要 repo secret CLOUDFLARE_API_TOKEN。
| # | 文档 | 说明 |
|---|---|---|
| 00 | Architecture | 拓扑、鉴权链路、数据模型、部署、运维 |
MIT © 2026 Zheng Li
