自分のMacBookは、毎晩2時50分に勝手に起動するようになっている。蓋を閉じたままで。
macOSのpmsetというコマンドで、指定した時刻にMacを自動起動する設定ができる。これとlaunchdを組み合わせて、深夜にClaude Codeを無人で動かしている。
MacBookの蓋を閉じていても動く
cronやショートカットの定期実行だと、MacBookの蓋を閉じているとスリープ中なので動かない。launchdも同じで、スケジュールの時刻にMacが寝ていればスキップされる。
なのでまずMacを起こす必要がある。pmset repeat wakeorpoweron で、毎日2:50にハードウェアレベルで起動がかかるようにしている。蓋が閉じていても、電源に繋がっていれば起きてくれる。
ただ、起きてもすぐまた寝てしまうので、caffeinate -s をlaunchdで常駐させて再スリープを防いでいる。これで深夜の作業時間が確保できる。
3時に何をさせているか
起動から10分後の3:00と3:10に、ふたつのジョブが走る。
ひとつは市場のリサーチ。平日の3:00に、業界動向やマーケットの情報を集めて、レポートにまとめてSlackに投稿する。朝起きたらもう読める状態になっている。
もうひとつは前日の振り返り。毎日3:10に、昨日の活動ログをいろんなソースから集めて、一日の流れを時系列でまとめたレポートを作る。カレンダー、Slack、GitHub、セッションログなどを横断して、何をやったか、それぞれがどう繋がっていたかをまとめてくれる。
どちらもClaude Codeをヘッドレスで呼び出している。launchdの環境はPATHが最小限なので、シェルスクリプト側でclaude CLIへのパスを通しておく必要があった。
仕組み
全体の流れとしては、pmsetでMacを起こす → caffeinateで寝かさない → launchdがジョブを発火 → シェルスクリプトがClaude Codeを呼ぶ、という感じになっている。
launchdのplistにはMisfireGracePeriodという設定がある。予定時刻にMacがスリープしていた場合でも、起動後にこの猶予時間内であればジョブを実行してくれる。pmsetの起動が遅れたときの保険として入れている。
やってみて
自分が寝ている間にMacが起きて、Claudeが動いて、レポートができて、Slackに届く。朝起きてSlackを開くと、昨日の振り返りと今日の市場動向がもう並んでいる。
これが毎日自動で回っていると、じわじわ効いてくる。昨日何やったっけと思い出す時間がなくなるし、市場の変化も見落としにくくなった。設定自体はpmset一行とplistをいくつか書くだけなので、そんなに大変でもない。
地味な仕組みだけど、AIの自動化で一番おいしいのはこういうところだと思う。

