Show HN: Ledge.sh —— 可执行的 Markdown 笔记
摘要
Ledge.sh 是一款免费的开源(Apache-2.0)Markdown 笔记本,面向开发者和 DevOps 人员,支持直接在笔记中运行 Shell、代码、SQL 和 AI 提示词块,并提供按笔记持久化的 Shell 会话,以及可选的通过 SSH 从桌面端或移动端连接远程服务器执行命令的能力。
大家好,HN,<p>Ledge 是一个 Markdown 笔记本,可以直接在你自己的笔记中运行 Shell 命令、代码、SQL 等。<p>我开发 Ledge 是因为一天中大部分时间,我都在把笔记里的命令复制粘贴到终端里。cmux 帮我很好地组织了终端,这给了我很大启发——但笔记和经常要跑的命令之间始终存在割裂。过去几周我一直在日常使用它,用它来做部署、API 调用、冒烟测试等。<p>Ledge 就像终端应用一样运行你真实的 Shell,既可以在本地运行,也可以通过 ledge-server 使用 SSH 远程托管。我从七月开始开发它,最近已经添加了对所有主流平台的支持:Mac(Apple Silicon)、Windows(需要 WSL)、Linux、iOS、Android。移动端需要通过 SSH 访问一个 ledge-server,Android 版本目前仍处于 Beta 阶段,正在寻找 Beta 测试者(详见网站上的链接)!<p>它基于 Bun 和 Electrobun 构建,免费且开源。欢迎查看代码并提交贡献:<a href="https://github.com/ledgesh/ledge" rel="nofollow">https://github.com/ledgesh/ledge</a><p>非常欢迎反馈。有什么必须实现的功能目前还缺失吗?
查看缓存全文
缓存时间: 2026/09/30 17:03
# Ledge:会运行代码的笔记本
来源:https://ledge.sh/
## 一个能运行 shell 命令、代码、SQL 和 AI 提示词的笔记本
本周新增订阅
Stripe API 笔记
本周新增订阅
\-\-\- profile: stripe \-\-\-
周一检查上周的注册情况。stripe 配置持有 API 密钥和数据库地址。接口记录在 Stripe API 笔记里。\#growth
sh
```
curl -sG https://api.stripe.com/v1/subscriptions -u "$STRIPE_KEY:" \
-d limit=100 -d "created[gte]=$(date -v-7d +%s)" > subs.json
jq -r '.data[].plan.nickname' subs.json | sort | uniq -c | sort -rn
```
自上周一以来:24 个 Pro、11 个 Team、3 个 Business。
python
```
import json
subs = json.load(open("subs.json"))["data"]
mrr = sum(s["plan"]["amount"] for s in subs) / 100
print(f"{len(subs)} subscriptions, +${mrr:,.0f} MRR")
```
38 个新订阅,MRR 增加 $2,682。
sql
```
select source, count(*) as upgrades
from accounts
where upgraded_at >= now() - interval '7 days'
group by source order by upgrades desc;
```
数据库也是同样的结果:38 次升级。Newsletter 17,docs 12,referral 9。
prompt
```
根据这条笔记为 #team 写本周的增长周报
```
Ledge 是一个面向开发者和 DevOps 的 Markdown 笔记本。写一条笔记,在代码块上按下 ⌘↩,它的输出就会在下面流式显示出来。在你的 shell 里、在你的项目里、在你的机器上,或是在服务器上。
安装 Ledge Server `curl -fsSL https://ledge.sh/server.sh | sh`
免费开源 · Apache-2.0 · Apple Silicon 上的 macOS · Linux · Windows 11(需 WSL) · iPhone 和 iPad · Android(beta)
## 每条笔记都有自己的 shell
Shell 代码块运行在一个属于该笔记的持久化 shell 中。一次 `cd`、一个导出的变量,或一个已激活的虚拟环境,都会延续到下一次运行。
- ⌘↩ 运行插入符所在的代码块。输出在下方流式显示。
- ⇧⌘↩ 把代码块发送到笔记的终端抽屉,那是一个你可以继续输入的第二个 shell。
- 正在运行的代码块可以接收输入。在输出面板中回答一个 `sudo` 密码,或一个 `[y/N]`。
- frontmatter 中的 `cwd:` 和 `env:` 决定该笔记的 shell 从哪里启动、带着哪些环境。
- 给代码围栏加上 `norun` 会去掉 Run 按钮。用于引用而非实际执行的命令就用它。
文档:运行代码(https://ledge.sh/docs/running-code)
发票舍入 bug
部分退款时总额会出现一美分的偏差。先复现问题。\#billing
sh
```
cd services/billing && source .venv/bin/activate
```
sh
```
pytest -q --tb=no tests/test_refunds.py
```
## 把你的笔记放在服务器上
通过 ssh 指向一台机器,笔记就保存在那里。服务器保存文件、运行 shell。你电脑上的应用只是通往它的窗口。
- 无需账号、无需服务、无需开端口。你和服务器之间只有 ssh。
- Shell 和正在运行的代码块属于服务器。合上笔记本,它们继续运行。再次打开时,输出就在那里等着。
- 你的电脑、你的手机和第二个窗口可以同时连接同一台服务器,各自拥有自己的标签页。
- 用 ssh 密钥登录,或用存在系统钥匙串里的密码登录。Ledge 会固定服务器的 host key,拒绝任何其他密钥。
- 用下面这条命令安装。`ledge backup` 每小时把笔记的加密副本存入一个兼容 S3 的存储桶。
安装 Ledge Server `curl -fsSL https://ledge.sh/server.sh | sh`
文档:把笔记放在远程服务器上(https://ledge.sh/docs/keep-notes-on-a-remote-server)
\-\-\- cwd: ~/api \-\-\-
2.4.2 从服务器上发布,而不是从笔记本。构建大约需要一分钟。
## 在手机上看到同样的笔记
Ledge 在 iPhone 和 iPad 上运行,作为通往同一台服务器的窗口。手机上不保存任何笔记。它读取、编辑并运行服务器上的内容。
- 用实时预览阅读、编辑和创建笔记。搜索、标签、反链、每日笔记和 wikilink 全部可用。
- 点击代码块上的 Run,它就在服务器上运行。切换应用它也继续运行。回来时输出就在那里。
- `^C`、`^D`、Escape 和方向键位于键盘上方,方便你中断命令、退出分页器,或在 htop 中移动。
- 扫描 `ledge pair` 在服务器上打印的配对码。手机用一个在 Secure Enclave 中生成、永不离开手机的密钥登录,这个密钥只能与 Ledge 通信。
- 加密的笔记用密码短语解锁。手机不保存其中任何内容。
文档:手机上的 Ledge(https://ledge.sh/docs/ledge-on-your-phone)
媒体服务器
正在转码两集。开始第三集之前先检查。
## 在其他机器上运行代码块
在 frontmatter 中加一行 `host:`,该笔记中的每一次运行就会通过 ssh 在那台主机上执行。笔记本身仍留在原处。
- 声明多台主机后,Ledge 每次运行时会询问使用哪一台。按 Enter 会重复上一次的选择。
- 给代码块标记 `confirm`,Ledge 会显示代码、指明机器名称,并在运行前询问。
- 认证方式就是你自己的 `ssh`。密钥、agent、`~/.ssh/config` 和 2FA 都和终端里一样工作。
- 笔记的 `cwd` 和 `env` 会随运行一起传递。配置和密钥从不如此。
- `python`、`node` 等解释型代码块也在主机上运行,可在设置中为每台机器覆盖解释器。
文档:在远程主机上运行代码(https://ledge.sh/docs/run-code-on-remote-hosts)
\-\-\- cwd: ~/Projects/api host: staging, deploy@prod \-\-\-
2.4.1 部署后残留的过期会话密钥。先刷新 staging,验证,再上 prod。
sh confirm="刷新会话缓存?"
## 让笔记并排显示
⌘D 把视图左右分屏,⇧⌘D 上下分屏,任意一侧还能继续分割。每个窗格都有自己的标签页。
- 每条笔记保留自己的 shell,所以两个窗格就是两个工作环境。运行会持续流式显示在你离开的那个窗格里。
- 把标签页拖到另一个窗格。它会保留插入符、滚动位置、撤销历史,以及仍在流式显示的输出。
- ⌃Tab 切换标签页。⌃1 到 ⌃9 按位置跳转。
- 每个工作区都保存自己的布局,并在下次启动时恢复。⌘1 到 ⌃9 切换工作区,连同布局一起切换。
- 一个终端抽屉贯穿整个窗口,跟随当前聚焦的笔记。
文档:窗格与标签页(https://ledge.sh/docs/panes-and-tabs)
cwd: ~/Projects/api
试用期时长 bug
有些试用期提前一天结束。
## 密钥不会留在你的笔记里
配置(profile)是一个命名的环境变量文件,保存在笔记文件夹之外。点名引用它的笔记,会在自己的 shell 中获得这些变量。笔记只携带名称。
- frontmatter 中的 `profile: deploy` 会读取 `~/.config/ledge/profiles/deploy.env`,这是一个只有你能读的普通 dotenv 文件。
- 笔记会被同步、备份,也会被智能体读取。配置的值则留在机器上。
- 任意多条笔记可以共用一个配置。一行 `env:` 可为单条笔记覆盖某个值。
- 内置编辑器以掩码形式显示值,一个开关即可展开。
- `envFile: .env` 会加载项目自己的 dotenv,用于所有非机密的内容。
文档:配置与密钥(https://ledge.sh/docs/profiles-and-secrets)
\-\-\- cwd: ~/Projects/api profile:deploy \-\-\-
备份恢复演练。AWS 密钥来自 deploy 配置。
sh
```
aws s3 ls s3://ledge-api-backups/nightly/ | tail -2
```
## 为智能体工作而设计
Ledge 自带一个 MCP 服务器。`claude mcp add ledge -- ledge mcp` 可以接入 Claude Code,任何 MCP 智能体都能通过它读取、搜索、创建和编辑你的笔记。
- 笔记以标题寻址,重命名后依然有效,因此智能体的引用不会过时。
- 在笔记内部打开的终端知道它属于哪条笔记。"在这里加一个 TODO 区块" 不需要额外解释。
- `prompt` 代码块就是一个可运行的代码块。⌘↩ 把它传给智能体,回复在下方流式显示。
- 智能体可以读取你的设置和手册,所以 "查一下 Ledge 文档" 是一个合理的指令。
- 没有删除工具,加密笔记对所有智能体都拒绝提供正文。
文档:智能体与 Ledge(https://ledge.sh/docs/agents-and-ledge)
发布 2.5.0
等迁移稳定期过后再打 tag。检查清单在发布手册中。\#release
sh
```
git log --oneline v2.4.1..HEAD | head -3
```
完成 84 ms
```
9f31c22 storage: chunked uploads for assets over 50 MB
41b0a07 api: rate limit per token, not per IP
c2ade19 fix: retry idempotent writes on 5xx
```
## 锁住重要的笔记
锁定会把笔记正文在磁盘上用密码短语加密。智能体永远看不到它,同步服务只传输密文,读取它必须先解锁。
- 标题、frontmatter 和标签保持可见,链接和导航照常工作。
- 搜索和反链会跳过加密的正文,并说明跳过了多少条笔记。
- 一个密码短语覆盖所有锁定的笔记。⌘L 重新上锁,保险库在空闲 15 分钟后自动上锁。
- 粘贴进锁定笔记的图片会与它一起被封存。
- 一条锁定的笔记是自包含的。换一台机器,仅凭密码短语即可解锁。没有恢复手段。
文档:笔记锁定(https://ledge.sh/docs/note-locking)
这条笔记已锁定。在你解锁之前,它的正文一直以密封状态保存在磁盘上,远离智能体和搜索。
解锁笔记……
dev@mbp notes % ledge cat "Comp review 2026"
## 与任何工具同步,用 git 分享
笔记就是普通文件夹里的普通文件,所以同步笔记就是同步一个文件夹:iCloud Drive、Dropbox、git、Syncthing,或你已经在用的任何方案。旁边没有数据库。
- Ledge 会监视文件夹,实时跟随外部改动,即使该笔记正处于打开状态。
- 把工作区推到一个 git 远程仓库,和你协作的人直接克隆即可。每个克隆会作为普通工作区挂载,执行一次拉取就会出现在侧边栏中,无需任何刷新操作。
- 同一条笔记在两个克隆中被修改,就是一个普通的 git 冲突。如果一次拉取覆盖了你正打开的笔记,你的版本保留文件,对方的版本进入工作区回收站。
- 工作区中的一条 Sync 笔记,用一次 ⌘↩ 即可完成拉取、提交和推送。
- 配置永不进入文件夹,加密笔记以密文形式传输,回收站不进入 git。
文档:保持笔记同步(https://ledge.sh/docs/tutorial-keep-notes-synced)
同步
这个工作区就是一个仓库。一次运行即可提交并推送其中所有笔记。
sh
```
git add -A && git commit -m "notes $(date +%F)" || true
git pull --rebase && git push
```
## 使用 Ledge 的方式
六种笔记类型,每一种都有对应的手册页。
数据探索
sql
```
select plan, count(*)
from signups group by plan;
```
完成 41 ms
```
plan | count
------+-------
free | 1204
pro | 187
```
python
```
import pandas as pd
df = pd.read_csv("signups.csv")
print(df["source"].mode()[0])
```
文档:运行代码(https://ledge.sh/docs/running-code#add-a-language)
项目运行手册
cwd: ~/Projects/api
envFile: .env
sh
```
docker compose up -d db
make migrate
```
完成 3.8 s
```
✔ Container api-db-1 Started
migrated to 0043_signup_source
```
文档:从笔记运行项目(https://ledge.sh/docs/tutorial-run-a-project)
故障响应
redis
```
INFO keyspace
```
完成 12 ms
```
# Keyspace
db0:keys=4812339,expires=0,avg_ttl=0
```
文档:配置与密钥(https://ledge.sh/docs/profiles-and-secrets)
学习编程
ruby
```
%w[a b c].each_with_index do |s, i|
puts "#{i}: #{s}"
end
```
文档:运行代码(https://ledge.sh/docs/running-code#interpreted-languages)
家庭实验室
sh
```
zpool list -o name,cap,health
```
完成 1.1 s
```
NAME CAP HEALTH
tank 81% ONLINE
```
文档:在远程主机上运行代码(https://ledge.sh/docs/run-code-on-remote-hosts)
每日日记
prompt
```
列出 [[2026-07-30]] 中未完成的任务
```
完成 4.2 s
```
- 发回租约续签
- 完成第四章的笔记
```
文档:每日笔记与模板(https://ledge.sh/docs/daily-notes-and-templates)
## 底层是一个笔记应用
笔记应用该有的其他一切,这里都有。
### 你的语言
Python、Node、Ruby 和 PHP 开箱即用。`redis` 代码块驱动 redis-cli,由笔记的 `REDIS_URL` 指向 staging 或 prod。TypeScript 使用应用内置的 Bun 运行时,所以 `ts` 代码块无需安装任何东西即可运行。添加一个解释器只需在设置里加一行。
"sql": "psql \"$DATABASE_URL\" -f"
### 每日笔记与模板
⌘J 打开今天的笔记,按每日模板套用。模板就是带有 `{{date}}` 和 `{{yesterday}}` 占位符的普通笔记,其中一条带有 `prompt` 代码块,就能让每个早晨用一次按键完成简报。
prompt 总结 [[{{yesterday}}]]
### 工作区就是一个文件夹
挂载一个项目文件夹,它的 Markdown 文件就地变成笔记,代码块也在项目中原地运行。⌘1 到 ⌘9 切换工作区,每个都保留自己的窗格布局。从 Ledge 移除一个挂载文件夹不会碰任何文件。
将文件夹挂载为工作区……
### 实时预览
语法会从插入符处隐去:`\*\*bold\*\*` 显示为粗体,链接显示其标签,表格和图片原地渲染,复选框可以点击。把插入符移进去,原始字符就会回来。一个设置可以让它始终显示每个字符。
"editor.livePreview": false
### 粘贴任何内容
复制网页的一部分、一条 Slack 讨论或一篇 Google 文档,⌘V 就会以 Markdown 粘贴:标题、列表、复选框、链接和表格一应俱全。⇧⌘V 粘贴纯文本。剪贴板上的图片会以文件形式落在工作区中并原地渲染;粘贴进锁定笔记,它从第一个字节起就是加密的。
!\[\]\(\.ledge\-assets/pasted\-2026\-07\-31\.png\)
### 找回你的位置
⌘P 按标题打开笔记;输入 `\#` 进行全文搜索。Wikilink 以标题寻址,重命名不会留下失效链接。反链和大纲各占一个面板。
\[\[Oncall handbook\#Paging\]\]
### 标签与收藏
用行内 `#hashtags` 或 frontmatter 的 `tags:` 行给笔记打标签,⌥⌘T 会列出所有标签及其数量。在笔记那一行上按 f,或点击它的星标,它就会出现在侧边栏顶部的"收藏"区,无论它被埋在多深的文件夹里。两者都存在 frontmatter 中,因此会随文件一起走。
favorite: true
### 删除可以撤销
⌫ 把笔记移入工作区回收站,并显示一条撤销条。侧边栏中的"回收站"区会保留 30 天,按 r 恢复,永久删除则会先询问。
"trash.ttlDays": 30
### ledge CLI
在任何终端里列出、读取、搜索、创建和追加笔记,应用会实时同步跟随。结果输出到 stdout,所有交互信息输出到 stderr,因此管道保持干净;`--json` 可让任何子命令输出机器可读格式。
git log --oneline -5 | ledge append "Release notes"
基于 Apache-2.0 的免费开源软件。无需账号,旁边也没有数据库。你的笔记就是你电脑上或你自己运行的服务器上的 Markdown 文件,它们始终属于你。
安装 Ledge Server `curl -fsSL https://ledge.sh/server.sh | sh`
免费 Apache-2.0 无需账号 纯文本文件 Mac、Linux、Windows、iPhone
相似文章
Show HN: Files.md —— Obsidian 的开源替代品
Files.md 是一款免费、开源的 Markdown 笔记应用,运行于浏览器中,文件存储在本地,支持同步功能,并配有 Telegram 聊天机器人,方便随时随地访问。
在HN展示:构建一个用于Mac、iOS和网页的Markdown编辑器
Beauty 是一款适用于Mac、iOS和网页的本地跨平台Markdown编辑器,可实时渲染内容,包括KaTeX数学公式和Mermaid图表,并具备点对点同步和版本历史等功能。
Show HN: Writemark,一个零依赖的Web组件,用于内联Markdown编辑
Writemark 是一个无依赖的 Web 组件,用于内联 Markdown 编辑。它支持实时渲染、源码/分屏/预览模式、斜杠命令、表格、任务列表、代码块以及原生表单集成,无需框架或工具栏。
展示 HN:无需截图,只用文本记录屏幕记忆到 Markdown
Ambient Context 是一款 macOS 菜单栏应用,它通过捕捉聚焦窗口的文本,将其转换为 Markdown 文件供 LLMs 阅读,并具备隐私编辑功能且无网络调用。
@hellokillian:受 @karpathy 启发,打造本地 Markdown 编辑器 + 终端代理工作区
一位开发者发布了一款集成终端代理工作区的本地 Markdown 编辑器,灵感源自 Andrej Karpathy。