The nanoui gallery: buttons, toggles, sliders and a text field, drawn by nanoui
出典: github.com

Zigで画面を記述するデスクトップ向けツールキット

nanouiは、プログラミング言語Zigでデスクトップアプリの画面を作るGUIツールキットです。ウィンドウや入力、レイアウト、描画を扱い、HTMLやJavaScript、WebViewを使わないネイティブUIを構築できます。

対応OSはmacOS、iOS、Linux、Windowsです。GPU描画はmacOSのMetalとLinuxのOpenGLに対応し、LinuxではCPU描画も選べます。WindowsはCPU描画です。

macOSでは、システムのWebViewでページを表示し、JavaScriptからZigの処理を呼び出す方式も選べます。ネイティブUIとは異なる構成で、現時点ではmacOSに対応しています。

レイアウト、入力、アニメーションを提供

レイアウトはFlexbox形式に対応し、ボタン、チェックボックス、スライダー、テキスト入力などを利用できます。IME(日本語などの文字変換を伴う入力)にも対応しますが、iOSでは変換を伴う入力は未対応です。

大量の項目を扱う画面では、表示範囲の行だけを組み立てる仮想化リストを使えます。テキストの選択とコピー、画像表示、テーマ、影、アニメーションなども備えています。

画面は状態をもとにイベントごとに組み立て直す即時モード方式です。ウィジェットの操作で状態が変わると、描画前に画面を再構築します。macOSではMetalとCoreTextを使い、フレームごとに1回の描画呼び出しで描画します。

開発、テスト、対応環境

開発用CLIの「nui」は、プロジェクトの作成やビルド、テストを行います。ウィンドウを開かずにUIをテストし、画面をPNG画像として保存する機能もあります。

開発にはZig 0.17.0が必要です。macOS向けにはMacとmacOS SDK、iOS向けにはMacとXcodeが必要で、Linuxアプリの実行にはGTK 3が必要です。

nanouiは0.x系のため、マイナーリリースでAPIが変わる可能性があります。ライセンスはMITで、mygoやGPUIに由来する部分にはそれぞれのライセンス表記が残されています。

nanotermやnanomonでの利用

開発者のRach Pradhan氏は、nanouiをターミナルアプリ「nanoterm」と稼働状況監視アプリ「nanomon」に採用しています。nanotermはコマンド実行とコーディングエージェントへの依頼を一つの入力欄で扱い、コマンドごとの出力や成否をブロック単位で表示します。

nanotermはACP(Agent Client Protocol)を使ってエージェントと接続します。ACPはクライアントアプリとエージェントの通信規格で、JSON-RPC 2.0に基づき、要求と応答のほか、進行状況などを伝える通知を扱います。

ACPではエージェントがクライアントへツール利用の許可を求められ、クライアント側が利用者への確認を担います。nanotermでは権限要求を会話内の選択ボタンで表示し、Claude Codeなど複数のエージェントに対応しています。

nanomonはCPUやメモリ、GPU、ディスク、ネットワークの状況をグラフで表示し、プロセスの確認や終了もできます。nanouiの紹介動画に登場し、ウィンドウを開かずにUIを操作して作られました。

既存のZig向けGUIとの違い

zguiはDear ImGuiのZigバインディングを基にしたMach向けのフォークで、WebGPUを使う構成です。nanouiは、Zigだけで記述するネイティブUIと、OSのWebViewを使う方式を提供しています。

DVUIはSDL2・SDL3、Web、Raylib、DirectX 11などのバックエンドを持つ即時モードGUIです。nanouiはmacOS・Linux・Windows・iOSを対象とし、OSごとにGPUまたはCPUの描画方式を使い分けます。