Two servers, on purpose
The system runs on two separate cloud servers ("droplets"), and the split is deliberate.
Plain EnglishOne server grows and feeds the content; the other server publishes it. They talk over a secure connection once a night.
The nightly pipeline
Four scheduled jobs form a chain. Each hands off to the next. Times are UTC.
05:00 · main droplet
gen-social-feed.py reads the network data and writes a feed of publishable items, then copies it to the hub.
↓
05:10 · hub
generate.py turns feed items into scheduled posts using templates, rotating content so nothing repeats too soon.
↓
every 10 min · hub
publish_due.py takes any post whose time has arrived and sends it to the right networks — respecting the cost cap and the kill switch.
↓
05:20 · hub
report.py writes a digest of what published and pulls back basic performance numbers.
Every moving part
The GitHub Repositories page links the open-source project behind each of these.
From raw data to a live post
Follow one post end to end:
- A site in the network has the description "Complete guide to home water filtration…" in the network data file.
- The feed generator packages it as a site-feature item with a verified description and URL.
- The generator picks a matching template and produces the finished text, scheduled for an open time slot.
- When that time arrives, the publisher signs the request and posts it to X and Bluesky, recording the live URLs.
- The report job logs the post and its early engagement.
The guaranteeIf a fact needed by a template is missing from the source data, the post is held, not guessed. Honesty is enforced by the machine, not by hoping the writer got it right.