一个免费开源、邀请制、多用户的 Pinboard 风格个人书签服务,并为登录用户提供私密便签工具。
生产主域名:https://linknote.iggcloud.com。Google OAuth 回调为 https://linknote.iggcloud.com/auth/google。
它不把“书签”“文本分享”“导航页”做成三套系统:
Entry是唯一内容类型:有 URL 是书签,无 URL 是文本;两者都支持正文、标签、搜索、隐私以及永久或临时分享。- 书签与文本共用
Entry存储和权限逻辑,但在界面中分流:书签按收藏时间展示,文本只作为登录后的独立分享工具。 - 标签是当前唯一的组织方式,分类与集合功能已经下线。
- 书签支持
private、unlisted、public三档;文本是独立的私密工具,只有“仅自己可见”和“凭特定链接访问”两档,永远不进入公开书签流或个人主页。
要求 Node.js 20+。
npm install
cp .dev.vars.example .dev.vars
npm run db:local
npm run dev打开 Wrangler 输出的本地地址,进入 /login,使用 Google 登录。
test 是迁移时创建的初始管理员,并通过 ADMIN_GOOGLE_EMAIL 绑定指定的 Google 账号。系统每天北京时间 00:00 在 /about 发布 10 个一次性邀请链接;新用户先打开邀请链接,设置一次不可修改的唯一用户名,再使用 Google 完成注册,无需站内密码。
-
登录并创建 D1:
npx wrangler login npx wrangler d1 create linknote
-
把命令返回的
database_id填入wrangler.jsonc。 -
初始化远端数据库并配置管理密钥:
npm run db:remote npx wrangler secret put GOOGLE_CLIENT_ID npx wrangler secret put GOOGLE_CLIENT_SECRET npx wrangler secret put ADMIN_GOOGLE_EMAIL npm run deploy
建议使用至少 24 个随机字符作为管理密钥。生产环境也可以在站点前叠加 Cloudflare Access。
/:所有用户按规范化 URL 去重后的公开书签/bookmarks:当前登录用户自己的书签/s/:slug:书签或文本的统一分享地址/s/:slug/raw:仅用于短文本原文,适合脚本、配置和curl/recent:兼容地址,永久跳转到//notes:当前登录用户的私密便签/settings:API Token 与导入导出/about:站点功能、使用说明和每日邀请链接/api/bookmarks/:兼容 linkding 浏览器插件的书签 API/go/:id:记录点击并跳转到书签原地址/login:Google 登录入口/invite:兼容旧地址,跳转到站点说明的邀请区域/admin:管理员处理用户、链接、分享和邀请
临时分享通过 Entry 的 expires_at 实现。过期后分享地址返回 404,数据仍保留在个人库中。
书签备注最多 2,000 个字符,文本分享正文最多 100,000 个字符;网页表单、导入和兼容 API 都执行相同限制。
书签永久保存,不提供失效时间;便签可以设置失效时间。用户可从设置页选择内置头像。
已包含:Google 登录、每日邀请、多用户数据归属、管理后台、linkding 浏览器插件兼容 API、浏览器书签导入、HTML/JSON 导出、网页 Meta 自动补全、分流展示的书签与文本、安全 Markdown、文本 raw 原文、全文搜索、标签、浏览统计、可见性控制和到期时间。
登录后进入 /settings 生成 API Token,然后在 linkding 官方插件中填写:
- Base URL:
https://linknote.iggcloud.com - API Authentication Token:刚生成的 Token
支持插件的连接检测、当前页面检查与 Meta 获取、新建或更新书签、删除书签、标签自动完成和地址栏搜索。插件的 unread、网页快照和归档字段目前以兼容默认值返回。
书签和文本的分享地址都只能由系统随机生成,生成后保持不变;书签不提供 raw,会员文本仍可使用 raw。
暂未包含:开放注册、浏览器扩展、附件和 API Token 管理。