feat(site): phase 18 - the Rust screenshots, web and app
All checks were successful
PR checks / checks (pull_request) Successful in 2m55s

Nine captures tagged rust (D65): the server list, feed, leaderboard,
live map, permissions and the RunicNPC profile editor on the web, and a
server's feed, its map and the player's Rust account in the app, from
an Android-app edge debug build.

D80: every name in a capture is a role (admin, moderator, player...),
from this phase on. D81: the Rust demo's players are mock data written
by scripts/mockRustDemo.mjs; the server, its status, map, permission
groups and RunicNPC sync state are the real Oxide test server's. The
captions and /modules/rust/ and /app/ say which part is a demo cast.

seedDemo.mjs gains --game rust (server row with a weekly wipe, public
presence for the demo, two NPC profiles, a VIP group). captureScreens.mjs
gains a click list per screen. The homepage shows the Rust live map beside
the UO capture (D76); three Rust docs pages carry their screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-10-22 22:05:06 -05:00
parent 4f38e29ad7
commit c47e9c1aa4
21 changed files with 745 additions and 29 deletions

View File

@@ -120,3 +120,11 @@ export const staffFeatures = [
'titles, map layers, event steps. None is required.',
},
];
/**
* The screenshots `/modules/rust/` shows, by id from `screens.mjs`: what players see under that
* list, and the staff screens under theirs. Each is tagged `game: 'rust'` there (D67). Captured
* in phase 18 (D65) from the Oxide rig, with stand-in players named by their role (D80).
*/
export const screens = ['rust-servers', 'rust-feed', 'rust-leaderboard', 'rust-map'];
export const staffScreens = ['admin-rust-permissions', 'admin-rust-npcs'];

View File

@@ -39,7 +39,15 @@
* deployment is branded "Runic Gateway Demo" rather than a real community's name (D43) —
* the screenshots show the platform, not somebody's private shard.
*
* Nothing here is a mock-up, and nothing here was drawn.
* None of those is a mock-up, and nothing here was drawn.
*
* The Rust captures (phase 18) are a second demo deployment, since one deployment runs one
* game module, wired to the Oxide test server over a real rust-link sidecar. The server, its
* status, its world map and markers, the permission groups its plugins hold and RunicNPC's
* sync state are that server's. Its players are not: the rig has none, so the feed, the
* leaderboard and the linked Steam account were written into the demo's database by
* `scripts/mockRustDemo.mjs`, in the module's own row shapes (D81), with every name a role
* (D80). The captions say what the screen does, never that a player did it.
*
* ---------------------------------------------------------------------------------------
* A SCREENSHOT BELONGS TO ITS GAME (D67)
@@ -69,6 +77,8 @@ export const PHONE = { width: 1440, height: 3088 };
* @property {string} route Route on the demo deployment. The capture script's only input.
* @property {boolean} admin Capture signed in as an administrator rather than anonymously.
* @property {number} [scrollY] Pixels to scroll before the shot, when the subject is below the fold.
* @property {string[]} [click] Visible text of what to click, in order, before the shot — for a
* subject behind a tab or a button the route cannot reach.
* @property {string} alt What the screen shows, for somebody who cannot see it.
* @property {string} caption The sentence printed under the figure.
* @property {'web'|'phone'} family Which geometry the file follows.
@@ -131,6 +141,57 @@ export const screens = [
family: 'web',
},
// ── Rust's public pages (PLAN.md §16 phase 18, D65) ─────────────────────────────────
//
// The second demo deployment (see WHAT IS IN THEM above): a real server, demo players.
// The demo makes who is online public, which a real community decides for itself; the
// players it would name are the demo cast. The server list's player count is the cast's
// too, written just before the shot, since the live server reports its own every 30 s.
{
id: 'rust-servers',
game: 'rust',
route: '/rust',
admin: false,
alt: 'The Rust servers page of a Runic Gateway site, with one server card: its map, world size, when it last wiped, its next wipe a week away, and six of forty players online.',
caption:
'Every server the community runs, as each last reported itself — and the next wipe, worked out from the schedule the operator set.',
family: 'web',
},
{
id: 'rust-feed',
game: 'rust',
route: '/rust/servers/rust-oxide',
admin: false,
scrollY: 268,
alt: "A Rust server's feed: players killing each other with the weapon, distance and map square, chat lines, a cargo ship docking, a raid base cleared, a guarded crate won, a Bradley destroyed and players connecting and leaving, newest first.",
caption:
'The feed: kills, chat, comings and goings and the world’s own events, as the bridge reports them. Who sees players named in it is the operator’s choice.',
family: 'web',
},
{
id: 'rust-leaderboard',
game: 'rust',
route: '/rust/servers/rust-oxide?tab=leaderboard',
admin: false,
scrollY: 520,
alt: "A Rust server's leaderboard for the current wipe, ranking eight players by kills, with deaths, NPC kills, structures built, time played, crates hacked, drops looted and treasures won.",
caption:
'The wipe’s leaderboard. Any column sorts it, and a column for an optional plugin appears only where that plugin is installed.',
family: 'web',
},
{
id: 'rust-map',
game: 'rust',
route: '/rust/servers/rust-oxide?tab=map',
admin: false,
scrollY: 470,
click: ['+'],
alt: "A Rust server's live map: the island from the game's own render under a grid, with monuments, airdrops and a PvP zone around the cargo ship marked, above the switches for each layer.",
caption:
'The live map, rendered from the running server and refreshed every ten seconds while the tab is open. Each layer has its own audience.',
family: 'web',
},
{
id: 'news',
route: '/site/news',
@@ -196,6 +257,30 @@ export const screens = [
family: 'web',
},
{
id: 'admin-rust-permissions',
game: 'rust',
route: '/admin/rust',
admin: true,
click: ['Groups', 'vip'],
alt: "The Rust permissions screen: the server's groups listed down the left, the VIP group open with its permissions filed under the plugin that registers each one, and Granted or Revoked beside every permission.",
caption:
'Every permission and group on the server, kept by the site — what was there before it, what is made here, and what is changed in the game — and pushed back after a wipe.',
family: 'web',
},
{
id: 'admin-rust-npcs',
game: 'rust',
route: '/admin/rust/npcs',
admin: true,
click: ['Edit'],
scrollY: 900,
alt: 'The RunicNPC profile editor for a guard: its names, its Kits kit, prefab and role, how far it notices players before it sleeps, and its health, damage, aim and vision.',
caption:
'A RunicNPC profile, edited on the site and pushed to every server it is for. RunicNPC checks each field the same way here, in the console and through its API.',
family: 'web',
},
// ── The Android app, against the same deployment on the same day (D26) ──────────────
//
// Captured from an emulator pointed at the demo stack through `adb reverse`, signed in as
@@ -256,6 +341,37 @@ export const screens = [
"The drawer is the deployment's own navigation, not a fixed menu — a site that renames or reorders its pages renames and reorders them here.",
family: 'phone',
},
// The app's Rust screens (phase 18), against the Rust demo, signed in as `player` (D80).
// From an `Android-app` `edge` debug build: they were not in a release when captured.
{
id: 'app-rust-server',
game: 'rust',
route: '/rust/servers/rust-oxide',
admin: false,
alt: "The app's Rust server screen: the server's map, size, last and next wipe and six players online, tabs for the feed, leaderboard, online list, map and wipes, and the feed of kills, chat and players connecting.",
caption: 'Each server in the app: the same feed as the site, with the same filters.',
family: 'phone',
},
{
id: 'app-rust-map',
game: 'rust',
route: '/rust/servers/rust-oxide?tab=map',
admin: false,
alt: "The app's live map of a Rust server: the island under a grid with monuments and world events marked, and switches for the grid, monuments and world events, site events and players.",
caption: 'The live map on a phone, refreshed every ten seconds while it is open.',
family: 'phone',
},
{
id: 'app-rust-account',
game: 'rust',
route: '/account/rust',
admin: false,
alt: "The app's Rust account screen for a signed-in player: a box for the link code the game gives, the linked Steam account, the VIP group it has on the server, its coins, and a button to open its backpack.",
caption:
'A player’s own side: link a Steam account with a code from the game, then see what it can do, its coins and its backpack on every server.',
family: 'phone',
},
];
/** One entry by id, or `undefined`. */