| name | forbotsake-content-plan |
| description | Turns your marketing strategy into an executable content calendar. Reads strategy.md,
asks about your capacity (hours/week), then produces content-calendar.md with weekly
themes, channel-specific content types, cadence, and format templates for 4 weeks.
Use when: "content calendar", "what should I post", "content plan", "how often should I post",
"weekly content", "marketing calendar", "what to write", "content cadence".
Proactively invoke when the user has a strategy.md and asks about what content to create
or how to organize their marketing output.
|
/forbotsake-content-plan
From strategy to a 4-week content calendar you can actually execute on.
Preamble
FORBOTSAKE_HOME="${FORBOTSAKE_HOME:-$HOME/.forbotsake}"
mkdir -p "$FORBOTSAKE_HOME"
_FBS_ROOT=""
for _FBS_CANDIDATE in "$HOME/.codex/skills/forbotsake" "$HOME/.agents/skills/forbotsake"; do
[ -d "$_FBS_CANDIDATE" ] && _FBS_ROOT="$_FBS_CANDIDATE" && break
done
if [ -z "$_FBS_ROOT" ]; then
echo "WARNING: forbotsake not found. Install: bash <(curl -fsSL https://raw.githubusercontent.com/forbotsake/forbotsake/main/bin/install.sh)"
fi
_UPD=""
[ -n "$_FBS_ROOT" ] && [ -x "$_FBS_ROOT/bin/forbotsake-update-check" ] && _UPD=$("$_FBS_ROOT/bin/forbotsake-update-check" 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
echo "BRANCH: $_BRANCH"
if [ -f strategy.md ]; then
echo "STRATEGY_EXISTS: yes"
head -20 strategy.md
elif [ -f forbotsake-strategy.md ]; then
echo "STRATEGY_EXISTS: yes"
echo "STRATEGY_FILE: forbotsake-strategy.md"
head -20 forbotsake-strategy.md
else
echo "STRATEGY_EXISTS: no"
fi
if [ -f content-calendar.md ]; then
echo "EXISTING_CALENDAR: yes"
head -5 content-calendar.md
else
echo "EXISTING_CALENDAR: no"
fi
_SESSION_FILE="$FORBOTSAKE_HOME/session-content-plan-$(basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)").json"
if [ -f "$_SESSION_FILE" ]; then
echo "RESUME_AVAILABLE: yes"
echo "SESSION_FILE: $_SESSION_FILE"
else
echo "RESUME_AVAILABLE: no"
fi
If output shows UPGRADE_AVAILABLE <old> <new>: read the forbotsake-upgrade SKILL.md
at $_FBS_ROOT/forbotsake-upgrade/SKILL.md (where _FBS_ROOT is the variable already
resolved in the preamble bash above) and follow the "Inline upgrade flow" section Step 1
only. If Step 1 results in "Yes" or "Always" (proceed with upgrade), continue through
Steps 2-7 of the inline flow. If Step 1 results in "Not now" or "Never" (declined),
skip Steps 2-7 entirely and continue with this skill immediately.
If output shows JUST_UPGRADED <old> <new>: tell user
"Running forbotsake v{new} (just updated from v{old})!" and continue.
If STRATEGY_EXISTS is no:
"No strategy.md found. You need a strategy before building a content calendar.
Run /forbotsake-marketing-start first to define your positioning, ICP, and channels."
Stop here. Do NOT proceed without a strategy.
If EXISTING_CALENDAR is yes, check frontmatter for generated_by: forbotsake.
- If forbotsake-generated: "Found existing content-calendar.md. Want to update it or start fresh?"
- If not forbotsake-generated: "Found content-calendar.md not generated by forbotsake. Replace it, or create alongside as forbotsake-content-calendar.md?"
Ask the user directly in conversation. Do NOT overwrite without asking.
If RESUME_AVAILABLE is yes: "Found a previous session in progress. Resume where you left off?"
Ask the user directly in conversation with options: A) Resume, B) Start fresh.
Phase 1: Absorb the Strategy
Read strategy.md (or forbotsake-strategy.md) completely. Extract and internalize:
- Positioning statement -- who is this for, what does it do, why is it different
- ICP -- the specific person, their pain, their current solution, where they hang out
- Channel strategy -- which channels scored highest, their rationale, planned content formats
- Messaging pillars -- the 3 core claims and proof points
- First 2-week experiment -- what was already planned
Present a summary back to the user:
"From your strategy, I see:
- ICP: {person description}
- Top channels: {channel 1} (score {X}), {channel 2} (score {Y})
- Messaging pillars: {pillar 1}, {pillar 2}, {pillar 3}
- Planned experiment: {first experiment description}
I'll build your calendar around these. First, I need to know your capacity."
Phase 2: Capacity Assessment
Ask via direct conversation with the user:
"How many hours per week can you realistically spend on marketing content?
Be honest -- overcommitting leads to burnout and abandoned calendars.
A) 1-2 hours/week (minimal: 1 channel, 2-3 pieces/week)
B) 3-5 hours/week (moderate: 1-2 channels, 4-6 pieces/week)
C) 6-10 hours/week (serious: 2-3 channels, 7-10 pieces/week)
D) 10+ hours/week (full commitment: 3+ channels, daily content)
E) Custom -- tell me your exact number"
Session save after answer:
echo '{"phase": "capacity", "answer": "USER_ANSWER"}' >> "$_SESSION_FILE"
Map capacity to a cadence tier:
| Tier | Hours | Channels | Pieces/week | Content types |
|---|
| Minimal | 1-2 | 1 | 2-3 | Short-form only (tweets, short posts) |
| Moderate | 3-5 | 1-2 | 4-6 | Short-form + 1 long-form |
| Serious | 6-10 | 2-3 | 7-10 | Short-form + long-form + email |
| Full | 10+ | 3+ | 10+ | All formats |
Follow-up question via direct conversation with the user:
"Any content types you absolutely want to include or exclude?
For example: 'I love writing threads but hate video' or 'I want to try a newsletter.'
If no preference, just say 'no preference' and I'll optimize for your channels."
Session save after answer:
echo '{"phase": "content_prefs", "answer": "USER_ANSWER"}' >> "$_SESSION_FILE"
Phase 3: Build the Calendar
Read knowledge frameworks first:
_SKILL_DIR=$(dirname "$(find $HOME/.codex/skills -path "*/forbotsake-content-plan/SKILL.md" -type f 2>/dev/null | head -1)")
echo "SKILL_DIR: $_SKILL_DIR"
Read $_SKILL_DIR/../knowledge/frameworks/channel-selection.md if it exists, for channel-specific content format guidance.
Build the calendar by:
-
Select channels from strategy.md, filtered by capacity tier. If capacity is minimal, use only the #1 channel. If moderate, top 2. And so on.
-
Assign weekly themes derived from the 3 messaging pillars. Rotate pillars across weeks:
- Week 1: Pillar 1 (the core value prop)
- Week 2: Pillar 2 (the differentiator)
- Week 3: Pillar 3 (the proof/credibility)
- Week 4: Community/engagement (respond, remix, amplify)
-
Map content types to channels using channel norms:
- X/Twitter: threads (3-7 tweets), single tweets, quote tweets, polls
- LinkedIn: story posts (1300 chars), carousel documents, articles
- Blog/SEO: how-to posts (1500-2500 words), comparison posts, tutorials
- Email/Newsletter: curated digests, behind-the-scenes, product updates
- Reddit: valuable comments, Show HN posts, community answers
- YouTube: tutorials (5-15 min), shorts (< 60s), walkthroughs
-
Set cadence per channel respecting capacity constraints. Always leave 20% buffer -- if someone says 5 hours, plan for 4 hours of content.
-
Flag high-value targets for /forbotsake-sharpen: While building the calendar, identify any content slots that involve a specific person or organization (e.g., "X thread mentioning @garrytan about gstack", "PR to gstack repo", "outreach to community leader"). For the top 1-2 highest-value targets, add a note in the calendar:
"🎯 High-value target — run /forbotsake-sharpen before creating this content.
Sharpen will research [target], map your connections, and produce a multi-touch
execution plan so this content is part of a coordinated approach, not a one-off."
A target qualifies for flagging only if (a) the content slot is specifically about engaging that person/org, not just mentioning them, and (b) the desired outcome requires a response from them (not just awareness). Don't flag every proper noun.
-
Create format templates for each content type in the calendar. These are structural templates, not content:
Example thread template:
Tweet 1: Hook -- surprising claim or question related to {pillar}
Tweet 2: Context -- why this matters to {ICP}
Tweet 3-5: The insight/walkthrough/proof
Tweet 6: CTA -- what to do next
Phase 4: Write content-calendar.md
Write content-calendar.md to the project root with this schema:
---
schema_version: 1
generated_by: forbotsake
generated_at: {ISO timestamp}
capacity_hours_per_week: {number}
capacity_tier: {minimal|moderate|serious|full}
channels: [{channel1}, {channel2}]
---
# Content Calendar: {product name}
Generated by /forbotsake-content-plan on {date}
Strategy source: strategy.md
Status: ACTIVE
## Capacity
- **Hours/week:** {capacity}
- **Tier:** {tier}
- **Active channels:** {channels}
- **Buffer:** 20% of capacity reserved for engagement and ad-hoc
## Content Types by Channel
### {Channel 1}
| Type | Format | Time to create | Cadence |
|------|--------|---------------|---------|
{content types for this channel}
### {Channel 2}
(repeat as needed)
## Week 1: {Theme from Pillar 1}
**Focus:** {messaging pillar 1 description}
| Day | Channel | Type | Topic idea | Visual | Est. time |
|-----|---------|------|-----------|--------|-----------|
{specific content slots for the week, with visual treatment recommendation}
**Visual column guidelines:**
- `none` for hot takes, HN posts, Reddit comments, quick replies
- `text-card` for stat highlights, quote cards, key takeaways
- `ai-image` for launch posts, storytelling, blog headers, Product Hunt
- `video` for product demos, launch teasers, explainer shorts
- Default by channel: X thread → `ai-image` (hero), LinkedIn → `ai-image`, Blog → `ai-image`, Email → `none`, HN/Reddit → `none`
**Week 1 total:** {estimated hours}
## Week 2: {Theme from Pillar 2}
{same structure}
## Week 3: {Theme from Pillar 3}
{same structure}
## Week 4: Community & Engagement
**Focus:** Respond, remix, and amplify. Engage with replies, share user stories, remix top-performing content from weeks 1-3.
{same structure, with engagement-focused content}
## Format Templates
### {Content Type 1}: {Channel}
{structural template with placeholders}
### {Content Type 2}: {Channel}
{structural template with placeholders}
(one template per content type used in the calendar)
## Metrics to Track
| Channel | Metric | Tool | Check frequency |
|---------|--------|------|----------------|
{metrics per channel -- engagement rate, clicks, replies, signups, etc.}
## Monthly Review Prompts
After 4 weeks, answer these:
1. Which content type got the most engagement?
2. Which channel drove actual signups/conversions (not just views)?
3. What took longer than expected to create?
4. What should you double down on? What should you drop?
Phase 5: Self-Test
After writing content-calendar.md, read it back and check:
- Does total estimated time per week stay within the capacity budget (with 20% buffer)?
- Is every content slot specific enough to start writing? ("Thread about API design" not "thread about product")
- Are the format templates actionable? Could someone follow them without further instruction?
- Does the cadence match channel norms? (e.g., not 1 tweet/week -- that's too infrequent for X)
If any check fails, fix it and tell the user what you adjusted.
Phase 6: Next Steps
Tell the user:
"Your content-calendar.md is ready. 4 weeks of content planned for {channels}.
What's in it:
- {N} content pieces per week across {M} channel(s)
- Weekly themes rotating through your messaging pillars
- Format templates for each content type
- Estimated {X} hours/week (within your {Y} hour budget)
Next step: /forbotsake-create to write your first piece of content.
Start with Week 1, Day 1 -- the calendar tells you exactly what to make.
Or if you want to challenge this plan first, run /forbotsake-cmo-check
to stress-test your channel choices and cadence."
Cleanup
Remove the session file on successful completion:
rm -f "$_SESSION_FILE" 2>/dev/null