The kill switch
Freeze all posting instantlyCreate one file and nothing publishes on any tenant until you remove it:
# stop everything
ssh root@64.227.29.192 touch /opt/portal/PAUSE
# resume
ssh root@64.227.29.192 rm /opt/portal/PAUSE
The publisher checks for this file first, every run. Use it any time something looks wrong — it is instant and total.
Cost control
The whole system costs $24/month to run (the hub server). Content generation is free. The only per-post cost is X.
Hard ruleThe system runs on a flat subscription. It never uses per-token AI billing — content is template-generated, so audits and scale can't blow a budget.
Changing cadence or channels
# edit the tenant config on the hub
ssh root@64.227.29.192 nano /opt/portal/clients.json
# then regenerate (safe to run anytime)
ssh root@64.227.29.192 python3 /opt/portal/generate.py
Set "require_approval": true to route a tenant through the approval queue instead of auto-posting.
Posting on demand
To push something immediately, add it to the queue with its time set to now and run the publisher:
ssh root@64.227.29.192 python3 /opt/portal/publish_due.py
The publisher processes any post whose scheduled time has passed.
Monitoring & logs
Failures also push a phone notification via ntfy, so you hear about a problem without watching logs.