Show HN: Ledge.sh —— 可执行的 Markdown 笔记

Hacker News Top 工具

摘要

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:&#x2F;&#x2F;github.com&#x2F;ledgesh&#x2F;ledge" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;ledgesh&#x2F;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 的开源替代品

Hacker News Top

Files.md 是一款免费、开源的 Markdown 笔记应用,运行于浏览器中,文件存储在本地,支持同步功能,并配有 Telegram 聊天机器人,方便随时随地访问。