index · all work
05 · local-first

Content Pipeline

Every platform, every draft, every lead, one local-first desktop app that never phones home.

Year2026
Statusshipped
RoleSolo · design + engineering
Built withReact 19 · Electron 41 · Express 5 · TypeScript 5.9 · Tailwind CSS 4 · +5
content pipeline · content studioopen ↗

Live demo. Click Run to load the real app and use it right here, or open it full-screen.

01Overview

Content Pipeline is the private command center I run my entire content operation from. It tracks short-form video and text posts through their full lifecycle across seven platforms, runs outbound on X, and stages a shipped feature as platform-native posts plus a video, all grounded in my writing voice from an Obsidian vault and a per-lead memory of everyone I've talked to. It ships as a macOS menu-bar app with an Express server running in-process, and every byte of pipeline data is JSON on my disk.

The drafting itself is done by my own agents (Claude Code skills and a worker VM) that read this app's memory and write candidates back into it. Content Pipeline is the system of record around them: the memory store, the grading and per-platform rate caps, the approval queue, the two-way vault sync, and the Ops page where I start and stop the VM. Off-the-shelf tools are cloud silos that flatten your voice and want your data on their servers. This one is the opposite: local-first, voice-anchored, and wired into the tools I already use.

02The problem

A solo founder ships daily and has to turn that work into content across seven platforms while running outbound on X. The SaaS tools for it are cloud silos that flatten your voice into slop and don't know your codebase, your writing, or the people you've already messaged. Content Pipeline keeps all of it on one machine, grounded in a real writing voice and a memory of every lead.

03Highlights
  • Outbound pipeline for X: reply, DM, and repost candidates arrive in three angles (empathetic, technical, contrarian), ranked by quality score and tier (T1-T3), with a per-platform active-queue cap that returns 429 and fires a Pushover alert when a bucket fills.
  • Per-lead memory store: a markdown CRM vault (leads, entities, insights, self-context) that round-trips my manual edits and serves /api/memory/context to the drafter, so every reply remembers who I've already talked to.
  • Voice-post fan-out: a feature description resolves to voice anchors from my Obsidian vault, then a run captures platform-native posts, a Forge video task, and a short-video script.
  • Two-way Obsidian sync writes posts, videos, and runs back to the Mars vault and captures my manual edits into voice-anchors/edits.md, so the drafter learns my corrections over time.
  • Viral intelligence parses a tracked-creator watchlist, syncs it to Supabase, and pulls scored recent viral posts to shape script structure, never the wording.
  • Local-first by default: all state is JSON on disk (atomic .tmp + rename), the server answers only localhost and Tailscale (403 to everything else), and it ships as an in-process Electron menu-bar app with live tray stats.
04By the numbers
7
content platforms across video and text
19
dashboard views in one React SPA
29
REST route-group namespaces
~6,700
lines of server-side TypeScript
What's inside8 parts
  • Content Pipeline (Electron desktop app)app

    macOS menu-bar shell (Electron 41, appId com.contentpipeline.app) that runs the Express server in-process, shows live pipeline counts in a tray it rebuilds every 30 seconds, and exports selected clips out of the Photos app over an AppleScript IPC handler.

  • serverservice

    Express 5 API in server/index.ts (about 3,100 lines) that stores every video, post, idea, and lead as plain JSON files under data/projects/, writes them atomically through a tmp-and-rename helper, and answers only requests from localhost or the Tailscale CGNAT range.

  • React dashboard (src/)app

    React 19 and Framer Motion hash-routed single-page UI with no router library, holding the Overview, Media, Shorts, Ideas, Outbound, Watchlist, Sent, and Ops tabs of the command center.

  • obsidian-syncworker

    Writes posts, videos, DMs, and replies out to the Mars Obsidian vault as dated markdown (keeping Pablo's hand edits intact on round-trip) and reads voice-anchor edits back into the pipeline.

  • memorylibrary

    Read and write API over the openclaw-memory markdown vault (one file per lead, plus entities, insights, and pablo self-context) that backs the /api/rag/search and /api/memory/context lookups and the Algolia lead index.

  • viral-sync + watchlistworker

    Parses the creator list in viral-watchlist.md, syncs those handles to Supabase, and pulls recent viral-intel rows that the script-pack skill uses to shape hook and format choices.

  • openclaw-adminservice

    Authenticated proxy behind the Ops page that starts, stops, and restarts the classifier and drafter worker pools (plus the gateway and cortex-relay services) on the remote OpenClaw outreach VM over Tailscale.

  • script-packskill

    Claude Code slash-command that drafts 1 to 7 short-form video scripts in Pablo's voice, anchored on the Mars vault and shaped by scraped viral patterns, then writes them into the pipeline as scripted videos once he approves the dry run.

·Tags
local-firstdesktop appcontent opsagent memoryoutreach engineRAG
Full tech stack 10
React 19Electron 41Express 5TypeScript 5.9Tailwind CSS 4Vite 8Framer MotionSupabaseAlgoliaTailscale