選択テキストをローカルLLMで処理する「shirube」を作った

2026-09-24

テキストを選択して、キーを押す。すると、要約・翻訳・校正を手元の LLM がやってくれる。クラウドには何も送らない。

そういうツール「shirube(標)」を Rust で作った。

なぜ作ったか

便利な AI アシスタントはたくさんある。だが多くはクラウド前提で、選択したテキストはどこかのサーバに送られる。手元で動く LLM があるのに、それを使わないのはもったいない。

Wayland なら、選択中のテキストを拾ってローカルサーバに流すだけでいい。shirube はその配管を、使いやすい形にまとめたもの。

できること

shirube actions            # 使えるアクション一覧
shirube run summarize      # 選択中のテキストを要約
shirube run translate --copy
shirube run proofread --notify

shirube tui                # 対話UI(アクション選択 → ストリーミング)
shirube ask --rag "質問"    # 手元の資料を根拠に回答
shirube voice              # 録音 → ローカル文字起こし → 処理

仕組み

選択テキスト
  → wl-paste(primary selection)
  → shirube(Rust)
  → llama-server(OpenAI 互換, localhost:8080)
  → ストリーミング表示 / クリップボード / 通知

shirube 自身はモデルを持たない。OpenAI 互換のエンドポイントに繋ぐだけなので、llama.cpp でも何でもよい。

niri 連携

~/.config/niri/config.kdl にキーバインドを足す。

binds {
    Mod+Shift+A { spawn "foot" "--app-id=shirube" "-e" "shirube" "tui"; }
    Mod+Shift+G { spawn-sh "shirube run summarize --copy --notify"; }
    Mod+Shift+W { spawn "foot" "--app-id=shirube" "-e" "shirube" "voice"; }
}

文章を選んで Mod+Shift+G を押すだけで、要約がクリップボードと通知に入る。

アクションは設定で増やせる

~/.config/shirube/config.toml に書く。アクションごとにモデルも指定できるので、軽い処理は小さいモデル、重い処理は大きいモデルに振り分けられる。

[actions.summarize]
description = "要約する"
prompt = "次のテキストを日本語で簡潔に要約してください。\n\n---\n{input}"

[actions.deep]
description = "深く考える"
model = "Qwen3-30B-A3B-Instruct-2507-Q4_K_M.gguf"
prompt = "次の問いを多角的に検討してください。\n\n---\n{input}"

正直な制限

作ってみて

「クラウドに送らない」だけで、心理的な抵抗がかなり減る。手元のモデルは遅いが、要約や校正には十分で、何より自分のデータが自分のマシンから出ないのが大きい。

コードは MIT で公開している。