前回の記事で、記事公開と同時にX投稿文が3案生成される仕組みができた。
今回はその先——「いつ投稿するか」まで自動化した話。
課題:書いた勢いで投稿してしまう
記事を書いてすぐXに投稿すると、深夜になることが多い。深夜のポストはインプレッションが伸びにくい。
かといって「あとで投稿しよう」と思うと、そのまま忘れる。
分散投稿もしたい。記事1本から複数の切り口でツイートを作って、数日かけて出していく方が記事の寿命が伸びる。でも手動でやるのは面倒で続かない。
まず投稿案を複数作った
今回の記事に合わせて、5つの切り口で投稿案を作った。
- ワークフロー紹介(publishコマンド1つで何ができるか)
- コスト比較(AI画像生成モデルの価格差)
- 哲学的気づき(自動化とブランドらしさ)
- 自動化ストーリー(全体の流れ)
- 次のステップ(課題と展望)
同じ記事でも切り口が変わると、刺さる人が変わる。テック寄りの人にはコスト比較が響くし、個人開発の雰囲気が好きな人には哲学系が刺さる。
Claude Codeのスケジューラーで設定した
投稿案が決まったら、Claude Codeのcronスケジューラーで日時を設定した。
3/24 8:03 → publishワークフロー紹介
3/24 20:07 → AI画像コスト比較
3/25 12:13 → 自動化とブランドの哲学
3/26 8:17 → 自動化ストーリー
ただ、ここで問題があった。
セッション依存という罠
Claude Codeのcronはセッション限定。つまり、Claude Codeを閉じると消える。
3日間ウィンドウを開けっ放しにするのは現実的ではない。
解決策として、システムのcrontabを使うことにした。macOSに標準で入っているジョブスケジューラーで、PCが起動している限り動き続ける。
仕組みはシンプルで:
scheduled-posts.jsonに投稿予定リストを保存run-scheduled-posts.jsが時間をチェックして投稿- crontabが5分ごとにスクリプトを呼び出す
{
"id": "2026-03-24-D",
"scheduledAt": "2026-03-24T08:03:00",
"text": "publishコマンド1つでここまで自動化できた...",
"posted": false
}
投稿が完了すると posted: true に更新されるので、同じ投稿が二度出ることもない。
実際の動き
crontabに登録したコマンドはこれだけ。
*/5 * * * * cd /Users/harukichi/SlothfulDevLog && node scripts/run-scheduled-posts.js >> /tmp/scheduled-posts.log 2>&1
5分ごとに scheduled-posts.json を読んで、時間が来ていて未投稿のものをX APIで投稿する。ログは /tmp/scheduled-posts.log に残るので、投稿されたかどうかも確認できる。
今の自動化の全体像
ここまでで、ブログ運用の自動化がかなり進んだ。
Obsidianのメモ
↓ /from-obsidian
記事に整形 → サムネイル生成 → git push(Vercelで自動デプロイ)
↓
X投稿文を5案生成
↓
scheduled-posts.json に保存
↓ crontab(5分ごと)
指定の日時にX投稿
手でやっていた作業が、ほぼなくなった。
残っている課題
Mac がスリープ中は動かない。外出中やPCを閉じているときは投稿されない。これを解決するには GitHub Actions やVPSなどサーバー側に移す必要がある。
ただ、自宅でMacを常時起動している環境なら今の仕組みで十分。まずはこれで運用してみる。
完璧より完了、の精神で。