I Built a Content Flywheel That Runs on Obsidian and AI Skills

· 8 min read
I Built a Content Flywheel That Runs on Obsidian and AI Skills
Photo by BoliviaInteligente on Unsplash

Two weeks ago I rebuilt my personal site with Claude Code. Last week I wired OpenClaw into my Obsidian vault so my AI agent could read project context and run workflows across sessions. This week the system started running itself.

Sunday night at 9 PM, a scheduled task kicks off on my OpenClaw server. It syncs my Bluesky posts, Twitter activity, newsletter stats, and podcast downloads into the vault. Then it aggregates everything into a cross-platform review. Then it generates next week's content calendar with seven days of social posts, newsletter angles, podcast topics, and blog candidates. All from the same vault the agent reads and writes to every day.

I didn't plan to build a content flywheel. I built individual tools to solve individual problems, and they connected into a loop.

This is how the pieces fit together, what the weekly cycle actually looks like, and how the system improves its own writing over time.


The Sunday Night Pipeline

The whole thing runs as a single chained command in OpenClaw:

/bluesky-sync → /twitter-sync → /buttondown-sync → /transistor-sync → /social-review → /content-calendar

Each step is a Claude Code skill. Each one reads from the vault and writes back to it. The four syncs run as separate scheduled jobs. Once they've finished, the review runs on their combined output, then the calendar.

Here's what each step does:

Platform syncs pull raw data into markdown files. /bluesky-sync creates Publishing/Stats/Bluesky/Bluesky 2026-W12.md with every post, reply, like count, and follower change for the week. Same pattern for Twitter, Buttondown (newsletter), and Transistor (podcast). Each file has structured frontmatter for the numbers and a content section with the actual posts.

/social-review reads all four sync files and produces a combined stats review. It compares engagement rates across platforms, identifies which posts performed best, tracks what content types are working (original observations vs. promo vs. personal), and maintains a running Signals document. Signals are patterns that persist across weeks: "Twitter outperforming Bluesky on cross-posted content" or "original content outperforms promotional." When a signal shows up three weeks in a row, it gets promoted to a strategy change.

/content-calendar reads the stats review, the signals, work logs, recent newsletters, podcast episodes, and a social backlog of unused post ideas. It produces a daily content calendar for the upcoming week: one post per day, Monday through Sunday. Each post includes the draft text, content type, source references, sanitization flags, and empty Posted: blocks with Twitter and Bluesky link placeholders for me to fill in after posting.

The calendar also suggests newsletter opening thought angles, podcast topics, and blog candidates for the week. All sourced from what's already in the vault.


The Backlog System

Not every idea fits into this week's calendar. Some are too early, some need more distance from work, some are waiting for a triggering event. These used to disappear. Now they go to backlogs.

Four backlog files, one per medium:

Medium File What goes there
Social Publishing/Content/Social Backlog.md Post drafts ready to schedule
Newsletter Publishing/Newsletters/Newsletter Backlog.md Opening thought angles and section ideas
Blog Publishing/Blog/Blog Backlog.md Post ideas with enough substance for long-form
Podcast Publishing/Podcast/Topics Backlog.md Episode topics, predictions to revisit, recurring questions

Each backlog has three sections: Active (ready to use), Potential (parked, not timely yet), and Ignored (stop suggesting).

The /content-idea skill captures ideas mid-week and routes them to the right backlog. If an idea spans multiple mediums, it writes to each one and cross-links them with Related: fields. A social post about "AI context switching overhead" that could also be a newsletter angle gets entries in both backlogs, each pointing to the other.

When the content calendar generates next week, it reads the social backlog's Active section and can pull ideas directly into the schedule. Unposted calendar items flow back to the backlog. Items that sit in Active for two weeks without being posted get moved to Potential during grooming.

The backlogs are the memory between weeks. The calendar is this week's plan.


The Voice Loop

The part I didn't expect to build: the system that teaches itself how I write.

The content calendar drafts social posts in my voice using a /writing-voice skill. That skill is a detailed reference document. It covers how I structure arguments, my default sentence length, how humor shifts between social and newsletters, emoji habits, hashtag patterns. Specific enough that AI-drafted posts are close to what I'd write.

Close, but not right. I still rewrite most posts before publishing.

The content calendar captures both versions. The AI draft sits in the blockquote under each day. My rewritten version goes in the Posted: block. Over time, these pairs accumulate.

Once a month, I run /voice-review. It reads every AI draft and Posted pair across the past 4+ weeks. It categorizes the edits I made: tone shifts, length changes, added specifics, dropped sarcasm, added emoji. It tallies patterns across weeks and proposes updates to three skills:

  1. writing-voice (the reference document itself)
  2. social-coach (the skill that reviews posts for voice accuracy)
  3. content-calendar (the skill that drafts the posts)

The proposals only apply if a pattern shows up in 3+ posts or across 2+ separate weeks. One-off edits are noise. Consistent rewrites are signal.

After the first review, I found that the AI was consistently writing resigned, self-deprecating social posts ("classic.", "I don't know, maybe write the doc.") and I was consistently rewriting them toward genuine enthusiasm ("Super excited!", "Docs save time!"). The writing-voice skill now explicitly says: dry humor belongs in newsletters and podcasts, social posts get sincere energy. The next round of drafts should be closer.

The flywheel: write → post → review → update the voice → write better next time.


The Full Weekly Cycle

Here's how a typical week runs end to end:

Sunday night (automated): Platform syncs → social review → content calendar generated. I wake up Monday with a plan.

Monday through Sunday: I review each day's post, edit if needed, post to Twitter and Bluesky, fill in the Posted: block and links. Mid-week ideas get captured with /content-idea and routed to the right backlog.

Thursday: I run /newsletter-writer to draft it, pulling from the vault's work logs, recent content, and newsletter backlog.

Friday: Newsletter goes out.

Saturday: Podcast publishes. I run /import-podcast to pull the episode into the vault, then /podcast-review to update the topics backlog.

End of month: /voice-review compares AI drafts to actual posts and proposes skill updates. /review-monthly aggregates weekly reviews and forces promote-or-drop decisions on lingering signals.

Every step reads from and writes to the same vault. The output of one skill becomes the input of another. The stats review feeds the content calendar. The content calendar produces drafts. The drafts get rewritten. The rewrites teach the voice skill. The voice skill improves the next round of drafts.


What I'd Change

The 70/20/10 mix target needs rethinking for daily posting. The original content strategy was built for 3-4 posts a week. Seven posts a week shifts the math. Some weeks are heavier on personal content because there are only so many value observations per week. I'm still calibrating.

Backlog grooming needs a trigger, not just a timer. The "2 weeks in Active then move to Potential" rule is fine for social posts. For blog and newsletter ideas, timeliness varies more. A blog idea about a conference talk might sit for months and still be valid. I'll probably split the aging rules by medium.

The voice review needs more data. One month of before/after pairs showed clear patterns. But the sample is small. The real test is whether the second month's drafts need fewer rewrites. I'll know in about a month.


The Stack

For anyone who wants to replicate this:

  • Obsidian as the knowledge base (any vault structure works, but context files and signals make it much better)
  • Claude Code for building skills (each skill is a markdown file with instructions, no traditional code)
  • OpenClaw on a DigitalOcean droplet ($24/month) for the always-on agent
  • Obsidian Headless to keep the server and your Mac in sync
  • Discord as the chat interface (each channel maps to a project)
  • Bluesky, Twitter/X, Buttondown, Transistor as publishing platforms (the sync skills pull from their APIs)

The total stack cost is about $29/month: $24 for the server and $5 for Obsidian Sync. I also bought $20 in Twitter API credits to pull weekly stats, but that should last a while at this usage level. Everything else is free or already paid for.

26 Claude Code skills power the whole system at time of writing. Each one is a markdown file. No Python scripts, no cron jobs, no custom API integrations. The skills are instructions the AI follows. If the workflow changes, I edit the markdown.


How It Started

I didn't set out to build a content system. I set out to stop forgetting things.

The work logs started because I needed a brag doc for performance reviews. The stats syncs started because I wanted to know which platform was worth my time. The content calendar started because I was posting randomly and wanted a plan. The voice review started because the AI drafts were too polished and self-deprecating, and I kept rewriting them toward something more direct.

Each tool solved a specific problem. The flywheel emerged because they all read and write to the same vault.


Hit me up on Bluesky or X if you're building something similar. I'd like to hear how others are approaching this.

Part of a series

Building AI-powered Personal Infrastructure

Liked this? Get Dev Notes.

A weekly newsletter for developers. AI tools, Laravel, dev workflows, and things I find interesting. Every Friday at 8:45 AM Eastern.