收纳、整理、搜索与分享网站书签的开源全栈应用。
面向个人与团队的书签管理器,支持公开展示、用户空间、后台维护,以及 AI 辅助整理流程。
<a href="https://bmm.lccl.cc/" target="_blank">在线体验</a> ·
<a href="https://github.com/Y80/bmm" target="_blank">GitHub</a> ·
<a href="#quick-start">快速开始</a>
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT">
<img src="https://img.shields.io/badge/Next.js-16-black?logo=next.js" alt="Next.js 16">
<img src="https://img.shields.io/badge/React-19-149eca?logo=react" alt="React 19">
<img src="https://img.shields.io/badge/TypeScript-5-blue?logo=typescript" alt="TypeScript 5">
<img src="https://img.shields.io/badge/Drizzle_ORM-0.44-green" alt="Drizzle ORM">
简体中文 | English

BMM 是一个用于管理网站书签的开源应用。它把“收藏网页”“按标签整理”“公开展示优质网站”“在后台持续维护数据”放到同一套系统里,并为书签录入提供自动抓取与 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 供应商在管理员后台配置,不需要环境变量。
| 变量 | 用途 |
|---|---|
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,可选 |
BMM 目前直接支持 SQLite、PostgreSQL 与 Turso。
DB_DRIVER 与 DB_CONNECTION_URL。docker-compose.yml 作为 PostgreSQL 场景示例。如果你只想检查数据库状态,可以执行:
pnpm db:test
pnpm db:migrate
git 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
AUTH_URL 与 GitHub OAuth 回调地址是否一致。AI 能力用于减少书签录入与整理的手工操作,当前主要覆盖:
项目通过 Vercel AI SDK 接入 OpenAI-compatible 服务。管理员登录后台后,可在「大模型供应商」页面维护站点级供应商配置,并选择当前启用的供应商。
支持范围包括 OpenAI-compatible 提供商,例如 OpenAI、DeepSeek、Moonshot、GLM 等。若接入非 OpenAI-compatible 服务,可参考 AI SDK Providers。
[!IMPORTANT]
AUTH_URL、GitHub OAuth App 的Authorization callback URL、以及用户实际访问 BMM 的地址必须保持一致。
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:3000GitHub 登录提示 redirect_uri 错误怎么办?
优先检查以下三者是否完全一致:
Authorization callback URLAUTH_URL问题示例截图:

修改端口或改成通过 IP 访问后,登录回调不正确怎么办?
只要访问地址发生变化,就要同步修改 AUTH_URL 和 GitHub OAuth App 中的回调地址。
支持更多数据库吗?
当前仓库直接适配的是 SQLite / PostgreSQL / Turso。由于使用了 Drizzle ORM,继续扩展其他数据库的成本相对可控,但需要补充对应 schema 与驱动实现。