在网页上,永久免费。
在任意浏览器打开 app.cou.sh 即可开始工作。无需安装,无需注册即可试用。
离线也能用。
你的成果首先保存在本地设备上。重新联网的那一刻,一切自动同步。
永远归你所有。
没有锁定。CouShell 运行在开放的 Abracadabra 引擎之上——你的数据始终可迁移。
不只是又一个笔记应用。
一棵共享的树,几十种使用方式——看板、图谱、AI、语音、悬浮窗口。下面这些功能的组合,是你在别处拼凑不出来的。
远不止一篇文档
看板、日历、画廊、表格、时间线、地图、图表——全都是同一棵树,按你需要的方式呈现。切换视图,数据原封不动。
在你的空间中工作的 AI
把助手指向你的工作空间,看着它与你并肩读取、编辑、梳理内容。
看清一切如何相连
文档之间的每一处链接,绘成一张鲜活的图谱。一眼看清你工作的全貌。
像桌面一样铺开
把任意文档弹出为悬浮窗口。看板、笔记、聊天并排平铺——你的空间,你的布局。
纯 Markdown,存在你的磁盘上
导入和导出带 YAML frontmatter 的干净 Markdown。桌面应用会同步一个真实的 .md 文件夹——你的笔记始终是你的,公开可见。
滑动即可导航
在主视图上滑动以前进和后退,从边缘滑入以拉出菜单,滑动即可关闭——在触控、触控板或 Magic Mouse 上都很自然。
各种媒体,就地嵌入
放入图片、视频、音频和文件——它们就在文档里,可播放、可预览,不必藏在下载链接后面。
每个视图都懂的元数据
在任意文档上设置状态、日期、封面和优先级——看板、日历、画廊等每个视图都读取同一套类型化元数据。字段定义一次,渲染交给各视图。
就在这里,开口聊聊
无需离开页面即可进入语音或聊天——对话就在工作内容旁边,而不是另一个应用里。
看得见、感受得到的协作。
每个节点、每个光标、每个视图——发生即呈现,实时同步。
一棵树,连接每位伙伴。
没有文件夹——每个节点都是一篇文档,而任何文档都能容纳更多文档。文档、看板、日历、表格,全在同一棵树里,各自实时显示谁在其中。
- 任何文档都能容纳更多文档——没有文件夹。
- 在线状态圆点实时显示谁在每篇文档中。
- 把一篇文档切换为看板或日历——同一节点,同一份数据。
光标、选区,整段对话。
原生于 TipTap 的多光标感知。每段选区都以伙伴的颜色渲染。
- 以 60 fps 平滑呈现的光标
- 字符级的选区范围
- 名字标签悬浮在每个光标上方
- 每次编辑都归属到其作者
跟随任何人,跨越任何视图。
选定一位伙伴,他们的视图、光标与选区便会实时呈现在你的屏幕上——看板、文档、地图,任何视角皆可。
- 点击任意头像即可进入跟随模式。
- 他们的视图切换会成为你的视图切换。
- 随时退出——一切都不会被锁定。
- 非常适合结对、评审与演示。
离线编辑,回来再同步。
CouShell 优先写入你的设备。服务器是便利,而非依赖。
- 你的资料库存在本地设备上。
- 无冲突的 CRDT 合并,绝不锁死。
- 完全支持飞行模式。
- 重新连接 = 自动合并,无需任何提示。
协作功能,提前于计划。
协作功能,提前于计划。
自带你的 AI
任何兼容 MCP 的 AI 助手都能作为一等参与者加入你的工作空间——读取你的文档、撰写内容,并与你的团队聊天。
用你的方式运行。
使用免费网页应用、让我们为你托管,或自己运行这台开放服务器。完整的服务器与托管细节都在 abr.ac 上。
底层是一整套引擎。
CouShell 只是 Abracadabra 上的一个应用——一个开放的实时引擎。同样的构建模块也任你使用。
- 实时后端鉴权、存储、在线状态与 CRDT 同步,全部来自一台开放服务器。
- 转换数据的运行器监听文档并通过类型化 RPC 作出响应的服务运行器。
- 在其上构建你自己的应用TypeScript、Rust 与 Swift SDK——网页、原生或桌面皆可。
// 实时后端 —— 需要时也支持 RESTimport { Abracadabra } from '@abraca/dabra'const abra = new Abracadabra({ server })await abra.connect()// 用 REST 读取一次…const doc = await abra.documents.get(id)// …或实时监听它doc.observe((state) => render(state))// 在线状态 + 鉴权开箱即用abra.presence.set({ cursor, name })
// 转换你数据的运行器provider.rpc.handle('summarize', async ({ docId }) => { const doc = await provider.documents.get(docId) const text = doc.toPlainText() // 交给任意模型、API 或流水线 const summary = await ai.summarize(text) // 把结果写回树中 await provider.documents.create({ parentId: docId, label: 'Summary', body: summary, })})
// 在其上构建你自己的应用import { Abracadabra } from '@abraca/dabra'const abra = new Abracadabra({ server })await abra.connect()// 每个文档都是 CRDT,像本地状态一样编辑const board = await abra.documents.open(boardId)board.children.push({ label: 'New task' })// …并即时同步到每个客户端abra.on('sync', () => refresh())