iPad / iPhone 向け SSH ターミナル「basho」を作った
iPad や iPhone からサーバーに SSH 接続して作業をする際、これまでいくつか既存のアプリ(moshi や Terminus など)を試してきましたが、どうしても解消できない不満がありました。
それは「外部キーボードを接続した際に、日本語 IME が正しく動作しない」「Apple の音声入力が使えない」という点です。
claude などの AI エージェントを使うときに、外部キーボードが実質的に使えないのは大きなストレスでした。
そこで、これらの不満を完全に解消する、自分にとって理想的な SSH ターミナルエミュレータをイチから作ることにしました。それが basho です。
basho とは?
basho は、iPad / iPhone 用に Swift で開発された SSH ターミナルエミュレータです。
名前の由来は、「bash」や「sh」といったシェルのアイデンティティを込めた「芭蕉」と、SSH で繋ぐ先の「場所」、そして「奥の細道」の旅にかけています。また、既存の SSH クライアントである「moshi(mosh)」へのアンチテーゼ的なネーミングでもあります。ちなみに、アプリアイコンは芭蕉の葉っぱをモチーフにしています。
こだわったポイントと主な機能
1. 完璧な日本語入力体験
最大の開発動機であった「日本語入力の不具合」を解消するため、iOS の標準的なテキスト入力基盤である UITextInput をベースに UI を構築しました。これにより、外部ハードウェアキーボードを接続していても、macOS や通常の iOS アプリと全く同じ感覚で日本語 IME(変換・確定・変換窓の適切な位置表示)が動作します。もちろん Apple の音声入力もシームレスに使えます。
2. 厳密な等幅フォント「Sarasa Term J」の同梱
ターミナルでの表示崩れを防ぐため、全角文字が半角文字の厳密に 2 倍の幅を持つ「Sarasa Term J(更紗ゴシック)」を同梱し、デフォルトフォントとして採用しています。
3. 強固な基盤技術
- 端末エミュレーション: Neovim フォークの
libvtermを vendor して組み込んでおり、高速かつ正確なエスケープシーケンスのパースを実現しています。256 色や TrueColor(24bit カラー)にも対応しています。 - SSH トランスポート: Apple 公式の
swift-nio-sshを採用。パスワード認証だけでなく、ed25519 などの公開鍵認証にも対応しています。
4. モバイルに最適化された UX
- 画面サイズに応じて目標のセル数(90×40 など)が収まるよう、フォントサイズを自動で拡縮します。
- ピンチイン・アウトによる直感的なフォントサイズ変更。
- 画面の PTY サイズは常にデバイスの画面サイズと同期されるため、
stty sizeの結果が正しく反映され、TUI アプリが崩れません。 - シングルタップで左クリック、ドラッグでマウス移動など、SGR マウスモードにも対応。
アーキテクチャ
プラットフォーム非依存のコア部分(TerminalCore, TerminalSession)と、プラットフォーム固有の UI 部分(iOS 用の BashoPad, Mac 用の BashoMac)を明確に分離した設計になっています。コアのロジックは Mac 側で SPM(Swift Package Manager)を使って高速にテスト(swift test)できるようにし、iOS アプリは xcodegen を使ってプロジェクトファイルを生成しています。
インストール方法(AltStore / SideStore)
Apple にお布施していないので、App Store では配信していません。興味のある方は、ご自身の Apple ID を使って AltStore や SideStore 経由でサイドロードすることでインストール可能です。
インストールやソースの追加は、以下の専用ページ(sougen.dev 非公式ストア)からワンタップで行えます。
まとめ
自分自身の「ここが使いにくい」という強いペインから生まれたアプリですが、SwiftUI や swift-nio-ssh などのモダンな技術スタックを組み合わせることで、非常に満足のいくターミナル環境を iPad 上に構築することができました。
これからは basho を使って、出先でも快適なリモート開発ライフを送りたいと思います。