Nostos:自托管的阅读、笔记与写作一体化平台
Show HN: Nostos – A self-hosted home for reading, notes, and writing
Nostos 是一个自托管的个人阅读与写作环境,将实体书、EPUB、PDF、有声书与笔记、写作整合在同一应用中,支持 [[Topic]] 双链笔记、三栏 Writing Studio 和 OPDS 导出。它提供 SQLite 存储、本地备份恢复、.nostos 库迁移文件,以及可选的 MCP 端点和 AI 服务(如 Ask Nostos、语音转文字),AI 并非核心功能所必需。
一个用于阅读、思考和写作的家。
把书籍、笔记、想法和草稿汇聚到一个相互连接的地方。
关于 • 功能 • 快速开始 • 技术栈 • 文档 • 许可证
Nostos 是一个个人阅读与写作环境,围绕一个简单的理念构建:你所阅读的内容应当能够与你所思考的以及最终所写的内容保持连接。
Nostos 没有把这一过程分散到图书馆应用、电子书阅读器、笔记系统和写作工具中,而是将整条路径保持在一起。你可以收集纸质书、EPUB、PDF 和有声书;在应用内阅读或收听;记录笔记和标注;通过主题连接想法;并在需要将阅读转化为自己的作品时,把这些材料带入 Writing Studio。
界面刻意保持克制。没有社交信息流、阅读连续天数、参与度机制或生产力评分来争夺注意力。重点始终停留在图书馆以及你用它所做的工作上。
本仓库包含 Nostos 的官方产品以及完整的公开 SelfHosted 应用。官方托管的 Nostos Cloud 服务通过一个独立的私有托管组合使用相同的产品模型和 Angular 前端。
功能
图书馆
将不同种类的书籍保存在同一个收藏中,而不把它们压平为同一种体验。
- 纸质书: 通过元数据和 ISBN 查询添加书籍,并将它们与数字书籍放在一起。
- EPUB 和 PDF: 直接在 Nostos 中存储和阅读文件。
- 有声书: 导入 M4B、M4A 和 MP3 音频,支持按章节播放。
- 收藏与筛选: 将书籍组织到嵌套收藏中,通过拖放移动它们,并按阅读状态、评分、最近时间或收藏进行筛选。
- 作品与版本: Nostos 可以使用规范化 ISBN 或标题与作者身份来归组匹配的版本。
- 免费来源获取: 从 Project Gutenberg 和 LibriVox 搜索并导入受支持的公共领域材料。导入的书籍会成为普通的 Nostos 图书馆条目,而不再依赖于来源。
查看图书馆截图
| Book Overview & Progress | Cataloging & Import |
阅读与收听
Nostos 为其存储的格式内置了阅读器,因此笔记和进度可以紧贴来源。
- EPUB 阅读器: 在浏览器中阅读 EPUB 文件,并随时从书中摘录文本。
- PDF 阅读器: 阅读 PDF、选择段落并创建标注,无需离开 Nostos。
- 有声书播放器: 收听分章节的有声书,并保存播放进度。
- 上下文笔记: 将想法附着在它们所来自的书籍上,而不是把它们移到一个互不相连的笔记文件夹中。
- 电子阅读器标注: 从设置 → 图书馆与数据导入 Kobo 数据库或 KOReader sidecar。查看目标位置,匹配现有书籍或添加缺失的书籍,并撤销导入。重复导入会保留已确认的匹配并避免重复。
大脑与主题
大脑是来自各本书的笔记开始连接的地方。
- Wiki 链接: 在笔记中使用
[[Topic]]链接来连接反复出现的想法。 - 主题视图: 以列表形式浏览主题,或在交互式图谱中探索它们之间的关系。
- 证据优先导航:从一个想法回溯到支持它的笔记和阅读材料。
- 自动清理:不再有任何引用的主题可以自动清理。
写作工作室
写作工作室将草稿和源材料带入同一个工作区。
- 三栏工作区:左侧保留项目和章节树,中间是草稿,右侧是相关源材料。
- 笔记和引文随手可得:写作时浏览库中的材料,并将有用的段落插入草稿。
- 支持 Markdown 往返的富文本编辑:TinyMCE 提供编辑界面,Turndown 保持 Markdown 转换可用。
- 自动保存:草稿更改会在后台保存。
可选 AI 辅助
Nostos 可以使用配置的 AI 服务来实现诸如 Ask Nostos 和语音转文字等功能,但核心产品并不需要 AI。
在公开的 SelfHosted 应用程序中,AI 提供商配置仍由操作员控制。托管服务可以通过其自己的私有基础设施提供托管 AI。在此仓库中,产品级接口保持提供商中立。
可移植性、备份与集成
- 可移植的库归档:导出和导入
.nostos文件,以在 Nostos 安装之间移动库数据。有关确切步骤、内容、限制、恢复行为和验证状态,请参阅库可移植性和迁移。 - 本地备份和恢复:SelfHosted 安装包含本地备份和恢复工作流,具有完整性检查和恢复保护措施。
- OPDS 导出:可配置的 OPDS 目录可以将自托管库暴露给您控制的网络上的兼容阅读器。
- MCP:一个可选的受 bearer 保护的 Model Context Protocol 端点,让兼容工具通过文档化的库契约与 Nostos 协作。
移动库
当主机声明支持迁移时,打开设置 → 库和数据 → 移动您的库。
- 导出:选择导出库,然后在准备好时选择下载归档。
- 导入:选择导入库…并选择
.nostos文件。
空目标在验证后激活。非空目标会要求您确认替换库,并保留恢复副本七天。
托管 alpha 记录了一次真实的 SelfHosted → Cloud 导入。Cloud 导出、恢复被替换的库以及 Cloud → SelfHosted 导入尚未在那里验证。此仓库中共享的设置 UI 没有恢复上一个按钮;恢复操作目前由 SelfHosted API 公开。有关详细信息,请参阅可移植性指南。
SelfHosted 和 Nostos Cloud
Nostos 是一个产品,具有两种部署模式。
SelfHosted
此仓库中的公开可执行文件本身是完整的。它使用:
- SQLite 用于关系数据
- 本地文件系统用于图书媒体
- 本地备份和恢复
- 启用 AI 功能时由操作员配置的 AI 提供商
您的库数据库和存储的媒体保留在您运行 Nostos 的机器或服务器上。联系外部服务的功能,例如公共目录导入、元数据查找或可选 AI,在使用时自然需要网络访问。
Nostos Cloud
官方托管服务将公开的 Nostos 产品与私有托管基础设施相结合,用于身份验证、租户配置、托管存储、计费、托管 AI 和运维。
可复用的产品行为、领域模型、能力契约以及面向客户的 Angular 应用首先在这里落地。托管提供商和运维方的实现保持私有。
有关架构契约,请参阅公共/私有边界 ADR和部署能力。
架构与技术栈
Nostos 被设计为单一产品,包含可复用的产品层、公开的 SelfHosted 宿主以及一个共享前端。
Nostos/
├── Nostos.Product/ # canonical product, domain, application and API behavior
├── Nostos.Backend/ # public SelfHosted host: SQLite, local files, backup, BYOK
├── Nostos.Shared/ # shared DTOs and product contracts
├── Nostos.Frontend/ # Angular application shared by SelfHosted and Cloud
└── docs/ # product, architecture and operational documentation
核心栈
- 后端:.NET 10 搭配 ASP.NET Core Minimal APIs
- 数据库:在公开的 SelfHosted 宿主中使用 SQLite 与 Entity Framework Core 10
- 前端:Angular 21 搭配独立组件和 Signals
- EPUB:
epub.js - PDF:
ngx-extended-pdf-viewer - 音频:
Howler.js - 主题图谱:Graphology、Sigma.js 和
d3-force - 编辑器:TinyMCE 搭配 Turndown 进行 Markdown 转换
- 图标:Phosphor
- 字体排版:Newsreader 和 Hanken Grotesk
- MCP:通过 ASP.NET Core SDK 支持 Model Context Protocol
快速开始
先决条件
- .NET 10 SDK
- Node.js LTS 搭配 npm
- 可选:
ffmpeg和ffprobe用于 LibriVox 有声书导入,这些文件会被组装成分章节的.m4b文件
开发
克隆仓库,安装根工具和前端依赖,然后同时启动后端和前端。
git clone https://github.com/Christian-Gennari/Nostos.git
cd Nostos
npm install
npm --prefix Nostos.Frontend install
npm startAngular 开发服务器运行在 http://localhost:4200,并将 API 请求代理到端口 5099 上的后端。
生产
npm run prod
这会构建 Angular 前端并通过 .NET 宿主提供应用服务。在浏览器中打开 http://localhost:5099。
Docker / Compose
官方 SelfHosted 镜像为 ghcr.io/christian-gennari/nostos。latest 标签仅在完整的公开产品 CI 在 main 上通过后才会发布。每个版本还会获得一个不可变的 selfhosted-sha-<commit> 标签。
容器将应用程序二进制文件保留在 /app 下,并将所有持久化的 SelfHosted 数据保留在 /data 下。不要重新定位 ASP.NET 的内容根来持久化数据:前端由应用程序的 wwwroot 提供,而 SQLite 数据库和书库存储有各自可配置的路径。
直接运行官方镜像:
docker pull ghcr.io/christian-gennari/nostos:latest docker volume create nostos-data docker run -d \ --name nostos \ -p 5099:8080 \ -v nostos-data:/data \ --restart unless-stopped \ ghcr.io/christian-gennari/nostos:latest
或使用随附的 Compose 文件:
docker compose up -d
然后打开 http://localhost:5099。命名的 nostos-data 卷包含 nostos.db、已存储的书籍和本地备份归档,因此替换容器不会替换你的书库数据。
要更新到最新的已验证 SelfHosted 镜像:
docker compose pull docker compose up -d
要固定到特定的不可变 SelfHosted 构建,请在运行 Compose 时设置其发布标签:
NOSTOS_IMAGE_TAG=selfhosted-sha-<full-public-commit-sha> docker compose up -d
selfhosted-sha-* 前缀是有意为之的。同一 GHCR 包中的历史 sha-* 标签早于托管/SelfHosted 包拆分,可能标识旧的 Cloud 制品;不要将它们用作 SelfHosted 固定版本。
Compose 在镜像替换期间会保留现有的命名卷。使用 Nostos 可移植的 .nostos 导出/备份功能作为你自有的备份和迁移路径;Docker 卷是持久化存储,不能替代备份。
如果你更愿意从克隆的源代码构建,而不是从 GHCR 拉取:
docker build --pull -t nostos:selfhosted .对于非容器安装,历史数据库位置仍为 <content root>/nostos.db,除非显式配置了 Persistence__DatabasePath。Storage__BooksRoot 和 Storage__BackupsRoot 同样可以覆盖各自的本地路径。
有关特定提供商的行为和要求,请参阅 内容提供商与获取。
设计
Nostos 采用一种编辑式的视觉语言,围绕温暖的纸张质感表面、克制的森林绿、文学化的字体排版和低装饰性的控件构建。其目标是让应用感觉更接近一个经过深思熟虑的阅读环境,而非传统的 SaaS 仪表盘。
Nostos 标志是一扇门和一个微妙的小写 n:一个森林绿(#293E32)的圆角方块,从中切出一个白色(#FFFFFF)的拱形。该标志在浅色和深色主题下保持不变。
阅读 设计宣言 了解产品的视觉和交互原则,或浏览 品牌资产。
文档
- 版本发布: Nostos 面向读者的变更。
- 版本发布: CalVer 标签和发布说明工作流。
- 设计宣言: 产品、视觉和交互原则。
- 内容提供商与获取: 外部目录的提供商架构和导入行为。
- MCP 库契约: 面向代理和工具的稳定模型上下文协议契约。
- 后端端点: REST API 参考。
- 公共/私有边界 ADR: 公共产品与官方托管组合之间的所有权边界。
- 部署能力: SelfHosted 和 Cloud 能力契约。
- 库可移植性与迁移:
.nostos归档和库传输的客户步骤、API 行为、限制和验证状态。 - SelfHosted 激活与恢复: 导入后替换库、七日恢复副本、还原、维护状态和操作员恢复。
- PostgreSQL 兼容性: 共享关系型产品模型的证据。
当前开发工作记录在 GitHub Issues 中。
许可证与商标
Nostos 根据 GNU 通用公共许可证 v3.0 或更高版本 授权。您可以在这些条款下运行、研究、修改和重新分发该软件。
Nostos 名称、相关文字商标和官方视觉标识不在 GPL 的授权范围内。分发的分支和衍生构建必须使用独立的命名和品牌。完整政策请参阅 TRADEMARK.md。
EPUB 阅读器捆绑了 Libron 字体(© Nico Verbruggen,源自 Readerly 和 Newsreader),根据 SIL 开放字体许可证 1.1 单独授权。
来源:Hacker News · github.com





