Files
runicgateway.com/brand-default/brand.json
wtclaude 769d213c80
Some checks failed
PR checks / checks (pull_request) Failing after 2m16s
feat(demo): list the demo's sign-ins on /beta and link into it per game
The public demo (demo.runicgateway.com) is live, so the site's demo slot
can be switched on. Two decisions of record, PLAN.md §15:

- D82: /beta reads the demo's GET /api/v1/public/settings demo.logins on
  the server, caches it for a minute, and lists the published sign-ins
  with the next wipe. If the demo does not answer, /beta links to its
  sign-in page instead. Gate two reads as in place.
- D83: a deep link into a game module's pages carries data-demo-game, and
  applyBrand.mjs fills it only for games in the new mounted demoGames
  list. The Rust features gain links into /rust and /rust/servers/demo.
  UO's stay hidden on a Rust demo.

The public-demo not-built entry is removed, because its resolvedBy was met.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-28 15:32:34 -05:00

57 lines
2.8 KiB
JSON

{
"$comment": [
"PLAN.md §7: the stock brand, baked into the image at /app/brand-default and always",
"complete. The bind mount at /app/brand may be empty, partial or full; every field and",
"every asset resolves against the mount first and these defaults second, per key, so an",
"empty mount produces exactly this.",
"",
"This file is also the ONLY place in the repository allowed to contain an email address",
"(D13). The org lead has no mailbox at the domain and chose to publish the existing",
"address rather than delay the beta; what makes that reversible is that moving to",
"privacy@ / security@ later is an edit to the mounted copy of this file and a container",
"restart — no rebuild, no PR. scripts/checkFacts.mjs fails the build if an address",
"appears anywhere else in the source, because the promise only survives while that",
"stays true."
],
"siteName": "Runic Gateway",
"tagline": "Put your game server on the web without putting it on the internet.",
"contactEmail": "whitlocktech@gmail.com",
"discordInvite": "https://discord.gg/t2Jav8yT4g",
"giteaOrg": "https://gitea.whitlocktech.com/RunicGateway",
"$comment_demo": [
"§15 / D12. The public demo's address, e.g. https://demo.runicgateway.com. The",
"homepage's 'See it running' slot and /features/'s per-capability affordance render only",
"when this is a non-empty URL, so the site gains a working demo by way of one line in a",
"mounted file — no rebuild, consistent with §7. /beta also reads the demo's published",
"sign-ins from it, on the next request (D82)."
],
"demoUrl": "",
"$comment_demoGames": [
"D83. The game modules the demo at demoUrl runs, by module id (\"rust\", \"uo\"). A",
"'See it running' link into a game's own pages shows only for a game listed here, so",
"a Rust demo never links to a /uo/ page it does not have. Core's links (the wiki, the",
"event calendar, news) follow demoUrl alone. Read at the next restart, like demoUrl."
],
"demoGames": [],
"$comment_beta": [
"PLAN.md §8 / D27. The Google Play closed-test opt-in URL. Empty until the track",
"exists, and /beta renders a waiting state rather than a broken link while it is.",
"",
"It is safe to publish once it is filled in, and that is the whole reason the beta can",
"work with a site that sends no email (D7): the opt-in link only works for addresses",
"already on the tester list, so anyone else who opens it is refused. Google does not",
"notify testers on the email-list path either — Discord carries the announcement.",
"",
"/beta is one of the two routes that render per request, so unlike every other field",
"here this one is read from the mounted copy on the NEXT REQUEST rather than at the",
"next restart. Paste the URL in and reload the page."
],
"betaOptInUrl": ""
}