Media hub (Vercel)
OKHTTP 308 in 568 ms
HTTP 308 in 568 ms
HTTP 308: Redirecting...
This proves the deployed app can authorise a cron call and open the production database. 401 = CRON_SECRET mismatch between .deploy-secrets and Vercel env. 500 = Turso credentials on Vercel.
HTTP 308
Consumers (Pressto, the phone app) pull from here with an x-api-key. Anything but 200/401 means the route is gone or the app is down.
up; page says "Updated 25 Sep 2026" (41 h ago)
The page is regenerated and deployed by the 6:45 intel-stores job. Stale page = that job stopped before its deploy step. Read stores/intel-stores.log.
HTTP 400 {"error":"opp required"}
HTTP 200 in 259 ms
up; 0 articles, 0 live cycles, 80/90 feeds healthy, llm api (gemini-flash-latest); disk 82% used (db 344 MB, 79 MB free)
cd ~/Developer/cycle-engine && railway status. 'Application not found' = no active deployment. If railway up says 'Your trial has expired', pick a plan at railway.com (Hobby is enough) and redeploy: railway up --service cycle-engine --detach. A full volume kills SQLite; the Janitor agent now prunes at boot and every 6 h, and a 'disk_warning' in the agent feed means grow the volume in the Railway dashboard.
HTTP 200 in 254 ms
up; last message 26 min ago
answering (HTTP 404)
last tick 1 min ago
last poll finished 13 min ago
last intel file 3.6 h ago
last stores file 3.7 h ago; log: TypeError: Cannot read properties of null (reading 'toLowerCase')
Runs stores/intel-stores.sh. The extractor step is now non-fatal, so the page still regenerates and deploys even if Gmail mining fails. Re-run: bash stores/intel-stores.sh
last run 9.4 h ago; digest FAILED; [2026-09-26 07:17:13] digest failed (continuing)
scripts/daily.sh in media-hub. 'ENOTFOUND ...turso.io' = DNS/network dropped mid-run (travelling wifi); the digest simply retries tomorrow. Re-send today: cd media-hub && set -a && . .turso-env && set +a && npx tsx scripts/media-digest.ts
last poll 18 min ago; email: 81 seen, 0 new, 51 updated, 30 already known, 0 dupes, 24 expir | sourcebottle: 468 seen, 0 new, 393 updated, 75 already known, 0 dupes,
last run 54 min ago, success
last run 16 min ago, success
last pass 5.9 h ago; [2026-09-26 10:47] pass 2/2 unreadable response / [2026-09-26 10:47] adjudicate adjudication unreadable
'unreadable response' = the cron verify step timed out or returned non-JSON (often OpenRouter out of credit, or a 300 s Vercel window overrun). Check the credits card below first.
brief last written 1.5 h ago
last log write 1.5 h ago; launchd exits [6,0,0,0,0,0]
claude -p answered
9 jobs loaded
reachable in 1755 ms; 12,150 journalists; 2721 staged changes awaiting review
last feed run -160 min ago; 59/69 feeds healthy; failing: AdNews, Banking Day, Business News Australia, HR Leader, Information Age, InnovationAus, Inside Retail, InvestorDaily, Pedestrian TV, The New Daily
Feeds returning 403/404 have moved or now block bots. Fix the URL in the sources table (scripts/discover-feeds.ts) or disable the source.
6 inboxes, last scan -180 min ago
newest callout 22 h ago; 65 in last 24 h; email:haro 22 h ago, email:qwoted 45.6 days ago, sourcebottle 40 h ago
nothing sent in the last 24 h
US$9.66 left; burning about US$3.15/day (about 3 days)
Top up at openrouter.ai/settings/credits. At zero, every web feature returns empty with no error (402 swallowed), verification stalls and the sweep logs 'unreadable response'.
newest post pulled 28 h ago
key present in media-hub/.env.local (delivery proven by the digest job above)
| Component | Started | Ended | What was seen |
|---|---|---|---|
| Turso production database | 26 Sept, 16:23 | 27 Sept, 00:47 | fetch failed |
| Headless claude (what every extractor job runs on) | 26 Sept, 16:23 | 27 Sept, 00:47 | no answer: API Error: Unable to connect to API (FailedToOpenSocket) |
| Opportunity poll (every 15 min) | 26 Sept, 16:23 | 27 Sept, 00:57 | last poll 9.4 h ago; email: 102 seen, 0 new, 68 updated, 34 already known, 0 dupes, 24 expi; [TypeError: fetch failed] { |
| Team dash refresh daemon | 26 Sept, 16:23 | 27 Sept, 00:47 | last tick 1.1 h ago |
| Team dash (Cloudflare) | 26 Sept, 16:23 | 27 Sept, 00:47 | fetch failed |
| Client portal (onboarding.launchlink.co) | 26 Sept, 16:23 | 27 Sept, 00:47 | fetch failed |
| Team page functions (D1 notes and submissions) | 26 Sept, 16:23 | 27 Sept, 00:47 | fetch failed |
| Media Intel team page (Cloudflare) | 26 Sept, 16:23 | 27 Sept, 00:47 | fetch failed |
| Media hub (Vercel) | 26 Sept, 16:23 | 27 Sept, 00:47 | fetch failed |
| OpenRouter credit (web lookups, verification, chat) | 26 Sept, 06:54 | open | US$9.73 left; burning about US$3.27/day (about 2 days) |
| Opportunity poll (every 15 min) | 25 Sept, 23:54 | 26 Sept, 02:54 | last poll 2.0 h ago; email: 124 seen, 0 new, 83 updated, 41 already known, 0 dupes, 29 expi | sourcebottle: 360 seen, 0 new, 310 updated, 50 |
| Opportunity engine (callouts arriving) | 25 Sept, 21:45 | 25 Sept, 21:55 | TypeError: fetch failed |
| Cycle engine (Railway) | 25 Sept, 12:03 | open | up; 0 articles, 0 live cycles, 80/90 feeds healthy, llm api (gemini-flash-latest); disk 82% used (db 344 MB, 79 MB free) |
| Opportunity poll actually running (any clock) | 25 Sept, 10:23 | 25 Sept, 11:31 | last poll finished 2.1 h ago |
| Opportunity poll (every 15 min) | 25 Sept, 08:19 | 25 Sept, 10:23 | last poll 4.2 h ago; email: 126 seen, 0 new, 98 updated, 28 already known, 0 dupes, 26 expi | sourcebottle: 257 seen, 0 new, 241 updated, 16 |
| Client portal (onboarding.launchlink.co) | 25 Sept, 01:10 | 25 Sept, 01:21 | This operation was aborted |
| Pressto webhook deliveries (hub to api.yaarn.ai) | 24 Sept, 12:04 | 24 Sept, 12:15 | LibsqlError: SERVER_ERROR: Server returned HTTP status 502 |
| Opportunity engine (callouts arriving) | 24 Sept, 12:04 | 24 Sept, 12:15 | LibsqlError: SERVER_ERROR: Server returned HTTP status 502 |
| Turso production database | 24 Sept, 01:30 | 24 Sept, 01:50 | fetch failed |
| Cycle engine (Railway) | 24 Sept, 01:30 | 24 Sept, 01:50 | fetch failed; volume 82% full |
| Client portal (onboarding.launchlink.co) | 24 Sept, 01:30 | 24 Sept, 01:40 | fetch failed |
| Media hub (Vercel) | 24 Sept, 01:30 | 24 Sept, 01:40 | fetch failed |
| Opportunity poll (every 15 min) | 23 Sept, 23:25 | 23 Sept, 23:36 | last poll 2.1 h ago; sourcebottle: 465 seen, 0 new, 406 updated, 59 already known, 0 dupes, |
| Team dash refresh daemon | 23 Sept, 23:15 | 23 Sept, 23:25 | last tick 1.4 h ago |
| Turso production database | 23 Sept, 07:28 | 23 Sept, 07:39 | fetch failed |
| Component | When | Action |
|---|---|---|
| Savings, events, trends + team page deploy (06:45 daily) | 27 Sept, 02:51 | co.launchlink.intel-stores |
| Team dash morning brief (6x/day) | 27 Sept, 00:47 | co.launchlink.briefing.0900 |
| Felicia's daily brief (6x/day) | 27 Sept, 00:47 | co.launchlink.personal-brief |
| Verification sweep (daily) | 27 Sept, 00:47 | co.launchlink.media-sweep |
| Opportunity poll (every 15 min) | 26 Sept, 18:50 | co.launchlink.opportunities |
| Team dash refresh daemon | 26 Sept, 18:50 | com.launchlink.refresh-daemon |
| Daily brief action server (:3001) | 26 Sept, 18:50 | co.launchlink.action-server |
| WhatsApp bridge | 26 Sept, 18:50 | com.launchlink.whatsapp-bridge |
| Felicia's daily brief (6x/day) | 25 Sept, 19:16 | co.launchlink.personal-brief |
| Opportunity poll (every 15 min) | 25 Sept, 11:32 | co.launchlink.opportunities |
| Opportunity poll (every 15 min) | 24 Sept, 15:20 | co.launchlink.opportunities |
| Savings, events, trends + team page deploy (06:45 daily) | 24 Sept, 02:53 | co.launchlink.intel-stores |
| Team dash morning brief (6x/day) | 23 Sept, 23:15 | co.launchlink.briefing.0900 |
| Felicia's daily brief (6x/day) | 23 Sept, 23:15 | co.launchlink.personal-brief |
| Opportunity poll (every 15 min) | 23 Sept, 23:15 | co.launchlink.opportunities |