RAN1 Live is a fully public, static site. Everything that ships in the build is world-readable, so data is split into three tiers and only tier 1 is ever built.
Generated by the ingestion pipelines into public/data/:
meetings.json) from the 3GPP portalmeeting.json, schedule.json, rooms.json, agenda.json,
sources.json, changes.jsondrafts.json) — public 3GPP FTP file listings onlyAll of it is already public on 3gpp.org. No person-level information is added.
Stored exclusively in the browser’s localStorage on the delegate’s own device:
ran1live.company.*)Rules:
src/services/presenceService.ts is the only module that reads or writes
presence. Components go through it, never through storage directly.PresenceStore interface and access-controlled server-side. It
must never be pre-rendered, snapshotted, or committed into public/.API keys, service-role keys, private keys, venue credentials. These belong in GitHub Actions secrets or a server runtime environment, never in the repo or the client bundle.
scripts/check-public-data.mjs runs before every build (prebuild) and again in
CI before the GitHub Pages upload. It fails the build when:
public/ is named like private data
(*.private.*, *.secret.*, .env*, presence*.json, attendees*.json, …)public/ contains a sensitive key
(presence, checkins, attendees, email, userId, groupId, …)service_role, private key headers,
live API key prefixes, …)To publish genuinely public data that happens to use one of those key names, rename the field rather than weakening the guard.