About

A community-built weekly schedule for X audio Spaces, with automatic local timezone conversion. Hosted at xspaceslive.pages.dev Β· Created by @MartyEarthy


Reading the schedule

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.

Status badges

A banner at the top of the page highlights any live or upcoming Space.

Live status features

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.


Multiple hosts per day

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.

Spaces Dashboard Links

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.

Suggest an addition

The in-page suggestion form is temporarily hidden while it is reworked. To propose a host or slot, message @MartyEarthy on X.


Editing the schedule (developers)

Open schedule.json. It has three top-level arrays:

scheduled

One object per recurring slot. Multiple entries with the same dayIndex create a grouped card.

FieldTypeRequiredDescription
daystringyes"Monday" … "Sunday"
dayIndexnumberyesJS Date.getDay(): Sun=0, Mon=1 … Sat=6
hoststringyesX handle without @
displayNamestringnoHuman name (falls back to host)
spaceTitlestringnoSpace title shown in italics
timestring|nullyes24-hr "HH:MM", or null for variable times
timezonestringyesIANA timezone, e.g. "America/Chicago"
displayTimestringyesHuman label, e.g. "11:00 AM CT" β€” cosmetic only
dashboardUrlstringnoSpaces Dashboard profile URL
subscribersOnlybooleannotrue renders the pink Sub badge
tentativebooleannotrue shows "Maybe?" in the live window
notestringnoShort note below the time; @mentions are auto-linked

additionalHosts

FieldTypeRequiredDescription
handlestringyesX handle without @
dashboardUrlstringnoSpaces Dashboard profile URL

fetchAdditionalHostsFromXApi

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

pinnedStreams

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.

FieldTypeRequiredDescription
handlestringnoX handle without @ (omit for non-X external links)
displayNamestringnoLabel fallback when label isn't set
labelstringnoButton label (falls back to displayName β†’ handle)
urlstringyesDestination URL. Use x.com/{handle}/live for always-current live tab
externalbooleannotrue renders the accent directory pill (globe icon, no red pulse)
notestringnoMaintainer 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.