# iPad / iPhone 向け SSH ターミナル「basho」を作った

2026-08-14

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 非公式ストア）からワンタップで行えます。

[https://altstore.sougen.dev/](https://altstore.sougen.dev/)

## まとめ

自分自身の「ここが使いにくい」という強いペインから生まれたアプリですが、SwiftUI や `swift-nio-ssh` などのモダンな技術スタックを組み合わせることで、非常に満足のいくターミナル環境を iPad 上に構築することができました。

これからは basho を使って、出先でも快適なリモート開発ライフを送りたいと思います。
