Pulse - Device Monitor
Tailscale 上の端末の CPU / GPU 負荷、メモリ、温度、消費電力、ファン回転数をラック風の画面で確認する iPhone / iPad / Mac 向けアプリのサポートページです。
動作に必要なもの
Pulse は端末の状態を自分で測定しません。監視したい各端末に、この配布ページのエージェント pulse.py を入れて動かす必要があります。アプリはそのエージェントに HTTP で問い合わせて数値を表示します。
- 監視する端末とアプリを動かす端末が、同じ Tailscale の tailnet に接続していること
- 監視する端末に Python 3 が入っていること
- アプリに登録するのは、表示名と端末の Tailscale IP アドレスだけです
エージェントは TLS も認証もありません。ポート 9876 を LAN やインターネットへ公開しないでください。既定では Tailscale の IPv4(100.64.0.0/10)、Tailscale IPv6、localhost からの接続だけを受け付けます。
エージェントの導入
エージェントは 1 ファイルの Python スクリプトです。リポジトリの agent/ から取得するか、下の手順で取得してください。
macOS
powermetrics は root 権限が必要なため、LaunchDaemon として動かします。機種によってはファームウェアが絶対温度やファン回転数を公開せず、その項目が -- のままになります。
curl -fLO https://raw.githubusercontent.com/0x006a6d/pulse-support/main/agent/pulse.py
curl -fLO https://raw.githubusercontent.com/0x006a6d/pulse-support/main/agent/com.erimin.pulse-agent.plist
PYTHON_BIN="$(command -v python3)" || { echo "python3 is required" >&2; exit 1; }
sudo mkdir -p /usr/local/lib/pulse
sudo cp pulse.py /usr/local/lib/pulse/
sudo cp com.erimin.pulse-agent.plist /Library/LaunchDaemons/
sudo /usr/libexec/PlistBuddy -c "Set :ProgramArguments:0 $PYTHON_BIN" /Library/LaunchDaemons/com.erimin.pulse-agent.plist
sudo chown root:wheel /Library/LaunchDaemons/com.erimin.pulse-agent.plist
sudo launchctl bootout system/com.erimin.pulse-agent 2>/dev/null || true
sudo launchctl bootstrap system /Library/LaunchDaemons/com.erimin.pulse-agent.plist
Linux
CPU とメモリは /proc、温度・ファン・電力は /sys/class/hwmon から読みます。NVIDIA GPU は nvidia-smi、AMD GPU は rocm-smi が使える場合に GPU 使用率・温度・電力も取得します。
curl -fLO https://raw.githubusercontent.com/0x006a6d/pulse-support/main/agent/pulse.py
curl -fLO https://raw.githubusercontent.com/0x006a6d/pulse-support/main/agent/pulse-agent.service
PYTHON_BIN="$(command -v python3)" || { echo "python3 is required" >&2; exit 1; }
sudo mkdir -p /opt/pulse
sudo cp pulse.py /opt/pulse/
sudo cp pulse-agent.service /etc/systemd/system/
sudo sed -i "s|^ExecStart=.*|ExecStart=$PYTHON_BIN /opt/pulse/pulse.py|" /etc/systemd/system/pulse-agent.service
sudo systemctl daemon-reload
sudo systemctl enable --now pulse-agent
Windows
Python 3 を全ユーザー向けにインストールしてから、管理者権限の PowerShell で実行します。
Set-ExecutionPolicy -Scope Process Bypass
.\install-windows.ps1
CPU 負荷、メモリ、稼働時間は Windows 単体で取得できます。GPU 使用率・温度・ファン・電力も表示するには、LibreHardwareMonitor を起動し、Options の WMI を有効にしてください。
疎通確認
エージェントを入れた端末自身で確認します。
curl http://127.0.0.1:9876/health
curl http://127.0.0.1:9876/v1/metrics
アプリ側は右上の + から、表示名とその端末の Tailscale IP アドレスを登録します。
履歴
アプリはグラフ用の記録を、自分が前面にある間しか取れません。アプリを閉じていた時間は記録が残らず、グラフの点が飛びます。エージェントは常時動いているので、30 分ごとに区切った直近 7 日分の履歴を自分で持ち、/v1/history で返します。アプリはこれを取り込んで穴を埋めます。
curl http://127.0.0.1:9876/v1/history
保存先は既定で次の場所です。--history-file で変更できます。保持期間は --history-retention で秒数を指定します。
- Linux:
/var/lib/pulse/history.json(systemd unit のStateDirectory=pulseで作られます) - macOS:
/usr/local/var/pulse/history.json - Windows:
%ProgramData%\Pulse\history.json
Linux で保存先を変える場合は /var/lib/pulse の配下にしてください。unit は ProtectSystem=strict で動いており、書き込めるのは StateDirectory が用意した場所だけです。配下の外へ置くなら、その場所に対応する StateDirectory を unit に追加します。
すでに Linux へ導入済みの場合は、pulse-agent.service を新しいものへ置き換えたうえで、次を実行してください。StateDirectory が無いと履歴を書き込めません。
sudo systemctl daemon-reload
sudo systemctl restart pulse-agent
つながらないとき
アプリに「接続できませんでした」「エージェントに接続できません」と表示される場合、次の順に確認します。
- アプリを動かしている iPhone / iPad / Mac 自身の Tailscale が接続されていること。登録するアドレスは tailnet 内でのみ届くため、アプリ側の端末が tailnet から切断されていると経路が無く、接続はタイムアウトします。Tailscale アプリを開いて接続状態を確認してください。
- 監視する端末の Tailscale が接続され、tailnet 上でオンラインであること。いずれかの端末で
tailscale statusを実行すると、各端末のオンライン状態と Tailscale IP を一覧できます。 - 監視する端末でエージェントが動いていること。その端末自身で
curl http://127.0.0.1:9876/healthが応答するか確認します。状態は macOS ならsudo launchctl print system/com.erimin.pulse-agent、Linux ならsystemctl status pulse-agentで確認できます。 - エージェントが localhost だけで待ち受けていないこと。
--bind 127.0.0.1を付けて起動すると同じ端末からしか届きません。既定の0.0.0.0のまま起動してください。 - アプリに入力したアドレスが Tailscale IP であること。LAN のアドレス(
192.168.x.xなど)はエージェントが既定で拒否します。
監視する端末自身での curl http://127.0.0.1:9876/health と、tailnet 上の別の端末からの curl http://<Tailscale IP>:9876/health を両方試すと、エージェントが動いているかどうかと、tailnet 経由で届くかどうかを別々に確認できます。前者だけが成功する場合は、エージェントの待ち受けアドレス(--bind)、監視する端末のファイアウォール設定、Tailscale の ACL を順に確認してください。
アプリ内課金
端末は 4 台まで無料で登録できます。5 台目以降を登録するには買い切りのアプリ内課金が必要です。購入は iPhone / iPad / Mac で共通で、いずれか 1 台で購入すれば同じ iCloud アカウントの他の端末でも有効になります。
他の端末で購入済みなのに反映されない場合は、購入画面の「購入を復元」を実行してください。
利用条件は Apple の 標準使用許諾契約(EULA)に従います。
プライバシーポリシー
最終更新: 2026年8月5日
収集しない情報
Pulse は氏名、メールアドレス、電話番号、位置情報、連絡先、写真、その他の個人情報を収集しません。広告ネットワークや行動解析の SDK は組み込んでいません。
端末内に保存される情報
- ユーザーが登録した端末の表示名、IP アドレス、ポート番号
- エージェントから取得したテレメトリ(CPU / GPU 使用率、CPU / GPU 温度、メモリ使用率、消費電力、ファン回転数、稼働時間、サーマル状態)とその履歴
これらはアプリを動かしている端末の中だけに保存されます。開発者はこれらを受け取りません。テレメトリの通信は、ユーザー自身の tailnet 内で、アプリとエージェントの間だけで完結します。
第三者に送信される情報
- Apple: アプリ内課金の決済と領収書の検証は App Store が処理します。
- RevenueCat: 購入状態の管理に RevenueCat を使用しています。送信されるのは匿名の購入者 ID、購入・復元の履歴、端末のプラットフォーム情報です。氏名やメールアドレスは送信しません。
- iCloud: 購入を端末間で共有するため、iCloud のキーバリューストアに匿名の識別子(UUID)を 1 件だけ保存します。この値は Apple のアカウント内に保存され、開発者は参照できません。
データの削除
アプリを削除すると、端末内に保存された登録情報とテレメトリ履歴は削除されます。iCloud に保存された識別子は、iOS の「設定 > ユーザー名 > iCloud > アカウントのストレージを管理」から Pulse のデータを削除すると消えます。
子どもの利用
Pulse は特に子どもを対象としたアプリではなく、13 歳未満の利用者から意図的に情報を収集することはありません。
変更
このポリシーを変更した場合は、このページを更新し、上の最終更新日を書き換えます。
問い合わせ
不具合の報告や質問は GitHub の Issues へ投稿してください。
English
Pulse - Device Monitor shows CPU / GPU load, memory, temperature, power draw and fan speed for machines on your Tailscale network. Each monitored machine must run the pulse.py agent distributed from this page.
Privacy. Pulse does not collect names, email addresses, phone numbers, location, contacts or photos, and contains no advertising or analytics SDKs. Machine names, addresses and the telemetry read from your agents are stored only on your own device; telemetry travels only between the app and your agents inside your own tailnet. Purchases are processed by the App Store, and purchase state is managed through RevenueCat, which receives an anonymous customer ID, purchase history and platform information. One anonymous identifier (a UUID) is stored in iCloud key-value storage so a purchase unlocks on your other devices. Deleting the app removes the data stored on that device.
Terms. Use of the app is governed by Apple's Standard End User License Agreement.
Support. Report issues at GitHub Issues.