CLI で動く RSS/Atom フィードリーダー。fastladder へのオマージュ。
- ターミナル上の 3 ペイン TUI で記事を読む
- ブラウザから閲覧できるローカル Web UI(
ladder server) - SQLite にローカル保存(
~/.config/ladder/ladder.db) - MCP サーバーモードで AI エージェントからも参照可能
- Node.js 20 以上
git clone https://github.com/your/ladder.git
cd ladder
npm install
npm run build # esbuild でバンドル → bin/ladder.js 生成開発時は npx tsx bin/ladder.ts で直接実行できます。
ladder add https://example.com/feed.xmlladder fetch # 全フィードを取得
ladder fetch --feed 3 # フィード ID 3 のみ取得cron での定期実行例(30 分ごと):
*/30 * * * * /usr/local/bin/ladder fetch >> ~/.config/ladder/fetch.log 2>&1ladder uiladder server # http://127.0.0.1:4317
ladder server --port 8080 # ポート指定
ladder server --host 0.0.0.0 # LAN / Tailscale 公開時ブラウザで http://127.0.0.1:4317 を開くと、TUI と同じ 3 ペイン構成で記事を読めます。キーバインドも TUI に揃えています(j / k / Space / p / e / ? など)。Podcast エントリーはインラインの <audio> プレーヤーで再生できます。
初回起動前に npm run build:web で SPA をビルドしておいてください(npm run build でも一緒にビルドされます)。開発時は npm run dev:client で Vite HMR を有効にし、npm run dev:server で API サーバーを別プロセスで動かせます。
ladder opml import subscriptions.opml # インポート
ladder opml export # stdout へエクスポート
ladder opml export out.opml # ファイルへエクスポートladder category add "Tech"
ladder category add "Tech/Frontend" # スラッシュでネスト(1 段階)
ladder category list
ladder category rename "Tech" "Technology"ladder feed move 3 "Tech" # フィード ID 3 をカテゴリへ移動
ladder feed move 3 --uncategorize # カテゴリ解除ladder podcast download --days 7 # 直近 7 日分をダウンロード
ladder podcast download --count 10 # 最新 10 話をダウンロード
ladder podcast download --feed 3 # フィード ID 3 のみ
ladder podcast download --feed 3 --days 30 --dir ~/Downloads/podcasts保存先のデフォルトは ~/.config/ladder/podcasts/。既にダウンロード済みのファイルはスキップされます(冪等)。
TUI から個別にダウンロードするには、エントリーを選択して Shift+D を押します。enclosure_url が未取得の場合はフィードを自動再フェッチしてからダウンロードします。
ladder purge # 既読記事を 90 日以上前のものを削除(デフォルト)
ladder purge --days 30| キー | 動作 |
|---|---|
j / k |
フォーカス依存: Feeds ペイン→フィード移動 / それ以外→エントリー移動(自動既読) |
J / K |
同上・ページ単位移動 |
n |
フィードカーソルを次へ(どのペインからでも) |
p |
ピン留めトグル |
Space |
未読記事を順に読む(スクロール → 次エントリー → 次フィード) |
b |
逆方向ページ送り |
v |
選択中の記事をブラウザで開く |
e |
記事全文をサイトからフェッチして表示(再押しで元に戻す) |
E |
AI 要約 / 日本語翻訳(再押しで元に戻す) |
Shift+D |
Podcast MP3 をダウンロード(enclosure_url 未取得時は自動フェッチ) |
/ |
タイトル・本文を全文検索 |
r |
選択フィードをリロード |
R |
全フィードをリロード |
Tab / Shift+Tab |
ペインのフォーカスを切り替え |
? |
ヘルプを表示 |
q |
終了 |
| キー | 動作 |
|---|---|
↓ / ↑ |
フィード・カテゴリを移動 |
Enter |
フィード選択 / カテゴリ折りたたみ |
s |
ソート切替(未読数順 ↔ 最新記事順) |
H |
フィルター切替(active → unread → all) |
a |
カテゴリ割り当て |
C |
カテゴリマネージャーを開く |
d |
フィード購読解除(確認あり) |
| キー | 動作 |
|---|---|
↓ / ↑ |
記事を移動(自動既読) |
u |
未読 / 既読トグル |
m |
フィード全件を既読にする |
v |
ブラウザで開く |
Claude Desktop や Claude Code から ladder のフィード・記事を参照できます。
ladder mcp # stdio transport で起動設定例(~/.config/claude/claude_desktop_config.json):
{
"mcpServers": {
"ladder": {
"command": "ladder",
"args": ["mcp"]
}
}
}利用可能なツール:
| ツール | 概要 |
|---|---|
list_feeds |
購読中フィード一覧 |
list_entries |
記事一覧(フィード・未読・ピン絞り込み対応) |
get_entry |
記事詳細(本文を含む) |
search_entries |
全文検索(SQLite FTS5) |
get_pinned_entries |
ピン済み記事一覧 |
mark_as_read |
記事 / フィードを既読にする |
fetch_now |
即時クロール |
| 項目 | 採用 |
|---|---|
| 言語 | TypeScript (Node.js 20+) |
| TUI | neo-blessed |
| Web サーバー | Hono |
| Web フロント | Vue 3 + Pinia + Vite |
| HTML サニタイズ | isomorphic-dompurify |
| DB | SQLite (better-sqlite3、WAL モード、FTS5) |
| CLI | commander |
| RSS パーサー | rss-parser |
| MCP | @modelcontextprotocol/sdk |
MIT