logbook://zem

初めてのmacOSアプリ"Tsubame"を開発・リリース

Tsubame とは

Tsubame( https://github.com/zembutsu/tsubame ) は、私が初めて作った macOS アプリです[1]。2025年11月から GitHub 上のリポジトリで開発を開始し、12月8日に macOS のバイナリリリース(Apple による Notarization 済み)に至りました。2012年にも Apple Developer Program に登録し、アプリ開発を試みていましたが挫折。積年を経て、ようやく開発に至りました。以下は、簡単なアプリの機能や、開発経緯を記録として残します。

Tsubame は2画面のウインドウ操作を瞬時に行うアプリ

Tsubame は macOS のメニューバーに常駐するタイプのアプリです。機能としては、一般的に「ウインドウマネージャー」の領域であり、アプリとしては「作業効率化」にあたります。想定している利用者は、メインディスプレイと外部ディスプレイを分けて使っている方。特に、家や会社など場所によってディスプレイの位置が異なる方です。基本機能は主に2つ。1つはアプリのウインドウを、キーショートカットで瞬時に別のディスプレイに移動する機能。もう1つは、ウインドウ位置の記憶・復元です。

アプリを違うディスプレイに移動するには、アプリを選択した状態でキーボード操作をします。デフォルトでは Ctrl-Cmd-→ で拡張画面に移動し、Ctrl-Cmd-←でメインウインドウに戻せます。移動後に微妙にポジションを調整したい場合は、Ctrl-Cmd-WASD(↑←↓→)で微調整も可能。つまり、キーボード操作をするだけ、トラックパッドやマウスを使わなくても瞬時にウインドウを移動できます。

また、ウインドウの記憶・復元は自動でも手動でも行えます。たとえば、外部ディスプレイとのケーブルが抜けたり、電源が節電モードで切れたりすると、拡張ディスプレイで表示していたアプリはメイン画面に移動させられます。しかし、再び拡張ディスプレイの接続が復帰してもウインドウはメインに残ったまま。通常であれば、何もないディスプレイに手動でウインドウを再配置する必要がありました。Tsubame はウインドウ位置を自動記録していますので、拡張ディスプレイとの接続が切れても、再認識したあとは自動的にウインドウを再配置します。

どうして作ったのか

そもそも、なぜ Tsubame を作ったかといえば、私自身が困った・面倒だと思っていたからです。私が困っていたのは2画面での作業時。ふだん、メイン画面と拡張画面を横に並べて使っています。おそらく私だけの環境かもしれませんが、macOS がスリープ状態から復帰したら、拡張画面で操作していたウインドウが強制的にメイン画面に戻ってしまう困りごとがずっとありました。拡張画面側のディスプレイの電源復帰に時間がかかるか、あるいはディスプレイを認識するまでに時間がかかるのでしょうか。

いずれにしろ、メイン画面のウインドウを、毎回トラックパッドで移動する必要がありました。私は常に10以上のウインドウを動かしていますので、元の自分の快適だと思う場所に戻すという手間がありました。本当毎回面倒ですし、思っていたベストポジションにウインドウを調整するのも面倒でした。

どのようにして作ったのか

当初、このアプリは単純なディスプレイ間の移動機能だけを備えていました。キーショートカットによって瞬時に移動できる。ただそれだけの、シンプルなアプリ。当時の開発コードは Window Smart Mover という名称です。Tsubame の GitHub リポジトリ内[2]にも、開発当初の名残が今も残っています。

そして、いよいよアプリが動き意気揚々。これで全て解決したと思っていたのですが、この問題は根本的な私の悩みを解決しないのだと気づきました。

確かに、拡張ディスプレイにウインドウは瞬時に動かせるようになりました。キーボード操作だけで、本当に楽です。ですが、拡張ディスプレイに自動的にウインドウが再配置される機能こそが、私が本当に欲しかったものだと気づいたのです。そもそも、自動再配置できれば、キーボード操作で拡張ディスプレイにアプリを移動する手間すら不要になります。そして、ようやく主要機能をキーボード操作と自動復元の2つに絞っての開発がスタートしました。

ちなみに、似たようなツールとして Rectangle (https://rectangleapp.com/)や Magnet(https://magnet.crowdcafe.com/)は認識していました。ですが、どちらも私の求めている機能より多機能すぎたり学習コストが高そうだぞと。あるいはアプリは便利そうですが、ソースコードは公開されておらず、中身が見えなくて不安だという個人的な懸念もありました。

そして、たまたま Claude (ブラウザ版のチャット)を通して Xcode で開発できそうだと認識。あえて学習を通した車輪の再発明をしてみようと、勉強がてら取り組もうとしたのがスタート地点でした。その後、紆余曲折ありましたが、おおよそ1ヶ月でのリリースです。開発には Claude を使いました。Claude Code ではなく、普通にブラウザでの会話を通したのみです。何か開発用のツール導入や、生成AIサービスのAPI利用もありません。また、Vibe コーディングやspecのような定義をするような手法とも異なります。

基本的な進め方は、私がClaudeに指示したり質問したり、表示された内容を元に開発を進めました。そのため、もしかしたら、一般的な AI を使った開発手法とは異なり、AI 支援開発[3]と呼ばれる類型なのかなと思います。思いますというおは、既存の手法を意識しておらず、Claude との会話を通してアプリの完成に至ったつもり。具体的な開発手法については、また改めて整理して書こうと思います。


  1. なにをもって「アプリ」とするかですが、SwiftUI で作ったバイナリ形式のアプリは、初めてです。 ↩︎

  2. https://github.com/zembutsu/tsubame/tree/main/WindowSmartMover ↩︎

  3. AI-Assisted Development ↩︎