Computing today's read from live network dataβ¦
Sorted worst-first by default (longest silence / errors surface at top) β click any column header to sort, click again to flip. Pulled live from the network's /data.json feed on every load β this table computes its own status pills from real posting activity rather than a hand-typed snapshot, so it can't go stale the way a copy-pasted table can.
| Page | Status | Quota / reason | Followers | Views (24h) | Engagement (24h) | Posts (24h) | Posted today | Last activity |
|---|---|---|---|---|---|---|---|---|
| Loading live network data⦠| ||||||||
Generated from the live health, cadence, token, learning, scheduler and data-trust feeds. Recalculates on every load and every 60-second refresh.
Waiting for the live North Star feed.
Root cause: personal Graph API user tokens generated via Graph API Explorer are tied to the granting account's own login session. A forced Facebook re-auth invalidated every token ever minted from that session at once, across every app β not a per-page problem, so it silently takes out whole app-groups together. The 25 live pages split into 3 Meta App groups by shared token (PP-PawsGroup, PP-TripwireGroup, PP-CaseFileGroup); rotated all 3 groups' tokens via one Graph Explorer paste per group. Verified live: every one of the 25 live niches has a successful published row today (checked directly against each niche's state.db, not just the dashboard).
Built a full native Threads integration mirroring the existing IG/FB path: core/threads_publish.py (posting), core/threads_insights.py (stats, feeds the dashboard's new π§΅ Threads section), and an additive hook in native_publish.py so a Threads failure can never block or roll back an IG/FB post that already succeeded. Setup hit a real blocker: Threads' OAuth redirect-URI registration requires a Business Portfolio, which this app doesn't have connected. Workaround found and used instead β added the account as a Threads Tester (a distinct app-role that bypasses the Business Portfolio requirement), which after acceptance unlocks a built-in "User Token Generator" panel for a direct long-lived token, no OAuth redirect needed. Verified live: PressPlay's own production engine fired a real post with THREADS_NATIVE (VIDEO) in its published table today.
Has generated content (captions, facts, carousel images under niches/MoneyDaily/) but no publishing engine: no .env, no config.toml, no pressplay2/core, and critically no main.py β pp_supervisor.py only picks up pages with a niches/<Page>/pressplay2/main.py present, so it's invisible to the supervisor and was never started (its state.db is empty, no engine.MoneyDaily.log exists at all). Not staged or retired β just an unfinished scaffold. Needs the full new-page build (engine scaffold + its own Meta app/credentials) before it can go live.
Found two confirmed pairs on LockedUp and one on CaseFileDaily where the exact same story got published twice, 1β19 minutes apart. Root-caused to the publish-time IG retry path (a request that looks like it failed locally but actually succeeded on Meta's side, then gets retried). Shipped a content-fingerprint safety-net guard β _already_posted_recently() β to native_publish.py: before firing, it checks Instagram's own last 3 posts for an identical caption body within the last 10 minutes and skips the re-fire if found. Fails open on any error, so it can't itself cause a missed post.
The dashboard kept showing a broken-credentials error for CaseFileDaily even though its token was fine. Cause: the Cloudflare Worker embeds each page's token/App ID as a snapshot taken at deploy time, not a live .env read β CaseFileDaily's App ID had changed since the last deploy. Fixed by redeploying the health worker with fresh .env values.
LockedUp's Facebook Page had lost its linked Instagram Business Account. You reconnected it in Meta Business Suite; verified restored via a direct Graph API check.
Re-checked today via each niche's own state.db: CodeBlue, TheHeist and Survived are current (posted within the last few minutes). Rescue (~1.7h since last post) and LockedUp (~4h since last post) are still behind the normal ~20-minute rhythm β confirmed alive (both have healthy recent IG_NATIVE/FB_*_NATIVE rows, just infrequent), not dead. Worth a look if it persists.
Both are alive and posting, but running on narrow supply β 6 RSS sources each, with pool sizes of ~9β18 items per pull. BlackBox's own config already notes it was widened once before ("aviation-only... couldn't sustain the network cadence") and is still thin. Good candidates for adding more feed sources; by contrast Survived and PurrDaily looked low-queue on the dashboard but are actually posting 99β131x/day β that's just fast queue cycling, not a real supply problem.
The live dashboard's automated brand-QA check has WiredDaily failing 1 test as of the last run. Not yet investigated this session β worth a look before it compounds.
The live dashboard's Dupes tab tracks a different metric: how often a page reships the same piece of content over a longer window (last 3 days, captured 7/19/2026). Nine pages are still above 50% repeat rate β see the Content & Audience tab for the full table. Every page now runs a 7-day dedup window going forward, so this should trend down toward Wander's ~24% as the pre-dedup backlog ages out; it's not something that needs a fix today, just worth watching.
Mid-session, reading niche databases through the Mac-file bridge showed 9 pages frozen since Aug 5 ~12:00β12:29 AM and looking dead. Direct Graph API checks proved every one of them was actually alive and posting normally β the bridge's file sync had simply stopped updating those specific files, not the pages themselves. Moral: when this dashboard (or Claude) reports something as "dead" based on file timestamps, verify against the live API before acting on it. This page's own live tables (data.json fetch, run in your browser with a real connection) don't have this problem.
Each niche runs its own main.py tick loop on your Mac via launchd (one job per page, ticking roughly every 60s), guarded by a single-instance file lock with a stale-lock breaker. Each tick: producers/stories.py pulls fresh headlines and dedups them β core/queue.py holds ready-to-post items (with a network-wide claim system so two sister pages can't post the same story) β publishers/publisher.py pops the best-scored item and fires it β clones post natively via core/native_publish.py, the flagship posts through Make.com. A separate pp_supervisor.py job keeps all live pages alive (25 as of Aug 10 β count drifts as pages are added; check status_board.py's PAGES list for the current source of truth) and can mass-restart them from the live dashboard's "Restart All" button.
WildPulse, NearbyGems, ExtremeSkies and BeyondExplained are the most recently launched pages β all already in status_board.py's PAGES list (so they show up on every other tab of this dashboard) and all confirmed posting today via their own state.db. NearbyGems specifically: last post today at 19:19 UTC, IG_NATIVE + FB_REEL_NATIVE, no errors. This tab (the hand-written one) is the only one that hadn't caught up β it does now.
| Niche | Status |
|---|---|
| LockedUp, CaseFileDaily | GUARD LIVE (pilot) |
| BlackBox, CodeBlue, DopaMind, IroncladDaily, PawsDaily, PurrDaily, SoftDrop, Survived, Swindled, TheHeist, TheRescue, Tripwire, Unsolved, Vanished, Verdict, Vitals, WanderDaily, WiredDaily | GUARD LIVE (rolled out) |
| DeadCurious | CHECKED β clean, no fix needed |
| PressPlay (flagship) | N/A β publishes via Make.com, different code path |
Installed this session: system/pp_token_autoheal.py + a launchd job (daily, 6:00 AM) that checks every page's Meta token, auto-exchanges anything expiring within 5 days for a fresh long-lived token, redeploys the health dashboard automatically if it refreshed anything, and flags anything it can't fix (fully expired tokens, closing data-access windows) for manual re-auth. Never logs a token value.
The network goal is 1,000,000 combined followers on the platform selected above (All = IG + FB + TikTok + YouTube; TikTok and YouTube gains are the last 24h, the only window their snapshots carry). Each page's share is 1M Γ· live page count (β¦), reached within 90 days of its first post β not a flat 48k, which would sum to over 2M. Computed live from each page's current followers and its completed yesterday gain (first-reading snapshot to first-reading snapshot, IG + FB); pages without a readable launch date show as "warming up".
| Page | Now | Gap to goal | Yesterday | Need/day | Verdict |
|---|---|---|---|---|---|
| Loading live follower data⦠| |||||
Every post that crossed 10k views, network-wide. CaseFile and PressPlay dominate the upper tiers by a wide margin.
| # | Page | Views | Still climbing |
|---|
Current webhook events appear in Signals. Poll-derived comment intelligence below is shown only while its source passes the freshness gate.
Spam-pattern rate (repeated text / follow-DM bait) is flagged per page where the live dashboard detected it β several pages are running 17β56% spam, worth a moderation pass before ever turning on auto-reply.
| Page | Comments | Sentiment | Spam rate | Top question / signal |
|---|
Comments and mentions shown here come directly from the current pp-signals feed. If the feed is unreachable, this panel shows unavailable instead of retaining an earlier value.
Comments scoring high for spam patterns, or containing a real question / info-request, land here. Nothing is hidden or replied to automatically.
| When | Page (IG id) | Signal | Text |
|---|---|---|---|
| No flagged events yet. | |||
| When | Page (IG id) | Type | Text |
|---|---|---|---|
| No events yet β check back once webhooks are activated. | |||
Usage is Meta's own call_count / total_time / total_cputime percentage for the app
that owns the token β same number regardless of which page's token you read it from.
Healthy <70% Β· Warning β₯70% Β· Critical β₯90% Β· Throttled =100% (posting starts failing).
Computed live from the same /data.json feed as the network table above: pages are grouped by
the Meta app their token actually belongs to, and usage is read off the x-app-usage header Meta
stamps on those calls. Costs no extra Graph calls β it reuses data already fetched.
2026-08-20: this table used to be a hand-typed snapshot from Aug 6 that read "every app is healthy" for two
weeks while apps were actually sitting at 79β94%. It also disagreed with the health dashboard's own live
panel. Both now read from one source. Page count is a rough guide, not the rule β what matters is
calls/hour: four heavy pages can sit at 83% while three light ones sit at 23%.
| App | Pages | Usage | Status |
|---|
What system/cadence_ramp.py actually decided from. 72/day when the median IG reach
of posts at least 24 h old is ≥ 300; a page already at 72 keeps it down to 250. One decision per
completed ET day, after 07:00 ET. A day where most pages miss delivery is held as a host outage, not a page failure.
| Page | Tier | Median reach | Posts | vs 72 rule | Last decision |
|---|
How often each page reships the same piece of content within its dedup window, last 3 days. This is a different metric from the back-to-back publish bug fixed today (see Findings) β it's about long-run content reuse, not double-firing the same post seconds apart. All pages now run a 7-day dedup window going forward.
| Page | Posts / 3d | Repeat rate | Worst repeat | Avg reach |
|---|
| Country | Reach |
|---|
Click "Queue for Claude" on any item below (or write your own) to copy a ready-to-paste request. This dashboard is a static file with no server of its own, so it can't reach out and start work by itself β but pasting the copied text into your next Claude chat kicks it off in one step, with full context already baked in.
Cheapest-and-highest-impact first. Items already shipped this session are marked done rather than silently dropped, so nothing quietly disappears between being discussed and being tracked.
live panels pull from the network feeds on every load and refresh. If a source exceeds its freshness contract, the panel displays DATA UNAVAILABLE β STALE SOURCE; it never falls back to a prior operational value. planned items are specified but not yet built.