North Star Network

Unified command deck β€” network health, findings, growth, rate limits, revenue & roadmap in one place
β€” loading… syncing live data…
🧠

NETWORK BRAIN

Computing today's read from live network data…

Network β€” … pages live

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.

PageStatusQuota / reasonFollowersViews (24h)Engagement (24h)Posts (24h)Posted todayLast activity
Loading live network data…

Top gainer live

Loading…

Follower trend (network-wide) live

What's actually going on right now live Β· syncing

Generated from the live health, cadence, token, learning, scheduler and data-trust feeds. Recalculates on every load and every 60-second refresh.

Reading current evidence…

πŸ›°οΈ Building current findings

Waiting for the live North Star feed.

Historical investigation archive Β· Aug 10, 2026

βœ… Fixed today β€” 10-page network outage ("session invalidated" on PressPlay + 9 sister pages)

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).

Standing risk: this class of outage recurs any time the granting account's FB session gets invalidated, because these are personal user tokens. The structural fix β€” Business Manager System User tokens (session-independent) β€” is scoped but not yet started; deferred in favor of the Threads rollout below.

βœ… Shipped today β€” native Threads publishing (PressPlay flagship live; rest of fleet next)

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.

Same Tester-role workaround should generalize to the other ~14 Meta apps (none have a Business Portfolio either), so the rollout doesn't need Business Verification anywhere β€” pending per-niche Threads Tester logins.

πŸ†• New niche not yet live β€” MoneyDaily

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.

βœ… Fixed & rolled out network-wide β€” duplicate back-to-back posts

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.

Live on all 25 native-publish niches now (piloted on LockedUp + CaseFileDaily, then rolled out network-wide). DeadCurious was checked and found clean β€” no fix needed there. PressPlay flagship publishes via Make.com, not this code path, so it's unaffected.

βœ… Fixed today β€” CaseFileDaily's stale "(#10) permission" error

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.

βœ… Fixed β€” LockedUp's Instagram link

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.

🐌 Running behind cadence: Rescue, LockedUp re-checked Aug 10

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.

πŸ“‘ Thin feed sources: LockedUp & BlackBox

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.

πŸ§ͺ Brand-QA self-test failing: WiredDaily

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.

πŸ” Content-recycling duplicate rate β€” separate from the back-to-back bug above

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.

⚠️ A lesson from this session β€” don't trust the file-sync mount's timestamps

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.

How posting actually works reference

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.

Newest live pages confirmed Aug 10

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.

Duplicate-post guard rollout complete

NicheStatus
LockedUp, CaseFileDailyGUARD LIVE (pilot)
BlackBox, CodeBlue, DopaMind, IroncladDaily, PawsDaily, PurrDaily, SoftDrop, Survived, Swindled, TheHeist, TheRescue, Tripwire, Unsolved, Vanished, Verdict, Vitals, WanderDaily, WiredDailyGUARD LIVE (rolled out)
DeadCuriousCHECKED β€” clean, no fix needed
PressPlay (flagship)N/A β€” publishes via Make.com, different code path

Proactive Meta-token auto-heal shipped

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.

Network followers live

Total followers

0
β€”

Yesterday

+0
β€”

Pace to 1M network total

β€”
β€”

90-day goal tracker β€” …/page live

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".

PageNowGap to goalYesterdayNeed/dayVerdict
Loading live follower data…

Viral posts (10k+ views)

β€”

Combined views

β€”

Biggest hit

β€”
live feed required

By tier live Β· from /data.json

Every post that crossed 10k views, network-wide. CaseFile and PressPlay dominate the upper tiers by a wide margin.

Top posts, all-time live

#PageViewsStill climbing

Comments scanned

β€”
live feed required

Questions surfaced

β€”
real questions worth answering

Sentiment

β€”

πŸ”΄ Real-time comment intelligence

Current webhook events appear in Signals. Poll-derived comment intelligence below is shown only while its source passes the freshness gate.

Per-page comment pulse live Β· freshness gated

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.

PageCommentsSentimentSpam rateTop question / signal

Events Β· 24h

–
live webhook deliveries

Flagged for review

–
spam-scored or reply-worthy

Feed status

Loading…
pp-signals worker

πŸ”΄ Live now real-time Β· pp-signals

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.

Flagged queue β€” needs a human click

Comments scoring high for spam patterns, or containing a real question / info-request, land here. Nothing is hidden or replied to automatically.

WhenPage (IG id)SignalText
No flagged events yet.

Recent events

WhenPage (IG id)TypeText
No events yet β€” check back once webhooks are activated.

Meta API rate limits β€” per app live

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%.

AppPagesUsageStatus

Cadence ramp live Β· controller evidence

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.

PageInstagramTierMedian reachPostsvs 72 ruleLast decision

Top performing tags live

Content-recycling duplicate rate live Β· freshness gated

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.

PagePosts / 3dRepeat rateWorst repeatAvg reach

Audience β€” top countries live

CountryReach

Audience β€” age split live

Creator earnings β€” all pages live

Loading…

Bio-link funnel live

πŸ’‘ Request a feature

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.

Suggested build order

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-data standard

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.