Skip to content
SlashClone

Content calendar

@contentstudio/content-calendar

Plan a few weeks of content across LinkedIn, a newsletter, a blog, and more. A script lays out dated slots per channel with your content pillars rotated evenly, then Claude fills in specific topics and hooks you can actually write. Exports a CSV for your sheet or planner.

SkillContentv1.0.0 (latest)Tested
Activity
New: be the first to try it

How this works

  1. It is a skill: written instructions Claude reads when your request matches what the skill is for. You do not call it by name; just ask for the task.
  2. While it works, it reads and changes files in the places it lists, nowhere else.
  3. It runs these commands on your computer: node scripts/calendar.mjs.
  4. Nothing runs until you choose to use it, and you can remove it any time.

SKILL.md

Content calendar

Most content calendars fail in one of two ways: a grid of empty boxes, or a list of vague themes ("thought leadership"). This one gets the structure right with a script (dates, channels, an even pillar mix) and then fills every slot with a topic specific enough to start writing today.

When to use

  • Planning the next 2 to 8 weeks of posts, newsletters, or articles.
  • "What should we post this month?", "build our content calendar", "plan LinkedIn for Q1".
  • To turn one big piece into many, use repurpose-long-form and slot the results in here.

Inputs

Ask in one message, with these defaults:

  1. Start date (next Monday) and weeks (4).
  2. Channels and days. Default: LinkedIn Mon, Wed, Fri; newsletter Thu; blog Tue. Fewer channels done well beats many done badly. Suggest cutting if the team is one person and they ask for more than 4 pieces a week.
  3. Pillars: 3 to 4 recurring themes (default: Product tips, Customer stories, Behind the scenes). Good pillars map to what the audience wants, not to departments.
  4. Audience in one line, and what is coming up: launches, events, holidays, dates to skip.
  5. Raw material: existing posts, docs, customer quotes, or notes in content/. Read them; good topics come from here.
  6. Voice: follow brand.md if it exists.

Steps

  1. Lay out the slots.

    node scripts/calendar.mjs content/calendar --start 2026-11-09 --weeks 4 --cadence "linkedin:mon,wed,fri newsletter:thu blog:tue" --pillars "Product tips,Customer stories,Behind the scenes" --skip 2026-11-26

    It writes content-calendar.csv, .md, and .json in content/calendar/. It will not overwrite an existing calendar; pass --name december for a new one, or --force only if the user says to replace it.

  2. Place the fixed moments first: launches, events, and holidays go in the slots nearest their dates. Put a teaser 3 to 5 days before a launch and a recap after.
  3. Fill every slot in the CSV: topic (specific, one sentence) and hook (the first line a reader sees). Match the pillar and the channel format:

    • LinkedIn post: one idea, a story or a lesson, 150 to 250 words.
    • Newsletter issue: one main piece plus two short links.
    • Blog article: a question people search for, 800 to 1,500 words.
    • Thread or carousel: a list of 5 to 8 steps or examples. Specific beats general: "How one clinic cut no-shows from 18% to 7% with a two-line text" beats "Customer success story".
  4. Reuse on purpose. A blog article on Tuesday can feed Wednesday's LinkedIn post and Thursday's newsletter. Note the source in link.
  5. Check the mix: no pillar twice in a row on the same channel, no more than one promotional piece in five, at least one piece a week that asks the audience a question.
  6. Update the .md to match the filled CSV and show the first two weeks in chat. Ask what to swap.

See examples/content-calendar-filled.csv for what a finished week looks like.

Output format

# Content calendar: 2026-11-09 to 2026-12-04

20 pieces over 4 weeks. linkedin 12, blog 4, newsletter 4.

## Week 1 (from 2026-11-09)
| Date | Channel | Format | Pillar | Topic | Hook |
| --- | --- | --- | --- | --- | --- |
| Mon 2026-11-09 | linkedin | post | Product tips | The 2-line reminder text that halves no-shows | "Most reminder texts are too long. Ours is 2 lines." |

Guardrails

  • Never schedule or publish anything. This plans; people post.
  • Do not invent customer names, results, or quotes for topics. Use <customer story: need one> and list what material is missing.
  • Keep the calendar realistic for the team size the user gave. Say so if the plan is more than they can produce.
  • Do not overwrite a calendar that has topics filled in.

README.md

Content calendar

Plan a month of content in ten minutes. A script lays out every slot by date and channel with your themes rotated evenly, then Claude fills each one with a specific topic and an opening line you can start writing from.

Who it is for: founders, solo marketers, and small teams who post on LinkedIn, send a newsletter, and keep a blog, and are tired of staring at a blank grid.

Example

You say: "Plan the next 4 weeks. LinkedIn 3 times a week, newsletter Thursdays, blog Tuesdays. We launch two-way reminders on Nov 18. Skip Thanksgiving."

Claude runs:

node scripts/calendar.mjs content/calendar --start 2026-11-09 --weeks 4 --skip 2026-11-26

and fills in the topics:

DateChannelPillarTopicHook
Mon Nov 9linkedinProduct tipsThe 2-line reminder text that halves no-shows"Most reminder texts are too long."
Tue Nov 10blogBehind the scenesWhy we rebuilt reminders from scratch"We got 400 replies we could not read."
Fri Nov 13linkedinCustomer storiesTeaser: what changes on Nov 18"Next week, patients can text back."

You get content/calendar/content-calendar.csv (open it in any spreadsheet) plus a readable .md version. examples/content-calendar-filled.csv shows a finished week.

What it can access

  • Reads your notes and drafts in content/ and brand.md for voice.
  • Writes only inside content/calendar/.
  • Runs one script, scripts/calendar.mjs (Node, no dependencies). No network.

Setup

None. Needs Node 18 or newer.

Files

  • README.md
  • SKILL.md
  • examples/content-calendar-filled.csv
  • kit.json
  • scripts/calendar.mjs

Did it work?

0worked for them0did not work

Sign in to say whether it worked for you.

Nobody has said yet. Tried it? Tell the next person.