Antigravityのスキルで日々のブログ自動生成パイプラインを仕上げました
ObsidianとAntigravityを繋ぐ執筆パイプラインに、チャットから一言で下書きやアイキャッチ画像を自動生成できるスキル「journal-generator」を整備しました。日常のブログ執筆がグッと身近になりそうです。
先日、スマホの Obsidian から journal-base/notes/ へ手軽に殴り書きメモを残せる仕組みを構築したばかりですが、今回はそのメモをAIがスムーズに記事へと仕立て上げてくれる連携部分をさらにブラッシュアップしてみました。

1. 「今日のブログを書いて」の一言で動くスキル設計
今回のアップデートで一番こだわったのは、Antigravity のスキル機能(journal-generator)を使って「呼び出しの摩擦」を極限まで減らしたことです。
これまでは「このノートを読んで、ルールに従ってMarkdownを整形して、画像も作って…」と毎回細かくプロンプトで指示を出す必要がありました。ですが今回の整備によって、チャットで「今日のブログを書いて」と一言つぶやくだけで、当日のメモを探して下書きを起こし、アイキャッチまで一気に揃えてくれるようになりました。
「昨日のメモから書いて」と日付を遡ったり、「本番用に生成して」と伝えれば公開ディレクトリへの配置とキャッシュ更新まで一気に済ませてくれるなど、普段の気軽な会話の延長で指示を出せるのがとても快適です。「どんなプロンプトを投げればいいか」に頭を悩ませずに済むのは、日々の習慣にしていく上で本当に大きな違いですね。
2. インプットの二層構造:Obsidianのメモ + n8nの自動ログ
AIが記事を組み立てる元データ(journal-base/notes/YYYY-MM-DD.md)には、実は2つのインプットが合流しています。
ひとつは、日中にスマホから気兼ねなく残した「今日は〇〇をやって面白かった」「△△のエラーで少しハマった」といった、人間側の生のつぶやきや感想です。
そしてもうひとつが、ワークフロー自動化ツール「n8n」が裏側で集めてくれる客観的なログです。GitHubへのコミット履歴や作業記録、各種ツールの更新ログなどを、Webhook経由でノートの末尾に淡々と追記してくれています。
「その日実際に何が起きたか」というファクトは n8n に任せ、そこに「自分がどう感じたか」という体温を Obsidian から重ね合わせる。この2つがひとつのノートに揃っているからこそ、AIが書く文章も単なる一般的な解説に逃げず、「具体的に今日どんな作業をして、何を感じたのか」という手触り感を持った読み物として立ち上がってきます。
3. 記事の構造化とアイキャッチの完全自動連携
裏側で動く処理でも、ブログ本来の執筆ルールを崩さないようしっかり連携を組み込みました。
例えば記事の冒頭段落は、ブログシステムの仕様に合わせて100〜130文字前後に収まるよう調整され、そのままサイトのSEOメタディスクリプションとして機能します。
さらに、記事のテーマを汲み取った16:9のアニメ調アイキャッチイラストを自動生成し、そのままPHPスクリプトを呼び出して即座に軽量なWebP画像へと変換・配置してくれます。文章の骨組み作りだけでなく、画像周りの最適化までワンストップで終わるのは、想像以上にありがたいところです。
4. 下書きプレビューで安心の二重チェック
生成された記事は、いきなり本番に公開されるのではなく、まずは下書きフォルダー(journal-base/drafts/)に隔離されます。
管理者としてログインした状態でブラウザからプレビュー画面にアクセスすると、記事の最上部に以下のような専用ダッシュボードが表示される仕組みになっています。
📝 下書きプレビュー(推敲中) [管理者限定]
ファイル: journal-base/drafts/2026-11-05.md
[💜 Obsidianで開く] [🚀 本番公開する]
-----------------------------------------------------------
📊 文字数: 1,535 字 ⏱️ 読了目安: 約 4 分
🖼️ アイキャッチ: ✅ 設定済み
🔍 導入文SEO: ✅ 最適 (114字 / 目安100〜130字)
-----------------------------------------------------------
📱 SNSシェア・OGPカード表示プレビューここで特に助かっているのが、「アイキャッチ画像が設定されているか」や「導入文がSEOメタディスクリプションの適正文字数に収まっているか」をPHP側で自動判定してバッジ表示してくれる点です。
// 導入文(第1段落)のSEO文字数判定ロジック
$descLen = mb_strlen($firstPara, 'UTF-8');
if ($descLen >= 90 && $descLen <= 140) {
$descBadgeHtml = "<span style=\"color:#10b981;font-weight:bold;\">✅ 最適 ({$descLen}字)</span>";
} elseif ($descLen > 140) {
$descBadgeHtml = "<span style=\"color:#f59e0b;font-weight:bold;\">⚠️ 長め ({$descLen}字 / 目安100〜130字)</span>";
} elseif ($descLen > 0) {
$descBadgeHtml = "<span style=\"color:#f59e0b;font-weight:bold;\">⚠️ 短め ({$descLen}字 / 目安100〜130字)</span>";
} else {
$descBadgeHtml = '<span style="color:#ef4444;font-weight:bold;">⚠️ 未設定</span>';
}「AIが指示通りに書けているか」をこのステータスパネルで一瞬で把握でき、微修正が必要なら「💜 Obsidianで開く」から手元でサッと推敲して、納得がいったら「🚀 本番公開する」ボタンを押すだけ。
機械的な完全自動公開にせず、この「ひと呼吸置けるプレビュー環境」があるからこそ、安心してAIに初稿を任せられます。
5. これからの運用と日課の楽しみに
日中はスマホで気楽にメモを残し、裏側では n8n が日々の活動ログを支え、夜に一言つぶやいてドラフトを作ってもらい、最後に自分の手でひと手間かけて公開する。
そんな理想の執筆サイクルが、これで綺麗に一本の線として繋がりました。これから毎日どんな記事が生まれていくのか、私自身もとても楽しみにしています。