shiori 是一个自托管的书签库,主程序 35563008 字节。加一条书签时它会把页面正文抓下来存进 sqlite,源站关掉或者断网以后仍然能读。
它解决的问题是「收藏夹攒成一堆死链」。浏览器书签只存 URL,两三年后一半打不开;稍后读类服务又把内容放在别人服务器上。shiori 把标题、正文和标签都存进一个 73728 字节的库里,跟着你走。
这次全程离线跑了一遍:本地起一个 8001 端口的页面,加 4 条书签,起服务量响应,最后打开界面看列表。加一条 0.97 秒,服务 0.57 秒可访问。
一个 35563008 字节的书签库
官方 zip 13398573 字节,解开只有 3 个条目:主程序、README 和一份 LICENSE。没有安装向导,不写注册表。
| 文件 | 字节 | 作用 |
|---|---|---|
| shiori.exe | 35563008 | 主程序,CLI 与 Web 服务同一个文件 |
| zip 整体 | 13398573 | 解压后 3 个条目 |
| 解压耗时 | 0.2 秒 | SSD 上单次 |
| 版本命令 | 182 毫秒 | 三次 201 / 182 / 175 |
CLI 与 Web 服务是一个 exe
shiori add 是加书签,shiori server 是起界面,两个子命令共用同一个 35563008 字节的可执行文件。不需要额外装 node 或者反向代理,监听端口就能用。
# 三次耗时 201 / 182 / 175 毫秒
shiori version
Shiori version 1.8.0 (build da56f82faac5bf350fc4175e5ff50726cb10d956) at 2025-09-26
版本行里带完整构建哈希和打包时间。想确认手里这份是不是官方产物,比这一行比看文件名可靠。
装之前先定数据目录
它默认把数据放在用户目录下,多份实例容易混。用一个 --storage-directory 显式指定,库和归档都在这个目录里。
| 条件 | 本次实测值 | 说明 |
|---|---|---|
| 系统 | Windows 10 22H2(19045.6466) | 官方给 Windows x86_64 包 |
| 数据目录 | --storage-directory 指定 | 不指定就落到用户目录 |
| 端口 | 8085 | server 默认 8080 |
| 授权 | MIT | 可商用,可再分发 |
日志第一行就会提示:设了 --storage-directory 会覆盖环境变量 SHIORI_DIR。两份配置都在时以命令行为准,这是排查「数据写错地方」的第一条线索。
数据目录里是 4 个归档文件加一个库
4 条书签跑完,整个数据目录是 7 个文件 237568 字节。正文快照不塞进数据库,按 id 单独存成文件,每条 32768 字节。
| 路径 | 字节 | 说明 |
|---|---|---|
| shiori.db | 73728 | 标题、URL、摘要与标签的索引 |
| archive/1 | 32768 | 第 1 条的正文快照 |
| archive/2 | 32768 | 第 2 条的正文快照 |
| archive/3 | 32768 | 第 3 条的正文快照 |
| archive/4 | 32768 | 第 4 条的正文快照 |
| 合计 | 237568 | 含 sqlite 的写前日志与共享内存各 32768 字节 |
库和归档能分开处理
73728 字节的库里只有索引,正文全在 archive 目录。拷走库不拷 archive,列表还在但那几条打不开正文;反过来只拷 archive,文件在但不知道对应哪一条。
备份就把整个目录打一个包,237568 字节一次拷完。空间紧张时可以只留库、把 archive 里不常看的那几个删掉,代价是那些条目退回「只有链接」的状态。
两个 32768 字节的临时文件
目录里那两个 32768 字节的文件是 sqlite 的写前日志和共享内存,进程活着的时候才存在。正常退出之后只剩 73728 字节的库和 archive 目录,文件数从 7 掉到 5。
归档详情页长什么样
打开 /bookmark/4/archive 看到的是这份快照,不是原站。左上角是它的标记,右上角「View Original」指回抓取时的地址,下面是当时存下来的标题和正文。
/bookmark/4/archive 归档副本,读 archive/4
http://127.0.0.1:8001/page4.html 抓取时的原址
这条测试页的正文只有 8 个汉字,抓下来也就这么多。换成真实的文章页,这里是排版好的段落、列表和图片,读起来跟原站接近,但不再依赖原站能不能开。
| 位置 | 实测内容 | 作用 |
|---|---|---|
| 左上 | 栞 shiori | 固定标记,说明这是归档副本 |
| 右上 | View Original | 跳到抓取时记下的原址 |
| 正文区 | 第 4 页 / 正文 4 | 存下来的标题与正文 |
原站那 8001 端口早就停了
截图时本地那个静态服务已经关掉,页面照样渲染。它读的是 archive/4 这个 32768 字节的文件,不发任何对外请求。

加一条书签 0.97 秒
抓一页本地静态页并归档,耗时 0.97 秒。它不是只存 URL,会把正文提取出来,命令行直接回显标题、摘要和标签。
| 步骤 | 耗时 / 结果 | 产物 |
|---|---|---|
| 加第 1 条(含归档) | 0.97 秒 | 标题、摘要、标签各一行回显 |
| 加到 4 条 | 库 73728 字节 | 数据目录共 7 个文件 |
| 服务起来 | 0.57 秒 | 8085 端口可访问 |
归档是它的主要价值
回显里那行摘要就是从页面抓的正文,不是 meta 描述。源站改版或者下线以后,库里这份还在,73728 字节里存的是 4 条书签的正文。
加书签时服务器要能访问目标地址。目标在内网或者需要登录时,抓取会失败,这时候用 -o 只存链接不抓正文。
0.57 秒起一个书签站
shiori server 起来之后浏览器打开就是界面,不需要另配 nginx,也不依赖外部数据库。默认监听 8080,这次改成 8085 避开占用。
| 项 | 值 |
|---|---|
| 启动到可访问 | 0.57 秒 |
| 数据文件 | 4 条书签共 7 个文件 |
| 数据库 | 73728 字节的单文件 sqlite |
| 依赖 | 无,exe 自带 |
登录用的是内置账号
第一次打开是登录页,账号 shiori 配密码 gopher 就能进,这是打包时的默认值。进得去说明库里已经建好了一个管理员账号。
这个默认值必须改。库文件在数据目录里,谁拿到文件就等于拿到入口;改成自己的密码再往外暴露端口。
界面就三块
登录后是卡片式列表,左边一条窄导航,顶部一个搜索框。实测 4 张卡片并排铺开,标题分别是第 4 页 / 第 3 页 / 第 2 页和一篇用来测试离线归档的页面,每张显示摘要、标签与域名。

| 区域 | 实测内容 | 用途 |
|---|---|---|
| 顶部搜索框 | 占位文字 Search url, keyword or tags | 按标题、URL 与标签一起搜 |
| 卡片列表 | 4 张卡片,倒序 | 标题与摘要直接可读 |
| 左侧竖栏 | 首页、设置、退出 | 设置里改标签与主题 |
| 卡片右上 | 编辑、删除、归档三个图标 | 鼠标移上去才出现 |
标签在卡片上是可点的
加书签时用 -t 测试,归档 给了两个标签,界面上就是两个小胶囊。点其中一个等于按标签过滤,不用回搜索框打字。
标签也跟着存进 73728 字节的库里,导出时会写进 Netscape 书签格式,换工具不丢。
四个真会踩的地方
默认账号能直接进
账号 shiori 配 gopher 是打包默认值,实测首次登录就通了。端口一旦对外,等于把书签库敞开。
重启以后登录态失效
启动日志里有一行 warning:SHIORI_HTTP_SECRET_KEY 没设,用的随机值,重启会让所有会话失效。想保持登录,把这个环境变量固定下来。
两个数据目录的优先级
命令行参数和环境变量都在时,日志明确写 --storage-directory is set, overriding SHIORI_DIR。写错一处就会看到空库。
目标抓不到就只有链接
加书签时服务器访问不到目标地址,正文抓不下来,只剩标题和 URL。内网页面、需要登录的页面都属于这类,用 -o 明确只存链接。
和浏览器书签的差别在哪
同样存 4 个页面,浏览器书签栏占的是一条记录加一个缩略图,正文不在里面;shiori 占 237568 字节,其中 131072 字节是四条正文。差别就在这 131072 字节上。
| 做的事 | 浏览器书签 | shiori v1.8.0 |
|---|---|---|
| 存标题与 URL | 存 | 存 |
| 存正文快照 | 不存 | 存,每条 32768 字节 |
| 原站下线后还能读 | 不能 | 能,走本地 archive 文件 |
| 跨机器带走 | 要登录账号同步 | 拷 237568 字节的目录 |
| 搜索范围 | 标题与 URL | 标题、URL 与标签 |
| 四条正文合计 | 不占空间 | 131072 字节 |
| 本次样本 | 4 个页面 | 4 条书签 |
它不抓图片以外的资源
归档存的是正文结构,不是整站镜像。外链图片和样式表按原地址加载,原站关掉以后图片位置是空的,文字还在。要连图一起留,得配 -o 之外的镜像方案,这一项本次没有验证。
启动日志里三行值得读
用 server 起服务时终端只打三行有用的信息,全部和「数据落在哪」有关。第一次跑就把这三行看完,后面省掉很多弯路。
--storage-directory is set, overriding SHIORI_DIR
warning: SHIORI_HTTP_SECRET_KEY not set, sessions reset on restart
listening on 127.0.0.1:8085
| 行 | 含义 | 要不要处理 |
|---|---|---|
| 第 1 行 | 命令行参数盖掉了环境变量 | 确认路径写对就行 |
| 第 2 行 | 没设密钥,会话每次重启作废 | 长期用就固定一个值 |
| 第 3 行 | 实际监听地址,这里是 8085 | 对外要改 0.0.0.0 |
一天存 20 条要占多少空间
按每条归档 32768 字节算,20 条是 655360 字节,一个月三十天约 19.6 MB。这个量级比装一个桌面客户端还小。
| 量 | 归档字节 | 折算 |
|---|---|---|
| 1 条 | 32768 | 32 KB |
| 20 条 | 655360 | 640 KB |
| 600 条(一个月 20 条) | 19660800 | 18.75 MB |
| 7300 条(两年每天 10 条) | 239206400 | 228 MB |
库本身不跟着涨那么多:73728 字节装 4 条索引,一万条也就是几兆。真正吃盘的是 archive 目录里的正文文件。
什么场景值得上
收藏技术文章、运维手册这类「过两年还要回头看」的页面最合适。4 条书签占 73728 字节,一千条也就几十兆,硬盘上不占地方。
要长期留存时,归档这份副本比书签本身值钱。源站改版、域名过期或者文章下架,书签里那行摘要还是 4 条里唯一留得下的东西。
反过来,只是存几个常去的网址,浏览器自带的书签栏够用。shiori 的价值在「内容留下来」,不在「链接记得住」。
| 项目 | 数值 |
|---|---|
| exe 字节 | 35563008 |
| zip 字节 | 13398573 |
| 加一条书签 | 0.97 秒 |
| 服务可访问 | 0.57 秒 |
| 书签条数与库字节 | 4 条 / 73728 |







