一个简洁、紧凑、可自己托管的书签导航站。支持「个人区 / 工作区」等多分区切换,分类与书签可拖拽排序、跨分区移动,图标本地缓存、打开即读不联外网。后端同时提供 腾讯云 EdgeOne Makers(边缘函数 + Blob 存储)与 Cloudflare Workers(Worker + KV 存储)两种部署方式,无需自建服务器。
开源发布版不携带任何书签数据,首次打开是空的,由你自己添加。
点击按钮,授权 GitHub 仓库后自动部署:
EdgeOne Makers
Cloudflare Workers
Cloudflare 部署需先创建 KV 命名空间,详见下方「Cloudflare Workers 部署」。
部署完成后,控制台会提示你设置环境变量 APP_PASSWORD(即登录密码,不设置则默认 admin,请务必修改)。
- 多分区:默认「个人区 / 工作区」,可在设置里增删、重命名、拖拽或右键快速分到其他分区。
- 分类管理:左侧固定分类栏,宽度可拖拽(120–440px);分类可新增 / 编辑 / 删除 / 拖拽排序 / 右键分到其他分区。
- 书签卡片:统一宽度、紧凑排列;支持拖拽改位置、拖到分类改归属、拖到分区标签改分区。
- 图标策略:仅在「新增书签」或点「刷新图标」时抓取一次,之后只读本地缓存;再次打开页面不主动联外网(被墙站点自动回退为域名首字母占位图)。
- 右键菜单:书签 / 分类均支持右键操作(打开、编辑、删除、移动分区等),无需悬停找按钮。
- 数据可携:设置里支持一键备份(导出 JSON)/ 恢复(导入 JSON)/ 清空。
- 站点信息:首页展示站点名、作者、网址与版本号;站点名可在「设置 → 站点信息」中修改。
- 登录保护:写操作(增删改、备份恢复)需登录,Bearer Token 鉴权。
- 前端:原生
index.html+app.js(无框架、无构建步骤) - 后端 A:EdgeOne Makers 边缘函数(单文件 catch-all,
edge-functions/api/[[default]].js) + Blob 存储 - 后端 B:Cloudflare Workers(
worker/index.js) + KV 存储 - 鉴权:Web Crypto HMAC-SHA256 签名 Token
gai-nav/
├─ index.html # 前端页面与样式(两端共用)
├─ app.js # 前端逻辑(同源 + Bearer 鉴权,两端共用)
├─ edge-functions/
│ └─ api/[[default]].js # 后端 A:EdgeOne Makers 所有 /api/* 路由
├─ worker/
│ └─ index.js # 后端 B:Cloudflare Workers 所有 /api/* 路由
├─ wrangler.toml # Cloudflare Workers 配置(KV 绑定 + 静态资源)
├─ package.json # 声明 @edgeone/pages-blob(平台内置,通常无需 npm install)
├─ .env.example # 环境变量示例(APP_PASSWORD)
├─ deploy.sh / deploy.ps1 # EdgeOne 一键部署脚本
└─ LICENSE
数据文件(
data/*.json)、seed/、node_modules/、.edgeone/、.env均不在仓库内(见.gitignore)。
前置:需要一个 EdgeOne Makers API Token(在 EdgeOne 控制台 → Makers → 创建 API Token 获取)。这是平台要求,无法省略。
macOS / Linux
./deploy.sh <你的_MAKERS_API_TOKEN> [项目名]Windows (PowerShell)
.\deploy.ps1 -Token <你的_MAKERS_API_TOKEN> [-Name gai-nav]部署完成后:
- 到 EdgeOne 控制台给该项目设置环境变量
APP_PASSWORD=你的密码(不设置则默认密码为admin,请务必修改)。 - 打开站点,点右上角「登录」即可进入设置、添加书签。
- 登录 EdgeOne 控制台 → 进入 Makers。
- 新建项目,把本仓库整个文件夹拖拽上传(含
index.html、app.js、edge-functions/)。无需构建命令。 - 设置环境变量
APP_PASSWORD(同上)。 - 首次访问会自动创建 Blob 命名空间
bookmarks。
点上方「Deploy to Cloudflare」按钮会自动 fork 本仓库并用 wrangler 部署。由于 Cloudflare 要求 KV 命名空间 id 在部署前就存在,还需一步手动配置:
- 安装并登录
wrangler:npm i -g wrangler && wrangler login - 创建 KV 命名空间:
复制输出的
wrangler kv namespace create BOOKMARKS
id(形如xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)。 - 打开仓库里的
wrangler.toml,把REPLACE_WITH_YOUR_BOOKMARKS_KV_ID替换成上一步的 id。 - 重新部署(按钮部署失败的话,本地执行):
wrangler deploy
- 设置登录密码(可选,不设置默认
admin):wrangler secret put APP_PASSWORD
- 打开分配的
*.workers.dev域名,点「登录」即可使用。
数据与代码分离:书签存放在你自己的 KV 命名空间,仓库本身不含任何数据。
- 默认登录密码:
admin(未设置APP_PASSWORD环境变量时)。 - 登录后可在「设置 → 修改密码」中更改;或直接在控制台设置
APP_PASSWORD环境变量覆盖。
data/categories.json→[{id,name,sort,group,created_at}]data/bookmarks.json→[{id,category_id,title,url,icon,note,sort,group,visits,last_visit_at,created_at}]data/icons.json→{"<host>": "data:image/png;base64,...."}data/groups.json→[{id,name}]分区列表data/password.json→{"password":"..."}可选覆盖APP_PASSWORDdata/site.json→ 站点信息(名称 / 作者 / 网址)
| 方法 | 路径 | 说明 | 鉴权 |
|---|---|---|---|
| POST | /api/login |
密码登录,返回 Bearer Token | 公开 |
| GET | /api/categories |
列分类(?group= 过滤) |
公开 |
| POST/PUT/DELETE | /api/categories[/:id] |
新建 / 改 / 删(删分类级联删书签;改归属级联移书签) | 写需鉴权 |
| GET | /api/bookmarks |
列书签(?group= 过滤) |
公开 |
| POST/PUT/DELETE | /api/bookmarks[/:id] |
新建 / 改 / 删 | 需鉴权 |
| GET | /api/icon?host= |
取图标(只读缓存,无则回退字母图标) | 公开 |
| GET | /api/icons |
全部缓存图标 map | 公开 |
| POST | /api/icons/refresh |
显式刷新图标(全部或指定 host) |
需鉴权 |
| POST | /api/password |
修改登录密码 | 需鉴权 |
| GET/POST | /api/backup、/api/restore |
导出 / 导入全量 JSON | 需鉴权 |
| DELETE | /api/data |
清空全部数据 | 需鉴权 |
| GET/PUT | /api/site |
读取 / 修改站点信息 | 写需鉴权 |
| GET/POST/PUT/DELETE | /api/groups[/:id] |
分区增删改 | 写需鉴权 |
MIT © gai溜子到处跑