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.
- Activity
- New: be the first to try it
- Installs
- 0 installs
- Likes
- 0 likes
- Clones
- 0 clones
How this works
- 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.
- While it works, it reads and changes files in the places it lists, nowhere else.
- It runs these commands on your computer: node scripts/calendar.mjs.
- 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-formand slot the results in here.
Inputs
Ask in one message, with these defaults:
- Start date (next Monday) and weeks (4).
- 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.
- 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.
- Audience in one line, and what is coming up: launches, events, holidays, dates to skip.
- Raw material: existing posts, docs, customer quotes, or notes in
content/. Read them; good topics come from here. - Voice: follow
brand.mdif it exists.
Steps
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-26It writes
content-calendar.csv,.md, and.jsonincontent/calendar/. It will not overwrite an existing calendar; pass--name decemberfor a new one, or--forceonly if the user says to replace it.- 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.
Fill every slot in the CSV:
topic(specific, one sentence) andhook(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".
- Reuse on purpose. A blog article on Tuesday can feed Wednesday's LinkedIn post and Thursday's newsletter. Note the source in
link. - 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.
- Update the
.mdto 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-26and fills in the topics:
| Date | Channel | Pillar | Topic | Hook |
|---|---|---|---|---|
| Mon Nov 9 | Product tips | The 2-line reminder text that halves no-shows | "Most reminder texts are too long." | |
| Tue Nov 10 | blog | Behind the scenes | Why we rebuilt reminders from scratch | "We got 400 replies we could not read." |
| Fri Nov 13 | Customer stories | Teaser: 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/andbrand.mdfor 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.
