コンテンツ
読者が実際に聞いている質問で1か月分のコンテンツを埋める
Chat でテーマを整理し、読者が X で聞いている質問を見つけ、参考動画の文字起こしからリアルな切り口を取り、すべての行に根拠を書いた4週間のコンテンツカレンダーを作ります。
プロンプトをコピー
角括弧の項目を置き換えて、Claude Code、Codex、ターミナルにアクセスできる AI に貼り付けてください。Felo スキルをインストールし、クレジットを使う前に確認し、ワークフローを実行します。
[トピック] について、[読者] 向けの4週間分のコンテンツを計画してください。 チャネル: [チャネル]。許可する形式: [形式一覧]。投稿曜日: [曜日]。言語: [言語]。 参考動画(任意): [YouTube URL または動画 ID]。読者の質問の期間: 過去 [90] 日。 Markdown のカレンダー表を、アイデア1件につき1行で作成してください。 | 日付 | 形式 | 作業タイトル | 切り口 | 根拠 | - 日付: 許可された投稿曜日を使い、次の4週間で。 - 形式: 許可された形式のいずれか。 - 作業タイトル: 記事の仮タイトル。 - 切り口: 読者への約束を1文で。 - 根拠: そのアイデアを正当化する質問、投稿、ページ、動画のタイムスタンプ。 表の後に以下を追加してください。 1. その月を支える3つのテーマ。 2. どのアイデアが読者の質問から来たか、どれが参考動画からか、どれがあなた自身の仮説か。 3. 各記事を書く前に追加調査が必要なこと。 4. リンクと日付付きの出典一覧。 ルール: - これらはアイデアであり、保証ではありません。リーチ、クリック、順位、成長を約束しないでください。 - トレンド、検索ボリューム、エンゲージメント数、引用を捏造しないでください。 - 読者の質問はすべて日付付きの投稿またはページに紐づけてください。根拠が薄い場合は、そのアイデアを仮説としてラベル付けしてください。 - 参考動画は実際に扱っている切り口にだけ使い、短く引用してタイムスタンプを付けてください。 - クレジットを消費する前に、実行予定の検索と抽出を示して私の承認を待ってください。 - 投稿の予約、CMS での下書き作成、公開はしないでください。 - 結果を ./content-calendar.md に書き、チャットで要約してください。
コピー内容にはインストール手順と安全ルールも含まれます。
完成するもの
実行時の出力例です。リアルタイム生成ではありません。
コンテンツカレンダー — 例の月
テーマ
- 掃除の時間は隠れたコスト。
- カウンタースペースが購入を決める。
- 自分用と贈り物用の購入。
カレンダー
| 日付 | 形式 | 作業タイトル | 切り口 | 根拠 |
|---|---|---|---|---|
| 2026-11-02 | カルーセル | 5分掃除テスト | 誰も撮らない掃除の工程を見せる | @example_home, 2026-10-24 |
| 2026-11-04 | ショート動画 | カウンタースペースを測る | 実在のカウンターで設置面積を比較 | 参考動画 — 42秒 |
| 2026-11-09 | ニュースレター | なぜシールが壊れるか | 買い手が報告し続ける故障モードを説明 | @example_buyer, 2026-10-19 |
アイデアの出どころ
2行は日付付きの読者質問から、1行は参考動画から。仮説の行ならそのようにラベルを付ける。
最初に調べること
返品率とシール交換ポリシー — どちらも上の出典では扱っていない。
出典
- https://example.com/category-guide — 2026-10-12
- https://x.com/example_home/status/... — 2026-10-24
実際の呼び出し
開発者向け:同じワークフローを実行順に並べたコピー可能なコード。
実際の API 呼び出しを表示
Chat でテーマを整理する
このテーマで読者がよく気にするサブトピックを Chat に聞き、出典を残します。
calendar.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const topic = "portable espresso makers"; const audience = "home espresso beginners"; const themes = await felo<ChatData>("/v2/chat", { query: `Themes, recurring questions, and content gaps around ${topic} for ${audience}`, }); const sources = themes.data.resources.slice(0, 5);出力例
{ "answer": "Beginners ask about cleanup, counter space, and grind size …", "sources": [ { "link": "https://example.com/guide", "title": "…", "snippet": "…" } ] }X で読者の質問を探す
テーマに関する質問を X で検索し、直近90日に限定し、アカウントと日付を残します。
calendar.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; url: string; }[]; }; }; const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000); const questions = await felo<XData>("/v2/x/tweet/search", { query: `"${topic}" (recommend OR beginner OR how)`, limit: 50, since_time: since, }); const asked = questions.data.tweets;出力例
{ "data": { "tweets": [ { "content": "How do you clean one of these without taking it apart?", "author": { "username": "example_home" }, "created_at": "2026-10-24T11:30:00Z", "url": "https://x.com/example_home/status/..." } ] } }参考動画の文字起こしを取る
YouTube Subtitling で関連動画の文字起こしを取得し、再利用できるリアルな切り口を探します。
calendar.ts type SubtitleData = { data: { title: string; contents: { text: string; start: number; duration: number }[]; }; }; const videoCode = "dQw4w9WgXcQ"; // replace with your reference video id const video = await felo<SubtitleData>( `/v2/youtube/subtitling?video_code=${videoCode}&language=en&with_time=true`, );出力例
{ "title": "Example Video Title", "contents": [ { "text": "Subtitle text", "start": 42.3, "duration": 8.1 } ] }4週間のカレンダーを組む
日付、形式、作業タイトル、切り口、根拠を Markdown 表にします。
calendar.ts const start = new Date(); const day = (offset: number) => { const date = new Date(start); date.setDate(date.getDate() + offset); return date.toISOString().slice(0, 10); }; type Idea = { dayOffset: number; format: string; title: string; angle: string; evidence: string; }; // Rows come from the themes, the dated questions, and the transcript. const anchor = video.data.contents[0]; const ideas: Idea[] = [ { dayOffset: 1, format: "carousel", title: "The 5-minute cleanup test", angle: "Show the cleanup step nobody films", evidence: asked[0]?.url ?? "hypothesis", }, { dayOffset: 3, format: "short video", title: "Counter space, measured", angle: "Compare footprints on one real counter", evidence: anchor ? `${video.data.title} — ${Math.round(anchor.start)}s` : video.data.title, }, ]; const calendar = [ "| Date | Format | Working title | Angle | Evidence |", "| --- | --- | --- | --- | --- |", ...ideas.map( (idea) => `| ${day(idea.dayOffset)} | ${idea.format} | ${idea.title} | ${idea.angle} | ${idea.evidence} |`, ), ].join("\n"); console.log(calendar);出力例
| Date | Format | Working title | Angle | Evidence | | --- | --- | --- | --- | --- | | 2026-11-02 | carousel | The 5-minute cleanup test | Show the cleanup step nobody films | https://x.com/example_home/status/... | | 2026-11-04 | short video | Counter space, measured | Compare footprints on one real counter | Example Video Title — 42s |
LiveDoc に保存する
カレンダーと出典を LiveDoc に保存し、月末の振り返りで検索できるようにします。
calendar.ts type LiveDocData = { data: { short_id: string } }; const plan = await felo<LiveDocData>("/v2/livedocs", { name: `Content calendar: ${topic}`, description: "Monthly plan with themes, calendar rows, and evidence", }); await felo(`/v2/livedocs/${plan.data.short_id}/resources/urls`, { urls: sources.map((source) => ({ url: source.link, title: source.title })), }); await felo(`/v2/livedocs/${plan.data.short_id}/resources/doc`, { title: `Content calendar — ${day(0).slice(0, 7)}`, content: calendar, }); type Retrieved = { data: { title: string; content: string; score: number }[] }; const lastMonth = await felo<Retrieved>( `/v2/livedocs/${plan.data.short_id}/resources/retrieve`, { query: "what did we plan last month" }, ).then((res) => res.data.filter((hit) => hit.score >= 0.7));出力例
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
含まれるもの
- Chat のテーママップ
- 日付付きの X 読者質問
- 参考動画の文字起こしと切り口
- 4週間分のコンテンツカレンダー
- 計画と出典を保存する LiveDoc
やらないこと
- 成果やトラフィックは保証しない
- 過去の analytics は読まない
- 投稿文の自動執筆や公開はしない
- 参考動画がない場合はそのステップを省略できる
- カレンダーは提案であり約束ではない
よくある質問
カレンダーのアイデアはどこから?
Chat のテーママップ、X の読者の実際の質問、参考動画の切り口から来ます。各項目は根拠リンクか日付を保持します。
過去に何が伸びたか分かりますか?
分かりません。analytics は読まないため、過去実績は自分で補ってください。
投稿文も書きますか?
いいえ。カレンダーと切り口を出力し、執筆はあなたか執筆 agent が行います。
参考動画がない場合は?
そのステップを省略してください。テーマと X の質問だけでカレンダーを支えられます。
自動で予約投稿できますか?
いいえ。計画ファイルを生成するだけで、投稿予約は自分のツールで行います。
1回の計画費用は?
Chat、X 検索、動画の文字起こしは従量制クレジットです。現在の料金は料金ページにあり、プロンプトは使う前に確認を求めます。
関連ワークフロー
1つの検索クエリをSEOコンテンツブリーフに変える
いまそのクエリに答えているページを確認し、Markdown で読み、答えている問いと抜けている問いを整理し、ライターがそのまま構成に使えるブリーフを書きます。
ワークフローを開くコンテンツチームが本当に読む日次AIニュースダイジェストを作る
出典付きのニュースまとめを取り、X の実務者の議論を加え、動画の文字起こしを1本取得し、Markdown で号を構成して LiveDoc に保存します。
ワークフローを開くコンテンツSNSの会話を週次のリスニングブリーフに変える
直近1週間の自社ブランドと競合に関する X 投稿を検索し、出典付きの Web 文脈を加え、その背景ページを読み、毎号をアーカイブして翌週は既知の内容から始めます。
ワークフローを開く自分の形に変える
同じレシピを、実際の進め方に合わせて調整します。
2週間だけ組む
4週間を2週間に圧縮し、発信を始めたばかりのチーム向けにします。
チャネル別に分ける
ニュースレター、X、YouTube を列に分け、同じテーマを異なる形式にします。
製品リリースを入れる
リリース日とイベント日を固定行にし、その周りにコンテンツを埋めます。
さらに進む
このレシピの背景にあるリファレンスと、次に見るべきページ。