A community-built weekly schedule for X audio Spaces, with automatic local timezone conversion. Hosted at xspaceslive.pages.dev Β· Created by @MartyEarthy
Each row shows a day's host. The time on the left (in blue) is your local time; the original scheduled time is shown alongside it in grey for reference. If your local day differs from the scheduled day (e.g. you're viewing a Monday Space from a timezone where it falls on Tuesday), a small note appears next to the day name.
A banner at the top of the page highlights any live or upcoming Space.
$TSLA and Tesla to surface Spaces hosted by untracked accounts when our tracked hosts are guests. Search runs every 5 minutes; IDs are re-verified every refresh so rooms drop off as soon as they end.started_at, updated client-side every 30s.x.com/i/spaces/{id}.What the X API cannot tell us: who is just listening to a Space (no public endpoint exists for that). The Spaces Dashboard icon on each chip links to a third-party tool that surfaces that info via scraping.
Some days have more than one host β they appear stacked in a single card, separated by a divider. Notes on individual hosts (like "may start late") are shown in small text below the time.
Toggle the Spaces Dashboard Links switch in the header to reveal chart icons next to each host. These link to Spaces Dashboard, a third-party tool for browsing Space recordings and statistics.
The in-page suggestion form is temporarily hidden while it is reworked. To propose a host or slot, message @MartyEarthy on X.
Open schedule.json. It has three top-level arrays:
One object per recurring slot. Multiple entries with the same dayIndex create a grouped card.
| Field | Type | Required | Description |
|---|---|---|---|
day | string | yes | "Monday" β¦ "Sunday" |
dayIndex | number | yes | JS Date.getDay(): Sun=0, Mon=1 β¦ Sat=6 |
host | string | yes | X handle without @ |
displayName | string | no | Human name (falls back to host) |
spaceTitle | string | no | Space title shown in italics |
time | string|null | yes | 24-hr "HH:MM", or null for variable times |
timezone | string | yes | IANA timezone, e.g. "America/Chicago" |
displayTime | string | yes | Human label, e.g. "11:00 AM CT" β cosmetic only |
dashboardUrl | string | no | Spaces Dashboard profile URL |
subscribersOnly | boolean | no | true renders the pink Sub badge |
tentative | boolean | no | true shows "Maybe?" in the live window |
note | string | no | Short note below the time; @mentions are auto-linked |
| Field | Type | Required | Description |
|---|---|---|---|
handle | string | yes | X handle without @ |
dashboardUrl | string | no | Spaces Dashboard profile URL |
Optional top-level boolean (default true if omitted). Set to false to stop querying the X API for handles listed only under additionalHosts (saves User Reads; chips still show from this file, without live API data). Cloudflare env FETCH_ADDITIONAL_HOSTS_FROM_X_API=false on Pages and Worker overrides this without editing JSON. Details: notes.md (βCost toggleβ).
Drives header pills next to the logo. Entries with external: true use accent styling and a globe icon (third-party directory links); omit it for red broadcast-style pills pointing at X.
| Field | Type | Required | Description |
|---|---|---|---|
handle | string | no | X handle without @ (omit for non-X external links) |
displayName | string | no | Label fallback when label isn't set |
label | string | no | Button label (falls back to displayName β handle) |
url | string | yes | Destination URL. Use x.com/{handle}/live for always-current live tab |
external | boolean | no | true renders the accent directory pill (globe icon, no red pulse) |
note | string | no | Maintainer comment; ignored by UI |
After editing schedule.json, run npm run deploy to publish both the Pages Function and Worker in lockstep. See notes.md for the full operational runbook.