Skip to content

Repository files navigation

Notopolis

把本地 Obsidian 知识库渲染成一座手绘涂鸦风的 2D 城邦——写笔记就是建设城市,笔记之间的链接就是城中的道路。一座"活的知识景观"。

Notopolis(note + polis)是一个纯本地运行的 Web 应用:它扫描你的 Obsidian vault,按确定性规则把笔记映射成建筑、目录映射成城区,实时渲染成一张可缩放、可漫游的城市地图。没有主动玩法——城市的样貌完全由你的知识库结构与新鲜度决定。

映射规则

知识库 城邦
一篇笔记 一栋建筑(体量随字数)
顶层目录 一个城区(不规则有机边界)
README 区府 🏛
被引多的笔记 地标 ⭐
- [ ] 未完成任务 施工中的工地 🚧
久未修改的笔记 墨迹褪色的老建筑
笔记数量 营地 → 村镇 → 城市 → 都城

同一个 vault 永远渲染出同一座城市(种子化确定性布局);不同 vault 按主题生成不同地貌(平原王城 / 海港商邦 / 雪原孤城 / 山地雄关),含河流、山脉、湖泊、铁路、机场、轮渡等元素。

功能特性

  • ⌘K 搜索定位:输入笔记名,镜头飞行到对应建筑并高亮。
  • 工地清单:所有含未完成任务的笔记,按目录树组织,可展开/收起、一键定位或跳 Obsidian。
  • 入城变化摘要:进城时播报「自上次到访:新建 3 栋 · 翻修 5 栋 · 完成 4 项任务…」。
  • 知识透镜:一键切换图层——孤岛视图(高亮零链接笔记)、园丁视图(最久未打理的笔记)。
  • 链接漫游:建筑卡片上列出入链/出链,点击即可沿链接在城中连续漫游。
  • 笔记查看/编辑:卡片内「打开」弹窗,Markdown 渲染,支持就地编辑并保存回 vault。
  • 随机漫步:随机重逢一篇冷门老笔记。
  • 实时更新:文件监听(chokidar)+ WebSocket,改动即时反映到地图。
  • 设置中心:右上角「⚙ 设置」弹窗,左菜单右内容——配置仓库(增删 Obsidian vault)、配置模型、向量库管理、主题切换,全部集中一处。
  • 主题系统:6 套内置主题(荧光绿默认 / 抹茶 / 靛蓝 / 琥珀 / 黑白灰 / 暗夜),CSS 设计令牌驱动,一键整站换肤。
  • 向量知识库(RAG,可选):「设置 → 配置模型」接入千问嵌入/对话模型(本地 Ollama / 云端 DashScope,OpenAI 兼容协议)后,「常规」按钮的文书档案面板可按目录将文档切片向量化入库(已入库文档盖印章小标记,地图上对应建筑加书本屋饰);⌘K 搜索多出「语义」「问答」模式——BM25+向量混合检索、RRF 融合重排,问答强制带引用、证据不足拒答,答案可 👍👎 反馈并沉淀为评估集(recall@k / MRR / 生成 / 引用四层指标)。「设置 → 向量库」提供统计 / 文档 / 切片三级管理页:重建、清空、按文档更新与移除、切片透视。未配置时一切行为与原版完全一致(松耦合)。

技术栈

  • 服务端:Node + Fastify + TypeScript(ESM),纯函数布局引擎,chokidar 文件监听,REST + WebSocket。
  • 前端:Vite + TypeScript + 原生 Canvas 2D(地图手绘涂鸦风,doodle-slam 同源笔触;界面壳现代圆润风,CSS 设计令牌主题化),无 UI 框架。
  • 向量库:自研文件型向量存储(index.json + vectors.bin,归一化点积精确检索),零外部数据库依赖;VectorStore 为接口,可替换后端。
  • 测试:Vitest(402 用例)+ Playwright 冒烟。

快速开始

npm install
npm run build      # 构建前端到 web/dist
npm run dev        # 启动服务,默认 http://localhost:4777

首页即世界地图;首次打开会自动弹出「设置 → 配置仓库」,填入你的 Obsidian vault 绝对路径即可(之后可随时从右上角「⚙ 设置」打开;macOS 下若 vault 在受 TCC 保护的目录,需给终端授予「完全磁盘访问」)。

常用脚本:

npm test           # 运行全部单测
npm run dev:web    # 仅前端热更(Vite dev server, 5173)
NOTOPOLIS_PORT=4787 npm run dev   # 指定端口

运行数据全部落在 ~/.notopolis/(可用 NOTOPOLIS_CONFIG_DIR 覆盖):config.json 为配置(apiKey 在接口层全程掩码往返),rag/<vaultId>/ 为向量库与反馈日志。

项目结构

src/server/          # 服务端
  layout/            # 纯函数布局引擎(城区/建筑/道路/铁路)
  rag/               # 向量知识库(切片/嵌入/向量存储/混合检索/约束生成/评估/反馈)
  scanner.ts         # 扫描 vault → 笔记元数据
  graph.ts           # 链接图(入链/出链/孤儿)
  diff.ts            # 入城变化对比
web/src/
  render2d/          # Canvas 2D 渲染(城市画师/动态层/相机/透镜/生物群系/向量印记)
  ui/                # UI 组件(设置中心/向量库页/文书档案/主题/搜索/卡片/下拉/确认框/消息条)
  views/             # 世界地图(手绘白板+动效小生物)/ 城市视图(桌面装裱图纸)
  util/              # 搜索/目录树/Markdown 等纯函数

设计理念

规则而非固定布局——所有地貌都由 vault 路径种子化生成,保证「同库同城、异库异貌」。只读优先——Notopolis 主要是知识库的观察窗,写作发生在 Obsidian;笔记编辑仅作为便捷补充(限 vault 内既有 .md,带路径穿越防护)。工具壳与画布分层——界面壳是现代圆润的工具风(胶囊按钮、大圆角、软投影、令牌化主题),地图画布保持手绘涂鸦的纸墨语言,城市图纸像作品一样「装裱」在桌面上,两层各说各的话又互不打扰。松耦合——RAG 等可选能力默认关闭,关闭时与原版行为逐像素一致。

License

MIT © Qiang Xue

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages