Pulse - Device Monitor

Tailscale 上の端末の CPU / GPU 負荷、メモリ、温度、消費電力、ファン回転数をラック風の画面で確認する iPhone / iPad / Mac 向けアプリのサポートページです。

動作に必要なもの

Pulse は端末の状態を自分で測定しません。監視したい各端末に、この配布ページのエージェント pulse.py を入れて動かす必要があります。アプリはそのエージェントに HTTP で問い合わせて数値を表示します。

エージェントは 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 の配下にしてください。unit は ProtectSystem=strict で動いており、書き込めるのは StateDirectory が用意した場所だけです。配下の外へ置くなら、その場所に対応する StateDirectory を unit に追加します。

すでに Linux へ導入済みの場合は、pulse-agent.service を新しいものへ置き換えたうえで、次を実行してください。StateDirectory が無いと履歴を書き込めません。

sudo systemctl daemon-reload
sudo systemctl restart pulse-agent

つながらないとき

アプリに「接続できませんでした」「エージェントに接続できません」と表示される場合、次の順に確認します。

  1. アプリを動かしている iPhone / iPad / Mac 自身の Tailscale が接続されていること。登録するアドレスは tailnet 内でのみ届くため、アプリ側の端末が tailnet から切断されていると経路が無く、接続はタイムアウトします。Tailscale アプリを開いて接続状態を確認してください。
  2. 監視する端末の Tailscale が接続され、tailnet 上でオンラインであること。いずれかの端末で tailscale status を実行すると、各端末のオンライン状態と Tailscale IP を一覧できます。
  3. 監視する端末でエージェントが動いていること。その端末自身で curl http://127.0.0.1:9876/health が応答するか確認します。状態は macOS なら sudo launchctl print system/com.erimin.pulse-agent、Linux なら systemctl status pulse-agent で確認できます。
  4. エージェントが localhost だけで待ち受けていないこと。--bind 127.0.0.1 を付けて起動すると同じ端末からしか届きません。既定の 0.0.0.0 のまま起動してください。
  5. アプリに入力したアドレスが 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 は組み込んでいません。

端末内に保存される情報

これらはアプリを動かしている端末の中だけに保存されます。開発者はこれらを受け取りません。テレメトリの通信は、ユーザー自身の tailnet 内で、アプリとエージェントの間だけで完結します。

第三者に送信される情報

データの削除

アプリを削除すると、端末内に保存された登録情報とテレメトリ履歴は削除されます。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.