こんにちは。
今回、「Squat for Mac」 というmacOS向けのアプリを個人開発し、GitHubで公開しました。
ChatGPTやClaudeなどのAIツールを長時間使っていると、スクワットをするように促してくれるアプリです。
Download: Squat for Mac v0.9.2
なぜ作ったのか
最近、ChatGPTやClaude、CodexなどのAIツールを使って開発することが増えました。
AIによって開発の効率は上がりましたが、一方で、パソコンの前に座っている時間も長くなっています。
特にAIを使った開発では、プロンプトを入力してから回答が返ってくるまで、ちょっとした待ち時間が発生します。
「この時間に少しでも運動できたらいいのでは?」
というのが、開発のきっかけです。
とはいえ、運動するためにわざわざ別のアプリを開いたり、トレーニングメニューを考えたりするのは面倒です。
そこで、AIを使っている時間をきっかけに、1〜2回でもスクワットをする習慣を作れないかと考えました。
作ったもの
Squat for Macは、Macのメニューバーに常駐するシンプルな運動促進アプリです。
※画面内の運動記録はデモデータです。
主な機能は次の4つです。
- AIアプリの利用時間を計測:ChatGPT・Codex・Claudeの利用時間を計測
- スクワットのリマインド:一定時間AIを使うと運動を促す通知を表示
- カメラによる回数カウント:Macのカメラで上下運動を認識し、回数を自動計測
- 運動記録の可視化:GitHubのContribution Graphのようなカレンダーで運動履歴を確認
運動の目標回数は1〜30回から設定できます。
個人的には、毎日何十回もスクワットすることより、運動を始めるまでのハードルをできるだけ下げることを重視しています。
技術スタック
今回はmacOSのネイティブアプリとして実装しました。
| 技術 | 用途 |
|---|---|
| Swift | アプリケーションの実装 |
| SwiftUI | UIの構築 |
| AppKit | メニューバー・ウィンドウ管理 |
| AVFoundation | カメラ映像の取得 |
| Vision | 顔の位置検出・動作認識 |
| SQLite | 運動履歴のローカル保存 |
基本的にはAppleのフレームワークを活用しています。
① AIアプリの利用時間を計測する
AIアプリの利用状況を把握するために、NSWorkspaceを使用しています。
NSWorkspace.shared.frontmostApplication?.bundleIdentifier
この情報から、現在Macで前面に表示されているアプリを判定できます。
Squatでは、ChatGPT・Codex・ClaudeのBundle IDを対象として、利用時間を集計しています。
ただし、単純にアプリの起動時間を数えているわけではありません。
他のアプリを操作している時間や、5分以上操作がない時間、Macのスリープ中などは計測を停止します。
また、複数のAIアプリを開いていても、前面にあるアプリだけを計測することで、利用時間が二重に加算されないようにしています。
現在は、AIの回答生成そのものを検出しているのではなく、AIアプリを前面で使用している時間を基準に通知する仕組みです。
通知間隔は30〜180分から選択できます。
② Visionでスクワットをカウントする
スクワットの認識には、AppleのVisionフレームワークを使用しています。
今回採用したのは、身体全体の姿勢を詳細に解析する方式ではなく、顔の位置の上下移動を利用したシンプルなカウント方式です。
処理の流れは次のようになっています。
カメラ映像を取得
↓
Visionで顔を検出
↓
顔の位置を取得
↓
初期位置をキャリブレーション
↓
顔が一定以上下がったか判定
↓
元の位置まで戻ったか判定
↓
スクワット回数を +1
実装では、VNDetectFaceRectanglesRequestを使って顔の位置を取得しています。
ただし、単純に顔が下がって上がっただけでカウントすると、細かな頭の動きなどで誤検出が発生します。
そのため、移動量だけでなく、一定時間その位置に留まったか、下降から上昇までの時間が十分か、といった条件も組み合わせています。
また、カメラの画角や使用者の位置によって認識結果が変わるため、運動開始前に約3秒間のキャリブレーションを行うようにしました。
なお、この方式は上下運動をカウントするためのもので、スクワットのフォームを正確に評価するものではありません。
③ ローカルで完結する設計
カメラを利用するアプリなので、プライバシーにも配慮しました。
Squatでは、カメラ映像の処理をMac上で完結させています。
映像をサーバーへ送信したり、録画したりする仕組みはありません。
また、運動履歴にはSQLiteを使用し、ローカルに保存しています。
そのため、アカウント登録やクラウドサービスへの接続は必要ありません。
GitHubのContribution Graphのように運動を可視化
個人的に気に入っているのが、運動記録をカレンダー形式で可視化する機能です。
※こちらもデモデータです。
GitHubのContribution Graphのように、日々の積み重ねを視覚的に確認できるようにしています。
スクワットは1日数回でも構いません。
重要なのは、運動したという小さな実績が残ることだと考えています。
また、運動記録を画像として保存・共有する機能も用意しています。
インストール方法
現在、Apple Silicon搭載Mac向けの公開プレビュー版(v0.9.2) を配布しています。
以下からダウンロードできます。
ZIPファイルを展開し、アプリケーションフォルダに移動して利用できます。
なお、現時点ではApple Developer IDによる署名と公証には対応していないため、初回起動時にmacOSのセキュリティ警告が表示される場合があります。
詳しい手順はREADMEに記載しています。
ソースコードもGitHub上で公開しており、手元でビルドできます。
git clone https://github.com/rin999999334/squat-for-mac.git
cd squat-for-mac
./scripts/build.sh
open "dist/Squat for Mac.app"
※コードの公開ライセンスは現在未決定です。現時点では、改変・再配布を許可するオープンソースライセンスは付与していません。
今後について
まだ公開プレビュー版なので、改善したい部分はいくつかあります。
特に、今回の開発で実現したかったのは、AIの利用時間を計測すること自体ではなく、AIを利用する中で自然に運動するきっかけを作ることです。
将来的には、AIの回答生成中や生成完了のタイミングと連動できれば、より自然に運動を促せると考えています。
ただし、通常のChatGPTやClaudeの回答生成との連動は、現時点では実装済みの機能ではありません。
まずは実際に使ってもらいながら、通知のタイミングやスクワットの認識精度、UIなどを改善していきたいと思っています。
最後に
今回のSquat for Macは、かなり小さな課題から生まれたアプリです。
AIによって開発が便利になった一方で、人間が身体を動かす時間は減っている気がします。
だったら、AIを使う時間を少しだけ健康的な時間に変えられないか。
そんな発想から作りました。
同じようにMacで長時間作業している方や、AIを使って開発している方に試してもらえたらうれしいです。
フィードバックも歓迎しています。
気になった方はぜひGitHubを覗いてみてください。
GitHub: https://github.com/rin999999334/squat-for-mac
役に立ちそうだと思ったら、Starを付けてもらえると励みになります。

