콘텐츠
청중이 실제로 묻는 질문으로 한 달 콘텐츠 채우기
Chat으로 주제를 정리하고, 청중이 X에서 묻는 질문을 찾고, 참고 영상 자막에서 실제 각도를 뽑아 모든 행에 증거를 적은 4주 콘텐츠 캘린더를 만듭니다.
프롬프트 복사
대괄호 항목을 바꾼 뒤 Claude Code, Codex 또는 터미널에 접근할 수 있는 AI에 붙여넣으세요. Felo 스킬을 설치하고 크레딧을 쓰기 전에 확인한 뒤 워크플로를 실행합니다.
[주제]에 대해 [독자]를 위한 4주 콘텐츠를 계획해 주세요. 채널: [채널]. 허용 형식: [형식 목록]. 게시 요일: [요일]. 언어: [언어]. 참고 영상(선택): [YouTube URL 또는 영상 ID]. 독자 질문 기간: 최근 [90]일. Markdown 캘린더 표를 아이디어 하나당 한 행으로 작성해 주세요. | 날짜 | 형식 | 작업 제목 | 관점 | 근거 | - 날짜: 허용된 게시 요일을 사용해 앞으로 4주. - 형식: 허용된 형식 중 하나. - 작업 제목: 이 콘텐츠의 제목. - 관점: 독자에게 하는 약속을 한 문장으로. - 근거: 아이디어를 정당화하는 질문, 게시물, 페이지, 영상 타임스탬프. 표 뒤에 다음을 추가해 주세요. 1. 이번 달을 떠받치는 세 가지 테마. 2. 어떤 아이디어가 독자 질문에서 왔고, 어떤 것이 참고 영상에서 왔고, 어떤 것이 당신의 가설인지. 3. 각 글을 쓰기 전에 추가로 조사해야 할 것. 4. 링크와 날짜가 있는 출처 목록. 규칙: - 이것들은 아이디어이지 보장이 아닙니다. 도달, 클릭, 순위, 성장을 약속하지 마세요. - 트렌드, 검색량, 참여 수치, 인용을 지어내지 마세요. - 모든 독자 질문을 날짜가 있는 게시물이나 페이지에 연결하세요. 근거가 약하면 아이디어를 가설로 표시하세요. - 참고 영상은 실제로 다루는 관점에만 사용하고, 짧게 인용하며 타임스탬프를 붙이세요. - 크레딧을 쓰기 전에 실행할 검색과 추출을 보여 주고 제 승인을 기다려 주세요. - 게시물 예약, CMS 초안 생성, 게시를 하지 마세요. - 결과를 ./content-calendar.md에 쓰고 채팅에서 요약해 주세요.
복사 내용에는 설치 단계와 안전 규칙도 포함됩니다.
완성되는 것
실행 시 예제 출력입니다. 실시간 생성이 아닙니다.
콘텐츠 캘린더 — 예시 월
테마
- 청소 시간이 숨은 비용.
- 카운터 공간이 구매를 결정.
- 자가 구매 vs 선물 구매.
캘린더
| 날짜 | 형식 | 작업 제목 | 각도 | 근거 |
|---|---|---|---|---|
| 2026-11-02 | 캐러셀 | 5분 청소 테스트 | 아무도 찍지 않는 청소 단계를 보여줌 | @example_home, 2026-10-24 |
| 2026-11-04 | 숏폼 | 카운터 공간 측정 | 실제 카운터에서 차지하는 면적 비교 | 참고 영상 — 42초 |
| 2026-11-09 | 뉴스레터 | 씰이 왜 망가지나 | 구매자가 계속 보고하는 고장 모드를 설명 | @example_buyer, 2026-10-19 |
아이디어 출처
두 행은 날짜 있는 오디언스 질문에서, 한 행은 참고 영상에서 왔다. 가설 행이면 그렇게 라벨링한다.
먼저 조사할 것
반품률과 씰 교체 정책 — 위 출처 모두 다루지 않는다.
출처
- 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 질문만으로도 캘린더를 지탱할 수 있습니다.
자동 예약 발행할 수 있나요?
아니요. 계획 파일만 만들며 예약 발행은 자체 도구로 합니다.
한 번 계획 비용은?
Chat, X 검색, 영상 자막은 사용량 기반 크레딧입니다. 현재 요금은 가격 페이지에 있고 프롬프트는 쓰기 전에 승인을 요청합니다.
관련 워크플로
검색 질의 하나를 SEO 콘텐츠 브리프로 바꾸기
현재 그 질의에 답하는 페이지를 확인하고, Markdown으로 읽고, 답하는 질문과 놓친 질문을 정리한 뒤 작가가 바로 개요를 잡을 수 있는 브리프를 씁니다.
워크플로 열기콘텐츠팀이 실제로 읽는 일일 AI 뉴스 다이제스트 만들기
출처 있는 뉴스 요약을 가져오고 X의 실무자 논의를 더하고 영상 자막 하나를 가져온 뒤 Markdown으로 호를 구성해 LiveDoc에 보관합니다.
워크플로 열기콘텐츠소셜 대화를 주간 리스닝 브리프로 바꾸기
지난주 브랜드와 경쟁사 관련 X 게시물을 검색하고 출처 있는 웹 맥락을 더하고 배경 페이지를 읽은 뒤 매호를 아카이브해 다음 주는 아는 것에서 시작합니다.
워크플로 열기내 방식으로 바꾸기
같은 레시피를 실제 배포 방식에 맞게 조정합니다.
2주만 계획하기
4주를 2주로 압축해 발행을 막 시작한 팀에 맞춥니다.
채널별로 나누기
뉴스레터, X, YouTube를 열로 나눠 같은 주제를 다른 형식으로 만듭니다.
제품 출시일 넣기
출시일과 이벤트 날짜를 고정 행으로 두고 주변 콘텐츠를 채웁니다.
더 알아보기
이 레시피의 배경이 되는 참고 페이지와 다음에 볼 곳.