| 功能 | 描述 |
|---|---|
| 📱 响应式设计 | 支持移动端/桌面端、明亮/暗黑主题 |
| 🔍 智能搜索 | 支持书签、标签的拼音和关键词搜索 |
| 🏷️ 标签关联 | 标签间、书签与标签间的多对多关联 |
| 🔐 认证系统 | GitHub OAuth + 邮箱/密码双登录方式 |
| 👤 用户管理 | 登录用户可管理自己的书签和标签 |
- 📥 批量导入 - 导入浏览器导出的书签文件 (HTML/JSON)
- 📝 CRUD 操作 - 标签、书签的增删改查
- 🔗 标签关联 - 标签间的相互关联管理
- 📊 标签排序 - 拖拽式标签排序
- 🕷️ 元数据抓取 - 自动爬取网站标题、图标、简介
- 🤖 AI 智能解析 - AI 自动提取网站信息并推荐标签
- 🎨 主题生成 - AI 为标签分析关联标签和主题色
- 多功能卡片(天气、资讯等)
- 浏览器扩展插件
- 书签可用性检测
- 稍后阅读系统
| 类别 | 技术 |
|---|---|
| 框架 | Next.js 16 (App Router) |
| 语言 | TypeScript 5 |
| 样式 | Tailwind CSS 4 |
| UI 组件 | HeroUI + Ant Design |
| ORM | Drizzle ORM |
| 数据库 | SQLite / PostgreSQL / Turso |
| 认证 | NextAuth v5 |
| AI SDK | Vercel AI SDK |
| 测试 | Vitest |
# 1. 克隆项目
git clone https://github.com/Y80/bmm.git
cd bmm
# 2. 安装依赖
pnpm install
# 3. 启动开发服务器
pnpm dev项目将在 http://localhost:3000 启动,并自动创建 SQLite 数据库文件。
详见 .env 文件。
本地开发无需修改任何环境变量,使用默认 SQLite 配置即可。
重点关注以下变量:
| 变量 | 说明 |
|---|---|
AUTH_URL |
认证回调地址,必须与部署地址一致 |
DB_DRIVER |
数据库驱动 (sqlite/postgresql) |
DB_CONNECTION_URL |
数据库连接字符串 |
DB_AUTH_TOKEN |
Turso 数据库令牌(可选) |
BMM 使用 Drizzle ORM,开箱即用支持 SQLite 和 PostgreSQL。
# 本地自动创建数据库文件
pnpm dev# 1. 克隆项目
git clone https://github.com/Y80/bmm.git
cd bmm
# 2. 安装依赖
pnpm install
# 3. 构建项目
pnpm build
# 4. 启动(或使用 PM2)
pnpm start
# 或
pm2 start "pnpm start"-
Fork 本仓库到您的 GitHub 账户
-
登录 Vercel,新建项目并关联 Fork 的仓库
-
在 Environment Variables 页面配置环境变量
-
在 Deployments 面板重新部署即可
# 拉取镜像
docker pull lcclcc/bmm
# 启动容器(SQLite 模式,通过 docker volume bmm 查看数据库文件地址)
docker run --rm \
-e DB_DRIVER=sqlite \
-e DB_CONNECTION_URL=file:/app/volume/sqlite.db \
-v bmm:/app/volume \
-p 3000:3000 \
lcclcc/bmm \
pnpm start
# 启动容器(Turso 模式)
docker run --rm \
-e DB_DRIVER=sqlite \
-e DB_CONNECTION_URL=libsql://Turso数据库地址 \
-e DB_AUTH_TOKEN=<Turso数据库令牌> \
-p 3000:3000 \
lcclcc/bmm \
pnpm start
# 启动容器(PostgreSQL 模式)
docker run --rm \
-e DB_DRIVER=postgresql \
-e DB_CONNECTION_URL=postgresql://数据库地址 \
-p 3000:3000 \
lcclcc/bmm \
pnpm startAI 功能可大幅减少维护书签的工作量:
- 📝 网站分析 - 自动提取标题、描述、图标
- 🏷️ 智能标签 - 自动推荐相关标签
- 🎨 主题生成 - 分析标签关联和主题色
本项目支持所有 OpenAI 接口标准的服务:
- OpenAI
- DeepSeek
- Moonshot (Kimi)
- GLM (智谱)
- ......
在 .env 文件中添加:
# 示例:接入 DeepSeek
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_MODEL=deepseek-chat对于其它不兼容 OpenAI API 标准的服务(如 Gemini / Anthropic 等),可参考 AI SDK Providers 接入。
-
登录 GitHub 账户,访问 https://github.com/settings/applications/new
-
填写表单内容
重要:
Authorization callback URL必须与部署地址一致! -
创建 Client secret
AUTH_GITHUB_ID=your-client-id
AUTH_GITHUB_SECRET=your-client-secret
AUTH_URL=https://your-domain.com # 必须与 callback URL 一致
如何设置 AUTH_URL 和 GitHub Authorization callback URL?
AUTH_URL 和 GitHub OAuth App 中的 Authorization callback URL 必须一致,等于您访问 BMM 的地址:
http://localhost:3000- 本地开发https://bmm.vercel.app- Vercel 默认域名https://example.com- 自定义域名http://10.1.2.3:3000- IP 直接访问
Github 登录失败:redirect_uri 错误
错误提示:
解决方案:确保 GitHub OAuth App 中的 Authorization callback URL 与 AUTH_URL 和访问域名一致。
修改端口后回调地址有误
如果您修改了项目端口并通过 http://{IP}:{PORT} 访问,需要同步修改 AUTH_URL。
原则:访问地址 = Authorization callback URL = AUTH_URL
支持其他数据库吗?
借助 Drizzle ORM,可快速接入 MySQL 等数据库。
本项目采用 MIT 许可证。
欢迎提交 Issue 和 Pull Request!
Made with ❤️ by Y80
如果这个项目对您有帮助,请给个 ⭐ Star!






