简体中文 | English
BMM 是一个用于管理网站书签的开源应用。它把“收藏网页”“按标签整理”“公开展示优质网站”“在后台持续维护数据”放到同一套系统里,并为书签录入提供自动抓取与 AI 辅助能力。
你可以把它当作:
- 个人书签仪表盘
- 团队内的知识导航站
- 对外公开的优质网站目录
- 公开页、用户空间、管理后台三套使用场景共存,适合从个人使用逐步扩展到公共导航站。
- 支持导入浏览器导出的书签文件,能把目录结构转为标签关联,降低迁移成本。
- 支持标签与书签的多对多关系、拖拽排序、关键词检索与拼音检索。
- 自动抓取网站标题、描述、图标,并补充常见图标路径探测能力。
- 支持 GitHub OAuth 与邮箱密码登录。
- 通过 AI 自动分析网站信息、推荐标签,并为标签生成关联建议与主题色。
- 响应式界面同时覆盖桌面端与移动端,支持亮色与暗色主题。
- 多功能卡片,例如天气与资讯
- 浏览器扩展插件
- 书签可用性检测
- 稍后阅读系统
| 类别 | 技术 |
|---|---|
| 框架 | Next.js 16 + React 19 |
| 语言 | TypeScript |
| 样式 | Tailwind CSS 4 |
| UI | HeroUI + Ant Design |
| 数据库 | SQLite / PostgreSQL / Turso |
| ORM | Drizzle ORM |
| 认证 | NextAuth v5 beta |
| AI | Vercel AI SDK + OpenAI-compatible provider |
| 测试 | Vitest |
Tip
首次本地启动默认使用 SQLite。pnpm dev、pnpm build 和 pnpm start 都会先执行数据库初始化脚本,通常不需要手动建库。
git clone https://github.com/Y80/bmm.git
cd bmm
pnpm install
pnpm dev启动后访问 http://localhost:3000。
| 命令 | 说明 |
|---|---|
pnpm dev |
启动开发环境,并在启动前执行数据库初始化 |
pnpm build |
生产构建 |
pnpm start |
运行生产构建 |
pnpm lint |
执行 ESLint |
pnpm test |
运行 Vitest 测试 |
pnpm db:test |
检查数据库是否可连接 |
pnpm db:migrate |
生成并执行数据库迁移 |
pnpm db:push |
直接根据 schema 推送数据库变更,可能导致数据风险 |
pnpm studio |
打开 Drizzle Studio |
完整示例可参考 .env。
Tip
如果你只想先把项目跑起来,本地开发通常只需要默认 SQLite 配置。AI 能力与 GitHub 登录都属于按需开启。
| 变量 | 用途 |
|---|---|
DB_DRIVER |
数据库驱动,支持 sqlite 或 postgresql |
DB_CONNECTION_URL |
数据库连接串 |
DB_AUTH_TOKEN |
Turso 或 libsql 场景的令牌,可选 |
AUTH_URL |
当前站点访问地址,OAuth 回调与部署时会用到 |
AUTH_SECRET |
NextAuth 密钥,生产环境建议配置 |
AUTH_GITHUB_ID |
GitHub OAuth Client ID,可选 |
AUTH_GITHUB_SECRET |
GitHub OAuth Client Secret,可选 |
OPENAI_API_KEY |
AI 服务密钥,可选 |
OPENAI_BASE_URL |
OpenAI-compatible 服务地址,可选 |
OPENAI_MODEL |
AI 模型名称,可选 |
BMM 目前直接支持 SQLite、PostgreSQL 与 Turso。
- 本地默认方案是 SQLite,数据库文件会在首次运行时自动初始化。
- 切换到 PostgreSQL 或 Turso 时,只需要调整
DB_DRIVER与DB_CONNECTION_URL。 - 仓库内提供了
docker-compose.yml作为 PostgreSQL 场景示例。
如果你只想检查数据库状态,可以执行:
pnpm db:test
pnpm db:migrategit clone https://github.com/Y80/bmm.git
cd bmm
pnpm install
pnpm build
pnpm start项目自带 Dockerfile。下面示例使用 SQLite 挂载数据卷:
docker build -t bmm .
docker run --rm \
-e DB_DRIVER=sqlite \
-e DB_CONNECTION_URL=file:/app/volume/sqlite.db \
-v bmm:/app/volume \
-p 3000:3000 \
bmm- Fork 本仓库并导入到 Vercel。
- 在项目的 Environment Variables 中配置数据库、认证和可选的 AI 参数。
- 完成部署后,重新核对
AUTH_URL与 GitHub OAuth 回调地址是否一致。
AI 能力用于减少书签录入与整理的手工操作,当前主要覆盖:
- 自动分析网站标题、描述与图标
- 为书签推荐相关标签
- 为标签生成关联建议与主题色
项目通过 Vercel AI SDK 接入 OpenAI-compatible 服务,典型配置如下:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_MODEL=deepseek-chat支持范围包括 OpenAI-compatible 提供商,例如 OpenAI、DeepSeek、Moonshot、GLM 等。若接入非 OpenAI-compatible 服务,可参考 AI SDK Providers。
Important
AUTH_URL、GitHub OAuth App 的 Authorization callback URL、以及用户实际访问 BMM 的地址必须保持一致。
- 访问 https://github.com/settings/applications/new 创建 GitHub OAuth App。
- 将回调地址设置为
https://your-domain.com/api/auth/callback/github形式。 - 在环境变量中配置:
AUTH_GITHUB_ID=your-client-id
AUTH_GITHUB_SECRET=your-client-secret
AUTH_URL=https://your-domain.com如需排查配置错误,可参考下面两张截图:
AUTH_URL 应该填写什么?
它应该等于用户访问 BMM 的实际地址,例如:
http://localhost:3000https://bmm.vercel.apphttps://example.comhttp://10.1.2.3:3000
GitHub 登录提示 redirect_uri 错误怎么办?
优先检查以下三者是否完全一致:
- GitHub OAuth App 中的
Authorization callback URL - 环境变量
AUTH_URL - 用户实际访问 BMM 的地址
问题示例截图:
修改端口或改成通过 IP 访问后,登录回调不正确怎么办?
只要访问地址发生变化,就要同步修改 AUTH_URL 和 GitHub OAuth App 中的回调地址。
支持更多数据库吗?
当前仓库直接适配的是 SQLite / PostgreSQL / Turso。由于使用了 Drizzle ORM,继续扩展其他数据库的成本相对可控,但需要补充对应 schema 与驱动实现。






