https://github.com/hideack/ladder
https://github.com/hideack/ladder
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/hideack/ladder
- Owner: hideack
- License: mit
- Created: 2026-03-14T07:49:57.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-03-29T12:25:13.000Z (3 months ago)
- Last Synced: 2026-03-29T12:42:51.221Z (3 months ago)
- Language: TypeScript
- Size: 177 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ladder
CLI で動く RSS/Atom フィードリーダー。[fastladder](https://github.com/fastladder/fastladder) へのオマージュ。
- ターミナル上の 3 ペイン TUI で記事を読む
- SQLite にローカル保存(`~/.config/ladder/ladder.db`)
- MCP サーバーモードで AI エージェントからも参照可能
## 必要環境
- Node.js 20 以上
## インストール
```bash
git clone https://github.com/your/ladder.git
cd ladder
npm install
npm run build # esbuild でバンドル → bin/ladder.js 生成
```
開発時は `npx tsx bin/ladder.ts` で直接実行できます。
## 使い方
### フィードを追加する
```bash
ladder add https://example.com/feed.xml
```
### 記事を取得する
```bash
ladder fetch # 全フィードを取得
ladder fetch --feed 3 # フィード ID 3 のみ取得
```
cron での定期実行例(30 分ごと):
```bash
*/30 * * * * /usr/local/bin/ladder fetch >> ~/.config/ladder/fetch.log 2>&1
```
### TUI を起動する
```bash
ladder ui
```
### OPML
```bash
ladder opml import subscriptions.opml # インポート
ladder opml export # stdout へエクスポート
ladder opml export out.opml # ファイルへエクスポート
```
### カテゴリ管理
```bash
ladder category add "Tech"
ladder category add "Tech/Frontend" # スラッシュでネスト(1 段階)
ladder category list
ladder category rename "Tech" "Technology"
```
### フィード操作
```bash
ladder feed move 3 "Tech" # フィード ID 3 をカテゴリへ移動
ladder feed move 3 --uncategorize # カテゴリ解除
```
### Podcast エピソードをダウンロードする
```bash
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` が未取得の場合はフィードを自動再フェッチしてからダウンロードします。
### 古い記事を削除する
```bash
ladder purge # 既読記事を 90 日以上前のものを削除(デフォルト)
ladder purge --days 30
```
## TUI キーバインド
### 全ペイン共通
| キー | 動作 |
|---|---|
| `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` | 終了 |
### Feeds ペイン
| キー | 動作 |
|---|---|
| `↓` / `↑` | フィード・カテゴリを移動 |
| `Enter` | フィード選択 / カテゴリ折りたたみ |
| `s` | ソート切替(未読数順 ↔ 最新記事順) |
| `H` | フィルター切替(active → unread → all) |
| `a` | カテゴリ割り当て |
| `C` | カテゴリマネージャーを開く |
| `d` | フィード購読解除(確認あり) |
### Entries ペイン
| キー | 動作 |
|---|---|
| `↓` / `↑` | 記事を移動(自動既読) |
| `u` | 未読 / 既読トグル |
| `m` | フィード全件を既読にする |
| `v` | ブラウザで開く |
## MCP サーバー
Claude Desktop や Claude Code から ladder のフィード・記事を参照できます。
```bash
ladder mcp # stdio transport で起動
```
設定例(`~/.config/claude/claude_desktop_config.json`):
```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 |
| DB | SQLite (better-sqlite3、WAL モード、FTS5) |
| CLI | commander |
| RSS パーサー | rss-parser |
| MCP | @modelcontextprotocol/sdk |
## ライセンス
MIT