🚀

AIコーディングアシスタント、AIエディタをパパッと開ける、macOS向けの高速ランチャー「Ignitero Launcher」を自作した話

に公開

はじめに

しばらくAlfredを使っていたのですが、開発作業をしていく中で以下のような不満が出てきました。

  • 特定のディレクトリ配下のプロジェクトはCursorで開きたい
  • 特定のディレクトリ配下のプロジェクトはWindsurfで開きたい
  • 特定のディレクトリを手軽にターミナルで開きたい

Alfredでこれらを実現するのは難しそうだったため、以前macOS向けのメニューバー常駐アプリを作った経験を活かして、自分のニーズに合ったランチャーをClaude CodeCodex CLIを使用して自作することにしました。

この記事では、Tauri v2で構築したステータスバー常駐型ランチャー「Ignitero Launcher」の特徴と、実装のポイントについて紹介します。

想定読者

  • macOSで開発している方
  • 複数のエディタやターミナルを使い分けている方
  • ランチャーアプリに興味がある方
  • Tauriでのアプリ開発に興味がある方

開発の背景:Alfredでは実現できなかったこと

Alfredは優れたランチャーですが、私が求めていた機能には以下のような制約がありました。

ディレクトリごとに異なるエディタで開きたい

開発プロジェクトが複数あり、それぞれ異なるエディタで開きたいケースがあります。

  • ~/GitHub 配下にあるプロジェクト → Windsurf で開きたい
  • ~/git 配下にあるプロジェクト → Cursor で開きたい
  • ~/Documents/notes → VS Code で開きたい

ターミナルを手軽に開きたい

最近はCursorやWindsurfなどのAI搭載エディタを活用していますが、ターミナルベースのAIコーディングアシスタント(Claude CodeCodex CLIGemini CLIなど)も頻繁に使用します。プロジェクトディレクトリをターミナルで開く操作が何度も発生するため、これを極限まで高速化したいと考えました。

これらの要望を実現するため、自分専用のランチャーを作ることにしました。

以下では、上記の課題を解決する主要な機能と、その実装について紹介します。

Ignitero Launcherの特徴

開発したIgnitero Launcherは、上記の課題を解決する以下の特徴を持っています。

1. 柔軟なディレクトリ管理

ディレクトリごとに細かく動作を設定できます。

ディレクトリ自身の設定:

  • 検索に表示しない / Finderで開く / エディタで開く を選択可能
  • エディタで開く場合、Windsurf/Cursor/VS Codeから選択
  • カスタム検索キーワードの設定(ディレクトリにエイリアスのようなキーワードを設定できる)

配下のディレクトリの設定:

  • 検索に表示しない / Finderで開く / エディタで開く を選択可能
  • エディタで開く場合、Windsurf/Cursor/VS Codeから選択

この設定により、冒頭で挙げた要望を全て実現できました。

2. ターミナル統合

ディレクトリを選択している状態でキーを押すだけで、そのディレクトリをターミナルで開けます。

対応ターミナル:

  • macOSデフォルトターミナル
  • iTerm2
  • Warp

設定画面でデフォルトで使うターミナルを選択でき、インストールされているターミナルだけが選択肢に表示されるようになっています。

ワークフローの例:

  1. Option+Spaceでランチャー起動
  2. プロジェクト名を入力
  3. 検索結果からディレクトリを選択
  4. キーでターミナルを開く
  5. ターミナルでAIコーディングアシスタント(claudecodexgeminiなど)を手動起動

注意: ランチャーはターミナルを開くところまでを担当し、AIコーディングアシスタントのコマンド実行は手動で行います。それでも、従来と比べて大幅に高速化されました。

実装としては、Rustでopen -a Terminal/iTerm/Warp <path>を実行してターミナルを起動するシンプルなコマンドです。ターミナルベースのAIコーディングアシスタント(Claude Code、Codex CLI、Gemini CLI)を頻繁に使うため、この小さな改善が大きな時間短縮につながっています。

3. 高速な日本語検索

SQLiteキャッシュとファジーマッチングにより、高速なインクリメンタル検索を実現しています。

IME制御の実装:
ランチャー起動時は英字入力で検索したいため、以下の二段構えで対応しました。

  • Carbon APIによる英字レイアウト強制: ウィンドウフォーカス時にCarbon APIで英字入力モードに切り替え
  • かな入力のローマ字変換補完: wanakanaライブラリでかな入力をローマ字に自動変換

Carbon APIによる強制切り替えが機能しない環境でも、かな入力中のローマ字変換により柔軟に検索できるようになりました。

4. グローバルホットキー

Option+Spaceでどこからでも検索窓を呼び出せます。ショートカットキーの組み合わせは実装時点では固定ですが、頻繁に使うものなので、素早くアクセスできるようにしました。

5. 自動キャッシュ更新

アプリケーションやディレクトリの情報を最新に保つため、以下のタイミングで更新できます。

  • アプリ起動時: 設定でON/OFF可能
  • 自動更新: 1〜24時間の間隔を設定可能(ON/OFF可能)
  • 手動更新: 検索画面の🔄ボタンまたは設定画面から

設定画面でこれらを個別にカスタマイズできるため、自分の使用パターンに合わせた更新頻度を設定できます。例えば、頻繁に新しいアプリをインストールする場合は起動時更新をONに、安定した環境では手動更新のみにする、といった使い分けが可能です。

検索画面に🔄キャッシュ更新ボタンも配置しているため、必要な時だけ手軽に更新できるようにしました。

実装のポイント

ここからは、上記の特徴を支える技術実装を、開発者目線で紹介します。

技術スタック

Ignitero LauncherはTauri v2で構築しています。

フロントエンド:

  • React 18 + TypeScript
  • Vite
  • Ant Design(UI)

バックエンド:

  • Rust
  • Tauri v2
  • SQLite(rusqlite)
  • fuzzy-matcher(ファジー検索)

Tauriを選んだ理由は、以前のメニューバー常駐アプリ開発の経験があったことと、Rustによる高速な処理とReactによる柔軟なUIを両立できる点です。

メニューバー常駐アプリの実装

Tauriを使ってメニューバー常駐アプリを作ったことがあったので、それを活かしてメニューバー常駐アプリとしました。
メニューバーに常駐しますがDockにはアイコンを表示しないようにしてあります。
このへんもTauriの設定で可能です。

アプリケーションスキャンの実装(特徴5: 自動キャッシュ更新)

/Applicationsディレクトリと登録されたディレクトリ配下の.appファイルをスキャンし、SQLiteにキャッシュします。

ディレクトリをエディタで開く実装(特徴1: 柔軟なディレクトリ管理)

ディレクトリを選択されたエディタで開く処理は、Rustのバックエンド側で実装しています。

設定例とディレクトリツリー:

~/GitHub/
├── project-a/
├── project-b/
└── project-c/

~/GitHubを以下のように登録した場合:

設定画面での入力:

  1. ディレクトリを追加で~/GitHubを選択
  2. 「このディレクトリ自身」セクション:
    • 開き方: 検索に表示しない を選択
  3. 「配下のディレクトリ」セクション:
    • 開き方: エディタで開く を選択
    • エディタ: Cursor を選択

検索結果と動作:

  • 「proa」で検索 → ~/GitHub/project-aがヒット → Cursorで~/GitHub/project-aを開く
  • 「prob」で検索 → ~/GitHub/project-bがヒット → Cursorで~/GitHub/project-bを開く

このように、設定画面の「このディレクトリ自身」と「配下のディレクトリ」のラジオボタンで、親ディレクトリと配下のディレクトリを個別に制御できます。プロジェクトの性質に応じた柔軟な使い分けが可能です。

実装のポイント:

  • open -a "App Name" <path>でシンプルに起動
  • .code-workspaceファイルがあればそれを優先的に開く(エディタの場合のみ)
  • macOSのLaunchServicesがアプリケーション名からバンドルを自動解決
  • ターミナルと同じシンプルな起動方式を採用

履歴による検索順位の最適化(特徴3: 高速な日本語検索の一部)

ユーザーの利用パターンに合わせて検索結果を最適化するため、選択履歴を記録して検索結果のソートに活用しています。

実装の仕組み:

  • 検索キーワードと選択されたパスの組み合わせを履歴として保存(最大50件)
  • 同じキーワードで何度も選択されているパスを優先的に上位表示
  • localStorage に履歴を永続化

効果:
例えば「cursor」と検索した時、過去に何度も選択している「Cursor.app」が必ず最上位に表示されるため、検索→選択の操作が高速化されます。よく使うプロジェクトやアプリほど素早くアクセスできるようになりました。

キーボードナビゲーションの最適化(UI/UX改善)

検索結果が多い場合でも、快適に操作できるよう以下の工夫を実装しました。

  • 選択項目の自動スクロール: ↑↓キーで項目を選択すると、画面外の項目も自動的にスクロールして表示
  • useRefベースの実装: document.querySelectorではなくuseRefを使用してパフォーマンスと型安全性を向上
  • 即座のスクロール: behavior: 'auto'でキーボード連続入力時の遅延を解消

codexでのコードレビューを経て、これらの最適化を実施しました。

エディタとターミナルの自動検出(設定の使いやすさ向上)

設定画面では、実際にインストールされているエディタとターミナルだけが選択肢に表示されます。

// /Applications配下の.appファイルの存在を確認
if Path::new("/Applications/Windsurf.app").exists() {
    available.push("windsurf".to_string());
}

インストールしていないツールが選択肢に出てこないため、設定がシンプルで分かりやすくなっています。

パフォーマンス最適化(品質向上)

開発中にcodexを使ったコードレビューを実施し、以下のパフォーマンス改善を行いました。

  • エディタアイコンのIPCキャッシュ: 同じエディタのアイコンは1回のみ取得するようキャッシュ化
  • 設定保存の軽量化: 設定変更時の不要なキャッシュ再構築を削除し、UIフリーズを解消
  • 設定ファイルのバックアップ: 設定ファイル破損時に自動バックアップを作成し、データ損失を防止

使ってみた感想

実際に使ってみて、開発背景で挙げた課題が以下のように解決されました。

課題1「ディレクトリごとに異なるエディタで開きたい」の解決

柔軟なディレクトリ管理機能により、プロジェクトごとに適切なエディタで開けるようになりました。

  • ~/GitHub 配下 → Windsurf
  • ~/git 配下 → Cursor
  • ~/Documents/notes → VS Code

という使い分けが実現でき、エディタを間違えることがなくなりました。

課題2「ターミナルを手軽に開きたい」の解決

キーでターミナルを開く機能により、ターミナルベースのAIコーディングアシスタント(Claude Code、Codex CLI、Gemini CLI)を使う際のワークフローが大幅に短縮されました。

従来: ターミナルで開く → cdコマンド → AIコーディングアシスタント起動
改善後: ランチャーで検索 → キー → AIコーディングアシスタント起動

この改善により、マウス操作も不要、かつ少ないキーで完了するようになりました。

その他の改善効果

  • 検索の快適性: 選択項目の自動スクロールにより、多数の検索結果からでも素早く目的の項目にアクセス可能
  • 履歴による最適化: よく使うプロジェクトが常に上位表示されるため、さらに高速化

まとめ

Alfredでは実現しづらかった「ディレクトリごとに異なるエディタで開く」「ターミナルを手軽に開く」といった要望を満たすため、Tauri v2でオリジナルのランチャーを開発しました。

SQLiteキャッシュによる高速検索、日本語検索の最適化、柔軟なディレクトリ管理など、自分のワークフローに合わせた機能を実装できたことで、日々の開発作業が効率化されました。

既存のランチャーでは物足りない部分がある方や、Tauriでのアプリ開発に興味がある方の参考になれば幸いです。

リポジトリ

ソースコードはGitHubで公開しています。

https://github.com/owayo/ignitero-launcher

ダウンロード

気になったら以下から使ってみてください。
そのままでは開けないので、macOS使っている方ならおなじみだと思いますがプライバシーとセキュリティから許可して開いてください。

https://github.com/owayo/ignitero-launcher/releases

Discussion