Closed9

「Ledge」を試す

kun432kun432

どこぞでちらっと見かけた。

公式サイト

https://ledge.sh/

Dia によるまとめ。

Ledgeは「メモ帳」と「ターミナル+実行環境」が合体した開発者向けノートアプリだよ。

ざっくり:Ledgeってなに?

Ledgeは、普通のMarkdownメモに、シェル・SQL・Python・Ruby・AIプロンプトとかを「そのまま実行できる機能」をくっつけたツールだよ。
メモを書きながら、コードブロックで ⌘↩ 押すと、その場で実行されて、すぐ下に結果がニョキっと出てくる感じ。

「NotionとかObsidianでメモってるけど、結局ターミナルやブラウザに切り替えてコマンド打ってる…」みたいな開発者・DevOps向けの、メモがそのまま作業環境になるアプリってイメージ。

コアの発想:1つのノート=1つのシェル

Ledgeでは、各ノートに「専用のシェル」がくっついてるのがポイント。

例えばこんな感じで書いて:

---
cwd: ~/Projects/api
envFile: .env
---

```sh
docker compose up -d db
make migrate
```

ここで ⌘↩ すると、そのノート専用のシェルで実行されて、出力がすぐ下に出る。
しかもそのシェルは状態を覚えてるから、

  • 一回 cd したら、次のコマンドもそのディレクトリのまま
  • export した環境変数もそのノート内ではずっと生きてる
  • venv 有効化したら、そのまま次のPythonコマンドが走る

って感じで、「いつもターミナルでやってる流れ」がそのままノートの中で続いていく。

何が実行できるの?(シェル・SQL・コード・AI)

ノートの中のコードブロックごとに言語を指定すると、その種類に応じた実行をしてくれるよ。

  • sh
    • ふつうのシェル。docker compose up とか make migrate とか、普段のターミナル作業をそのまま書く。
    • ホームラボの zpool list や htop みたいな監視系もノートからポチっと実行。
  • sql
    • sql ブロックは、設定した DATABASE_URL に対して psql 叩いてくれるイメージ。
    • 例みたいに、サインアップ数集計したり、アップグレード元の source 別カウント取ったりできる。
  • python, ruby, node, php, ts など
    • python ブロックなら、そのマシンのPythonで実行。
    • Stripeの subs.json 読み込んで MRR 計算したり、ちょっとした集計・スクリプトをノート側に直書きしてすぐ回せる。
  • redis
    • redis ブロックは redis-cli 叩いてくれる。
    • INFO keyspace でキー総数見るみたいな、運用チェックもノートから。
  • prompt
    • AI用のプロンプトを書くためのブロック。
    • prompt ブロックに「今週のグロースアップデートを書いて」って書いて ⌘↩ すると、そのノートの内容を元ネタにしてAIが文章を返してくる想定。

「作業メモ」がそのまま「ランブック / ダッシュボード」になる

ページにいろんな例が出てたけど、全部発想は同じで、

  • いつもターミナルやブラウザでやってるルーティン
  • 事故対応手順
  • リリース手順
  • ホームラボのチェック
  • 日次・週次の定例チェック

みたいなのを、Markdownノートとして残しつつ、そのまま再実行できるようにしてる。

例でいうと:

  • 「Monday check on last week’s signups」ノート
    • Stripeから curl でサブスクリプション取得
    • jq でプランの内訳集計
    • Pythonで MRR 計算
    • DBの accounts テーブルでも確認
    • 最後に prompt で「今週のグロースアップデート」をAIに書かせる

全部ひとつのノートの中で完結するから、「またあのコマンドなんだっけ…?」って過去のターミナル履歴を漁らなくてよくなる感じ。

ローカルでもリモートでも:サーバーモードとSSH

Ledgeはローカルだけじゃなくて、サーバー上のノートを操作できるのもデカい。

  • Ledge Server を自前サーバーに入れる
  • アプリからそのサーバーにSSHでつなぐ
  • ノートの実体(ファイル)と実行環境(シェル)は全部サーバー側
  • MacでもiPhoneでも同じノート・同じシェルにアクセス

って構成。

メリットとしては:

  • ラップトップ閉じても、サーバー上でコマンドは動き続ける
  • スマホからでも htop 見たり、make release 叩いたりできる
  • SSHの鍵・2FA・~/.ssh/config みたいな既存の仕組みそのまま使える

さらに host: をノートのフロントマターに書くと、

cwd: ~/Projects/api
host: staging, deploy@prod

って感じで、「このノートの実行はSSH越しにあのホストでやってね」って指定もできる。
リリースやキャッシュフラッシュみたいな「本番/ステージング操作ノート」を、めっちゃ安全に・明示的に書ける。

プロファイルとシークレット:環境変数をノートに書かない

profile: っていう仕組みで、機密情報をノート外に逃がすのも重要ポイント。

  • profile: deploy ってフロントマターに書く
  • 実体は ~/.config/ledge/profiles/deploy.env
  • ここにAWSキーとか本番DBパスワードを書いておく
  • ノート側には「profile名」しか残らない

つまり、ノートは普通にgitで共有・バックアップしてもOKで、秘密情報はローカルのdotenvだけに留めるって構造になってる。

ロック機能:特定のノートを暗号化

重要なノート(評価・給与・リカバリコードとか)は、ノート単位で暗号化ロックできる。

  • 本文はディスク上で暗号化される
  • タイトル・フロントマター・タグだけは見える(リンクやナビゲーションは壊さない)
  • 検索結果も「ロックされたノート◯件スキップしたよ」って教えてくれる
  • 画像もロックされたノートに貼ると一緒に暗号化される
  • パスフレーズを忘れたら復旧不可(Vaultっぽいノリ)

これで「全部Markdownファイルとして同期したいけど、超センシティブなやつはちゃんと隠したい」って欲張り要件に対応してる。

普通のメモアプリとしてもちゃんと強い

上が「開発者向け変態機能」なんだけど、ベースはちゃんとしたMarkdownノートアプリになってる。

  • Live preview(カーソル外では装飾表示、入ると生テキストに戻る)
  • Wikilink([[Note Title]])とバックリンク
  • タグ(インライン #tag と フロントマター の tags:)
  • お気に入り、Trash(30日保持)、Undo可能な削除
  • Daily note(⌘J で今日のノート、新規はテンプレから)
  • ペイン分割(左右・上下でノート並べて、各ノートが別シェルを持つ)
  • 画像ペーストで自動保存&Markdown埋め込み
  • フォルダ=ワークスペースで、そのままgit管理可能(Pull/Push用ノートも作れる)

要するに、「VSCodeのターミナル+ノート」「Obsidian+ターミナル」「org-mode+シェル」みたいな世界観を、もうちょい素直なUIでやってる感じ。

エージェント連携(MCP)

ページの後半にあった通り、LedgeはMCPサーバーも持ってて、エージェント(Claude Codeとか)から:

  • ノートの検索・読み取り・編集
  • 「このノート内にTODOセクションを追加して」みたいな操作
  • prompt ブロックの実行&応答の埋め込み

みたいなのができる設計になってる。
しかも「削除ツールはない」「ロックされたノートは中身渡さない」って制限もあって、AIにやらせる範囲をちゃんと絞ってるのがエモい。

まとめ:どんな人に刺さるか

Ledgeが特にハマりそうなのは、例えばこういうタイプだと思う。

  • ターミナル作業やSQL・スクリプトを「手順メモ」と一緒に残したい人
  • インシデント対応・リリース手順・運用ルーチンを再現可能なランブックとして整えたい人
  • 自前サーバーやホームラボをノートから直接いじりたい人
  • ノートも環境も「全部自分のマシン/サーバーに置きたい、SaaSにロックインされたくない」っていう自律系エンジニア

イメージ的には、「メモアプリ」「ターミナル」「ダッシュボード」「AIプロンプト」が1枚のMarkdownノートの中に合体した開発者ノート環境、って感じで捉えると分かりやすいかな。

kun432kun432

ざっと見た感じで位置づけが似てると思ったのは以下。比較の軸によって印象が変わりそう。

  • 実行環境・プレイブックとして考えると、Jupyter Notebook / Marimo あたりが比較対象
  • Markdown文書・メモアプリ として考えると、Obsidian あたりが比較対象

ChatGPTに調査・比較表を作ってもらった。

Jupyter marimo Obsidian Ledge
位置づけ Notebook環境 リアクティブなPython Notebook環境 Markdownベースのノートアプリ 実行可能なMarkdownベースのノートアプリ
主なファイル .ipynb .py .md .md
主な使い方 コード・文章・出力を組み合わせて作業 Pythonを中心に、再現性のあるNotebookを作る メモ、知識整理、日記、調査、プロジェクト記録など メモ、知識整理、調査、プロジェクト記録に加え、その場でコードやコマンドを実行
コード実行 中心機能 中心機能 標準では中心機能ではない 中心機能
実行単位 セル セル ― Markdownコードブロック
実行状態 Kernelに保持 セル間の依存関係をmarimoが管理 ― ノートごとのShellに保持
自動再実行 基本は手動 依存するセルを自動更新できる ― 基本は手動
Markdownノートとして扱える Notebook内にMarkdownセル Notebook内にMarkdown そのものがMarkdown そのものがMarkdown
Wikiリンク・Backlink 本筋ではない 本筋ではない 中心的 あり
Daily Note・Template 本筋ではない 本筋ではない あり あり
Shellとの統合 補助的 補助的 標準ではなし かなり強い
SSH先でコード実行 標準の中心機能ではない 標準の中心機能ではない 標準ではなし 組み込み
Gitとの相性 .ipynbなのでやや扱いづらい 良い 良い 良い
Webアプリ化 Voilàなど別の仕組み 標準で強い 主目的ではない 主目的ではない
AI連携 拡張機能など AI機能・Agent連携あり 主にプラグイン MCPやpromptブロックを意識
拡張性 豊富なエコシステム Python中心 プラグインが非常に豊富 本体機能を比較的絞っている

なんとなく良さそうには思えるけど、実際に使ってみてどうか。

kun432kun432

Getting Started

インストールは以下の5種類の方法がある様子

  • macOS
    • Apple Silicon・macOS 13以降向け
    • DMGをダウンロードして、アプリフォルダにコピー
  • Windows
    • x64・Win11向け
    • WSLが必要。
    • ZIPをダウンロードして展開、インストーラを実行
  • Linux
    • x64 / arm64向け
    • WebKitGTK 4.1 が必要
    • tar.gzをダウンロードして展開、インストールスクリプトを実行
  • iPhone/iPad
    • App Storeからダウンロード
    • Ledge サーバーとペアリングが必要
  • Android
    • オープンベータ版・Android 10以降向け
    • テスターとして参加する必要がある
    • Ledge サーバーとペアリングが必要

まだちゃんと読んでいないが、スマホの場合は Mac もしくは Linux でLedgeサーバを起動して、そこにSSHで繋いで使用する、という感じみたい。

とりあえず今回は Mac(M2 Pro)でやってみる。Homebrew あるかなと思ったけどなかったので、素直に公式サイトからダウンロード・インストール・起動。

こんな感じの画面になる。Getting Started内で紹介されている内容と同じサンプルのノートが用意されているみたい。

コードの実行

とりあえず 最初のコードブロック内にカーソルを合わせて Command+Enter もしくは 右上の実行アイコンをクリックして実行してみる。

こんな感じで結果が表示される。

ブロック間でシェルは維持される

Ledge では各ノートごとにインラインシェルが保持される。つまり、状態はブロック間で引き継がれるということになる。以下の1つ目のコードブロックを実行。

続けて2つ目のコードブロックを実行。

1つ目のコードブロックで実行した内容が2つ目のコードブロックにも引き継がれている、つまり同じシェル内で実行されているということになる。

また、右上のターミナルアイコンもしくは ^+` でLedge内ターミナルを開くこともできる。このターミナルのシェルもノート専用になるらしいが、インラインシェルとは別のシェルになる。

別のシェルなので、ノート内で実行した結果などは当然反映されていない。

コードブロックにはターミナルでブロックを実行するオプションもある。こちらも単体だと引き継がれないが、見た感じターミナルでまるっと実行しているだけに見えるので、全部ターミナルで実行すれば引退んシェルとまあ同じにはなりそう(ただそれをやる意味はあまりないと思うけど)。

他言語のコードを実行

コードブロックに言語を指定すると、その言語で新しいプロセスとして実行される。例えばサンプルでは ts となっているので、これを実行してみる。

実行された。

Python でも試してみる。

1つ目のブロックは普通に実行されたが、1つ目で使用した変数は次のブロックでは参照できなかった。上にも「その言語で新しいプロセスとして実行される」と書いたけど、他言語の場合はブロック間では状態は引き継がれない様子。

このあたりについては以下のドキュメントを読むことになりそう。

https://ledge.sh/docs/running-code

kun432kun432

余談。ちなみにまだちょっとよくわかってないけど、ワークスペースの概念があって、そこにノートが保持される、ということみたい。

デフォルトで "Scratch" というワークスペースがあって、そこにサンプルのノート "Welcome to Ledge" が含まれているように見える。これがどこに作成されるのか気になった。

でどうやら ~/.ledge にあるみたい。

tree ~/.ledge
出力
/Users/kun432/.ledge
├── logs
│   ├── ledge-server.log
│   └── ledge.log
├── scratch
│   └── welcome-to-ledge.md
└── settings.jsonc
head ~/.ledge/scratch/welcome-to-ledge.md
出力
# Welcome to Ledge

Ledge runs code and commands straight from your Markdown. This note is yours: edit it, or start a new one with ⌘N.

## Run a block

⌘↩ inside the block below (Ctrl+Enter on Linux), or the Run button on it (a tap, on a phone), runs it.

```sh
curl -s https://api.github.com/zen

新しいワークスペースを追加したら、同じようにここに作成されるけども、別のパスのディレクトリをワークスペースとして設定することもできるみたい。

このあたりについては、以下のドキュメントを見れば良さそう。

https://ledge.sh/docs/notes-and-workspaces

kun432kun432

ノートをプロジェクトに紐づける

ここでいう「プロジェクト」は、Ledgeの用語ではなくて、Ledgeのノートを実行する「プロジェクトディレクトリ」という意味。

Ledgeのノートは、フロントマターでシェルの起動場所や環境変数を設定することができる。ここにプロジェクトディレクトリを指定しておけば、そのノートのシェルは「常に指定したプロジェクトディレクトリで起動」するということになる。

上のワークスペースで別のノートを開いてみる。

ノート1行目がファイル名になる様子。適当な名前をつけるとファイルが作成される。

ここで、Option + Command + , を入力するとフロントマターの入力欄が表示される。別に普通に入力しても良さそうだけど。

以下のようなフロントマターを設定してみる。

cwd: ~/work/my-ledge-app
envFile: .env
env:
  NODE_ENV: development
  PORT: "3000"

プロジェクトディレクトリを作成して適当な .env ファイルを置いておく。

mkdir -p ~/work/my-ledge-app
echo 'GREETING="Hello"' > ~/work/my-ledge-app/.env

続けてノートにコードブロックを設定して実行してみる。

```sh
pwd
echo "GREETING=${GREETING}"
echo "NODE_ENV=${NODE_ENV}"
echo "PORT=${PORT}"
```

インラインシェルがフロントマターに設定した内容で実行されていることがわかる。

この設定はターミナルの方にも反映されているみたい。

kun432kun432

その他

Getting Startedでは他にできることがざっとリストアップされている

  • ノート同士を [[ 〜 ]] でリンク
  • インラインの#hashtags、またはフロントマターのtags: でタグ付け
  • 特定のノートを開く・ワークスペース内の全文検索・バックリンク/アウトライン/タグの表示 をショートカットで行う
  • ペーンを左右上下に分割
  • (Obsidianにもある)デイリーノートやテンプレートを作成
  • ターミナル内でCLIエージェントを開いて、MCP経由でワークスペースのノートにアクセス
  • ノートのロックと暗号化
  • CLIで使えるledge コマンド
  • フロントマターにリモートホストを指定してSSHログイン先でシェルを実行
  • リモートサーバを登録して、リモートサーバ上のノートを開いて実行
  • iPhone/iPad/AndroidアプリからLedgeサーバに接続して、サーバ上のノートを直接編集
  • Linux版やWindows版についての注意
  • Ledgeのアップデート
  • トラブルシューティング

などが記載されている。

kun432kun432

公式ドキュメントのチュートリアル

公式ドキュメントには各機能ごとの詳細ドキュメントのほか、7つほどのチュートリアルも用意されている。

  • ノートからプロジェクトを実行
  • 日々のワークフロー
  • エージェントと連携
  • ノートを同期
  • Ledgeサーバーのセットアップ
  • ノートをS3にバックアップ
  • Gitでノートを共有

習うより慣れろでこちらを試すのもいいかも知れない。

kun432kun432

まとめ

試したのは Getting Startedだけだけど、個人的な印象としてはちょっと位置づけが難しいかなというところ。

まず、Markdownドキュメントの管理・Markdownエディタという観点で、Obsidianと比較した場合。

  • Obsidian にシェル実行環境を追加したもの、というのが率直な印象
  • Markdownエディタとしてはあまり使い勝手が良いとは感じなかった
    • ただし、自分は入力後に即レンダリングされるのが使いづらいと感じる派なので、ここは Obsidianも同じ
  • Obsidian のようなライトなドキュメント管理、とはちょっと雰囲気が違う印象
    • 自分の場合、Obsidian はメモや思索を適当に書いて、あとでたまに検索する、というライトな使い方がメイン
    • Ledge はちょっとそれとは違うというか、もう少し堅めの使い方が適しているようなと印象(ここは単にフィーリングの問題かも知れない)
  • Obsidianのような豊富な拡張性はなさそう
    • 自分の場合、Obsidian に Excalidraw プラグインを入れていて、概念図とか構成図なんかを書くのにも多用している
    • Ledgeでも画像は扱えるがそれだけ。拡張機能は存在しない

次にノートブックやプレイブックとして、Jupyterなどと比較した場合。

  • シェルに特化したノートブック環境という印象
    • Pythonなどを使う場合はブロック間で状態が保持されない
    • Jupyter Notebook / Marimo の代替にはならなそう
  • 手順書をそのまま実行できるランブックとしてはまあ良さそう
    • Jupyterなどでもできなくはないけど、そのためにノートブック実行環境を用意するのは微妙
    • ただ、手順書を見ながらコマンドを順に実行するぐらいなら、IaCを検討したくなる

ちょっと自分のイメージする用途にはハマらないかなぁ・・・

Getting Startedの冒頭に以下とある。

Ledge is the notebook for developers and DevOps.

そこはわからんではないんだよね。.ipy ファイルとかじゃないMarkdownで管理できて、そのまま実行できる、ってのは良さそうに思うし。ただ、シェル環境だけってのが物足りない感じ。他の言語環境でも同じように使えるといいんだけどな。

このスクラップは26日前にクローズされました