运行 shell 命令、代码、SQL 和 AI 提示词的笔记本
本周新增订阅
Stripe API 笔记
本周新增订阅
---
profile: stripe
---
周一检查上周的注册情况。stripe profile 保存了 API 密钥和数据库 URL。端点位于 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 个新订阅,新增 $2,682 的 MRR。
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,referrals 9。
prompt
Write this week's growth update from this note for #team
Ledge 是面向开发者和 DevOps 的 Markdown 笔记本。写一条笔记,按下 ⌘↩在代码块上,其输出就会在下方流式显示。在你的 shell 中、你的项目中、你的机器上,或服务器上。
安装 Ledge Servercurl -fsSL https://ledge.sh/server.sh | sh
免费且开源 · Apache-2.0 · macOS on Apple Silicon · Linux · Windows 11 with WSL · iPhone and iPad · Android (beta)
每条笔记都有自己的 shell
Shell 块在属于该笔记的持久 shell 中运行。一个 cd、一个导出的变量,或一个激活的 virtualenv 会延续到下一次运行。
- ⌘↩运行光标所在的块。输出会在其下方流式显示。
- ⇧⌘↩将块发送到笔记的终端抽屉,那是你可以继续输入的第二 shell。
- 正在运行的块会接收输入。在输出面板中回答一个
sudo密码或一个[y/N]。 cwd:和env:在 frontmatter 中设置笔记的 shell 从哪里启动以及它们携带什么。norun在围栏上会移除 Run 按钮。用于你引用而非运行的命令。
发票舍入 bug
发票舍入 bug
部分退款时总额会偏差一美分。先复现。 #billing
sh
cd services/billing && source .venv/bin/activate
sh
pytest -q --tb=no tests/test_refunds.py
终端
将你的笔记保存在服务器上
让 Ledge 通过 ssh 指向一台机器,笔记就存放在那里。服务器保存文件并运行 shell。你电脑上的应用是通向它的窗口。
- 无需账户、无需服务、无需开放端口。你和服务器之间唯一的通道就是 ssh。
- Shell 和正在运行的块属于服务器。合上笔记本电脑,它们仍会继续运行。再次打开时,输出就在那里等着你。
- 你的电脑、手机和第二个窗口可以同时连接一台服务器,各自拥有自己的标签页。
- 使用 ssh 密钥登录,或使用保存在系统钥匙串中的密码。Ledge 会固定服务器的主机密钥并拒绝任何其他密钥。
- 使用下面的命令安装。
ledge backup每小时把笔记的加密副本放进一个兼容 S3 的存储桶。
安装 Ledge Servercurl -fsSL https://ledge.sh/server.sh | sh
vps-1
---
cwd: ~/api
---
从服务器切出 2.4.2,而不是从笔记本。构建需要一分钟。
sh
make release
手机上的同一份笔记
Ledge 在 iPhone 和 iPad 上运行,作为同一台服务器的一个窗口。手机不保存任何笔记。它读取、编辑并运行服务器上的内容。
- 读取、编辑并创建笔记,带实时预览。搜索、标签、反向链接、每日笔记和 wikilinks 都能用。
- 点按某个块上的 Run,它就在服务器上运行。切换应用后它仍继续运行。你回来时输出已经等在那里。
^C,^D、Escape 和方向键位于键盘上方,因此你可以中断命令、退出分页器,或在 htop 中四处移动。- 扫描配对码,它
ledge pair会在服务器上打印出来。手机用 Secure Enclave 中生成、永不离开该处的密钥登录,而该密钥只能与 Ledge 通信,别的什么都做不了。 - 锁定的笔记用口令解锁。手机不存储其中任何内容。
homelab
媒体服务器
两个剧集正在转码。开始第三个之前先检查一下。
sh
htop
BI[[
在其他机器上运行块
添加一行host:到 frontmatter,笔记中的每次运行都会通过 ssh 在该主机上执行。笔记本身留在原处。
- 声明多个主机后,Ledge 会在每次运行时询问用哪一个。按 Enter 重复你上次的选择。
- 标记一个块
confirm然后 Ledge 会显示代码、指明机器,并在运行前询问。 - 认证用你自己的
ssh。密钥、agents、~/.ssh/config和 2FA 都像在终端中一样工作。 - 笔记的
cwd和env随运行一起传递。配置文件和密钥从不传递。 python,node和其他解释型块也在主机上运行,可在设置中按机器覆盖解释器。
---
cwd: ~/Projects/api
host: staging, deploy@prod
---
2.4.1 部署后会话密钥过期。刷新 staging,验证,然后 prod。
sh confirm="Flush the session cache?"
redis-cli -n 2 flushdb
把笔记并排摆放
⌘D将视图左右分割,⇧⌘D上下分割,任意一侧都可以再次分割。每个窗格都有自己的标签页。
- 每个笔记都保有自己的 shell,因此两个窗格就是两个工作环境。一次运行会在你离开的那个窗格中继续流式输出。
- 将一个标签页拖到另一个窗格。它会保留光标位置、滚动位置、撤销历史,以及任何仍在流式输出的内容。
- ⌃Tab循环切换标签页。⌃1到⌃9按位置跳转到某一个。
- 每个工作区都会保存其布局,并在下次启动时恢复。 ⌘1到⌘9切换工作区,布局等一切都会随之切换。
- 一个终端抽屉横跨整个窗口,并跟随当前聚焦的笔记。
试用期长度 bug
cwd: ~/Projects/api
试用期长度 bug
有些试用期会提前一天结束。
sh
go test ./...
机密信息不会留在你的笔记里
配置文件是一份命名的环境变量文件,保存在你的笔记文件夹之外。一份引用它的笔记会在其 shell 中获得这些变量。笔记只携带名称。
profile: deploy在 frontmatter 中读取为~/.config/ledge/profiles/deploy.env,一个只有你能读取的普通 dotenv 文件。- 笔记会被同步、备份,并被智能体读取。而配置文件的值只留在本机。
- 任意数量的笔记都可以共享同一个配置文件。一条
env:行可以为某一份笔记覆盖某个值。 - 内置编辑器会以掩码方式显示这些值,并提供一个开关来显示它们。
envFile: .env会为所有非机密内容加载项目自带的 dotenv。
---
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 文档”是一条合理的指令。
- 没有删除工具,而且锁定笔记会拒绝向任何智能体提供其正文。
版本 2.5.0
版本 2.5.0
在迁移烘焙后打标签。检查清单见 发布运行手册。 #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
终端
dev@mbp api % claude
锁定重要的笔记
锁定会用口令将笔记正文加密存储在磁盘上。智能体永远看不到它,同步服务传输的是密文,读取它需要解锁。
- 标题、frontmatter 和标签仍然可见,因此链接和导航仍可正常工作。
- 搜索和反向链接会跳过锁定的正文,并说明跳过了多少条笔记。
- 一个口令覆盖所有锁定的笔记。⌘L重新锁定,并且保险库在闲置 15 分钟后会自动重新锁定。
- 粘贴到锁定笔记中的图片会随它一起被封存。
- 锁定的笔记是自包含的。在另一台机器上,仅凭口令即可解锁。没有恢复机制。
2026 年薪酬评估
此笔记已锁定。在你解锁之前,它的正文在磁盘上保持封存,智能体和搜索都无法访问。
解锁笔记…
终端
dev@mbp notes % ledge cat "Comp review 2026"
可与任何东西同步,用 git 分享
笔记是普通文件夹中的普通文件,因此同步它们就是同步一个文件夹:iCloud Drive、Dropbox、git、Syncthing,或你已经在用的任何工具。没有额外的数据库。
- Ledge 会监视该文件夹并实时跟随外部更改,即使是已打开的笔记也不例外。
- 将工作区推送到 git 远程仓库,与你协作的人克隆它。每个克隆都作为普通工作区挂载,拉取会显示在侧边栏中,无需刷新。
- 在两个克隆中更改的同一篇笔记就是普通的 git 冲突。如果拉取重写了你已打开的笔记,你的版本会保留该文件,另一个版本会进入工作区回收站。
- 工作区中的 Sync 笔记只需一次操作即可拉取、提交和推送 ⌘↩。
- 配置文件从不进入文件夹,锁定的笔记以密文形式传输,回收站也不会进入 git。
同步
此工作区是一个仓库。一次运行即可提交并推送其中的每一篇笔记。
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])完成610 ms
newsletter
项目运行手册
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
事件响应
profile: prod-readonly
redis
INFO keyspace
完成12 ms
# Keyspace db0:keys=4812339,expires=0,avg_ttl=0
学习编程
ruby
%w[a b c].each_with_index do |s, i|
puts "#{i}: #{s}"
end完成88 ms
0: a 1: b 2: c
家庭实验室
host: homelab
sh
zpool list -o name,cap,health
完成1.1 shomelab
NAME CAP HEALTH tank 81% ONLINE
每日日志
prompt
List the open tasks in [[2026-07-30]]
完成4.2 s
- Send the lease renewal back - Finish the chapter 4 notes
底层的笔记应用
你期望笔记应用具备的其他一切都在这里。
你的语言
Python、Node、Ruby 和 PHP 开箱即用。一个redis块将输入送入 redis-cli,由笔记的 REDIS_URL指向 staging 或 prod。TypeScript 使用应用内置的 Bun 运行时,因此ts无需安装任何东西即可运行 blocks。在 Settings 中添加解释器只需一行。
"sql": "psql \"$DATABASE_URL\" -f"
每日笔记和模板
⌘J打开今天的笔记,按你的每日模板打上时间戳。模板是普通笔记,带有{{date}}和 {{yesterday}}tokens,而带有 promptblock 的模板让每个早晨只需一次按键就能获得简报。
prompt总结 [[{{yesterday}}]]
工作区就是一个文件夹
附加一个项目文件夹,其中的 Markdown 文件就会在原位成为笔记,并在项目中运行它们的 blocks。⌘1到 ⌘9切换工作区,每个工作区都保留自己的窗格布局。从 Ledge 中移除已附加的文件夹不会触碰任何文件。
将文件夹附加为工作区…
实时预览
语法在光标处隐藏:**bold**显示粗体,链接显示其标签,表格和图片就地渲染,复选框可点击。将光标移入,确切的字符就会回来。一个设置可以始终显示每个字符。
"editor.livePreview": false
粘贴任何内容
复制网页的一部分、一个 Slack 线程或一个 Google Doc,然后⌘V 将其粘贴为 Markdown:包括标题、列表、复选框、链接和表格。⇧⌘V粘贴纯文本。剪贴板上的图片会作为文件落入工作区,就地渲染;粘贴到锁定的笔记中时,它从第一个字节起就被加密。

找到回去的路
⌘P按标题打开笔记;输入#进行全文搜索。Wikilinks 按标题寻址,因此重命名标题永远不会留下过时的链接。反向链接和大纲各有一个面板。
[[Oncall handbook#Paging]]
标签和收藏
用行内方式给笔记打标签#hashtags或一个 frontmatter tags:行,并且⌥⌘T列出每个标签及其数量。按f在笔记的行上,或点击它的星标,它就会位于侧边栏顶部的 Favorites 部分,无论它位于文件夹多深的位置。两者都是 frontmatter,因此它们随文件一起移动。
favorite: true
删除可撤销
⌫将笔记移到工作区回收站,并显示一个 Undo 条。侧边栏中的 Trash 部分会保留它 30 天,在那里 r恢复它,永久删除会先询问。
"trash.ttlDays": 30
ledge CLI
从任何终端列出、读取、搜索、创建和追加,应用会实时跟随。结果输出到 stdout,所有对话内容输出到 stderr,因此管道保持干净,并且--json将任何动词切换为机器可读输出。
git log --oneline -5 | ledge append "Release notes"
在 Apache-2.0 下免费开源。无需账户,也没有额外的数据库。你的笔记是 Markdown 文件,存放在你的电脑或你运行的服务器上,始终归你所有。
安装 Ledge Servercurl -fsSL https://ledge.sh/server.sh | sh
免费Apache-2.0无需账户纯文件Mac、Linux、Windows、iPhone