运行 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 通信,别的什么都做不了。
  • 锁定的笔记用口令解锁。手机不存储其中任何内容。

文档:手机上的 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 文档”是一条合理的指令。
  • 没有删除工具,而且锁定笔记会拒绝向任何智能体提供其正文。

文档:智能体与 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
文档:从笔记运行项目

学习编程

ruby

%w[a b c].each_with_index do |s, i|
  puts "#{i}: #{s}"
end

完成88 ms

0: a
1: b
2: c
文档:运行代码

每日日志

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粘贴纯文本。剪贴板上的图片会作为文件落入工作区,就地渲染;粘贴到锁定的笔记中时,它从第一个字节起就被加密。

![](.ledge-assets/pasted-2026-07-31.png)

找到回去的路

⌘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