SFOS Content Workflows
Defines three content pipelines (blog, social, newsletter) with persona handoffs, vault paths, and automation triggers.
What this file does
Defines three content pipelines (blog, social, newsletter) with persona handoffs, vault paths, and automation triggers.
When to use it
- You have a multi-persona content team with CMO, writer, and founder roles
- You want to automate content publishing from a Markdown vault
- You need a structured approval workflow before publication
- You are building a content pipeline with N8N and Notion
Assumes this stack
SFOS Content Workflows
Overview
Content in SFOS flows through a structured pipeline from ideation to publication. Each content type (blog, social, newsletter) has its own workflow with defined handoff points between personas.
Blog Content Pipeline
CMO Writer Founder Publish
| | | |
| 1. Create outline | | |
| in Notion | | |
| | | |
| 2. N8N triggers | | |
| Writer workflow --->| | |
| | 3. Draft written | |
| | to vault | |
| | /content/blog/ | |
| | drafts/ | |
| | | |
| | 4. Review notif ---->| |
| | (Slack/email) | |
| | | 5. Review draft |
| | | approve/reject |
| | | |
| | | 6. Set status: --->|
| | | approved |
| | | | 7. Publish via
| | | | publish-content.py
| | | |
| | | | 8. Update frontmatter
| | | | status: published
Step Details
-
CMO creates outline: In Notion, the CMO creates a content brief containing:
- Topic and angle
- Target keywords (SEO)
- Target audience
- Key points to cover
- Desired length and tone
- Related product (if any)
-
N8N trigger: A Notion webhook or polling trigger in N8N detects the new outline and triggers the Writer workflow.
-
Writer drafts: The Writer persona receives the brief, writes the post, and saves it to the vault:
- Path:
/content/blog/drafts/<slug>.md - Frontmatter includes all required fields plus SEO metadata.
- Path:
-
Review notification: N8N sends a Slack message or email to the founder with a link to the draft.
-
Founder reviews: The founder reads the draft in Obsidian or via the vault's git web UI.
-
Approval: The founder updates the frontmatter status to
approved(orrejectedwith notes). -
Publish: The
publish-content.pyscript reads approved content and publishes it to the blog platform (e.g., push to docs repo for Docusaurus, or API call to CMS). -
Status update: Frontmatter is updated to
status: publishedwith the publication URL.
Social Media Pipeline
CMO Vault Publish
| | |
| 1. Generate batch of | |
| social posts | |
| | |
| 2. Write to vault ---------> | |
| /content/social/ | |
| scheduled/ | |
| | |
| | 3. Scheduled posts |
| | picked up by --->|
| | publish script |
| | |
| | 4. Move to |
| | published/ <--------|
Batch Generation
The CMO persona generates social posts in batches (typically weekly):
- Creates one markdown file per post.
- Each file has frontmatter with
platform,publish_date, and content. - Posts are stored in
/content/social/scheduled/.
Scheduling
The publish-content.py script runs on a cron schedule:
- Reads all posts in
/content/social/scheduled/withpublish_date<= now. - Publishes to the target platform API.
- Moves published posts to
/content/social/published/.
Newsletter Pipeline
CMO/Writer Vault Founder Resend
| | | |
| 1. Draft newsletter | | |
| content | | |
| | | |
| 2. Write to vault ----->| | |
| /content/newsletter/ | | |
| drafts/ | | |
| | | |
| | 3. Notify ------->| |
| | founder | |
| | | 4. Review |
| | | approve |
| | | |
| | | 5. Trigger ----->|
| | | send |
| | | | 6. Send via
| | | | Resend API
| | | |
| | 7. Update <--------------------------------|
| | frontmatter | |
| | with send_id | |
Newsletter Details
- CMO or Writer drafts the newsletter in the vault at
/content/newsletter/drafts/. - The newsletter includes both HTML and plain-text versions.
- Frontmatter specifies the recipient list or segment.
- After founder approval,
publish-content.pysends via Resend batch API. - The Resend send ID and recipient count are written back to frontmatter.
- The newsletter file is moved to
/content/newsletter/sent/.
Content Templates
Templates live in the vault at /templates/:
Blog Post Template
---
persona: writer
product: <product-id>
date: <YYYY-MM-DD>
status: draft
title: <title>
tags: []
platform: blog
publish_date: null
---
## Introduction
## Main Content
## Conclusion
## Call to Action
Social Post Template
---
persona: writer
product: <product-id>
date: <YYYY-MM-DD>
status: draft
platform: <twitter|linkedin|threads>
publish_date: <YYYY-MM-DDTHH:MM:SSZ>
tags: []
---
<post content here - respect platform character limits>
Newsletter Template
---
persona: cmo
product: general
date: <YYYY-MM-DD>
status: draft
title: <newsletter-title>
platform: newsletter
tags: [newsletter, monthly]
---
# <Newsletter Title>
## Highlights
## Product Updates
## Community
## What's Next
What's inside
3 pipeline diagrams, 3 templates, 8 step details, 1 batch generation section
Change this for your project
- Replace
/content/blog/drafts/with your own vault path - Replace
publish-content.pywith your own publish script name - Replace
Resendwith your email provider - Replace
Docusauruswith your blog platform
Where it goes
Keep it in your repository where the agent or team that needs it will read it.
Worth borrowing
- Frontmatter status field as a state machine (draft → approved → published)
- Separate scheduled/ and published/ directories for social posts
- Templates stored in a
/templates/directory for reuse
Related Documents
81 - PERSONAL BLOG/WEBSITE DEEP DIVE FOR TECH CREATORS
Compares 6 blog platforms for tech creators and defines 12 content types with SEO, conversion, and social repurpose guidance.
Social Posting & Engagement Analysis
Documents a social media agent's posting, content generation, scheduling, analytics, and memory system with competitor comparisons and ranked improvement opportunities.
Marketing
Provides a collection of 12 prompt templates for marketing, branding, copywriting, and speechwriting tasks, each with step-by-step instructions.
Social Media Agent Type
Defines a structured agent that produces social media content briefs, hooks, thumbnails, and retention analyses using a state machine and persona loading.