Who operates it
The Gameplane project maintainers run the default provider at telemetry.gameplane.net. Reports go to https://telemetry.gameplane.net/ingest. Anyone can run their own provider; this statement covers only the project's.
What is sent
-
Two tiers, about once a day, only while an admin has left them on.
+
Two tiers, about once a day. A new install sends both by default, after the first-login notice below; an admin can turn either tier off.
- Basic: exactly
version (Gameplane version), servers (number of GameServers), templates (number of GameTemplates), counted over the local cluster, when there is one, and every registered cluster the panel can reach.
- Extended (adds only the following): a random install ID (a UUID generated on the install, not derived from the cluster, host, network or users); environment, over every cluster the panel can reach: Kubernetes minor versions, distribution categories (k3s, rke2, k0s, eks, gke, aks, openshift, microk8s, minikube, kind, doks, talos or other), CPU architectures, a node-count band over all their nodes (1, 2-3, 4-10, 11-50, 51+), and whether the panel runs on a cluster or standalone; game usage: a server count for each official catalog module plus one combined
custom count; feature adoption: wake-on-connect, relay tunnel types (frp, tailscale, playit), packet capture, backups, single sign-on, audit forwarding (each yes/no), a registered-cluster band (1, 2-3, 4-10, 11+), database kind (sqlite or postgres) and UI language; the install's public signing key and the time the report was sent.
@@ -94,6 +94,7 @@ import { withBase } from "../lib/url";
- At install time: Set
--set api.telemetry.enabled=false to hard-disable telemetry whatever the switches say, with no notice shown.
- Custom provider: Set
api.telemetry.endpoint=https://your-host/ingest to send to your own provider instead and never also to the project's.
- Existing installs that never saved a choice stay off after upgrading.
+ - Upgrading: an install that had saved Send anonymous usage metrics while no destination was configured starts sending basic reports to the project's default provider. Extended stays off until an admin turns it on. To prevent this, set
api.telemetry.enabled=false before upgrading.
See the docs on platform settings, telemetry, and build info, the Helm values reference, and air-gapped installation.
diff --git a/website-export/MANIFEST.md b/website-export/MANIFEST.md
index d2aa0e4..6c9805e 100644
--- a/website-export/MANIFEST.md
+++ b/website-export/MANIFEST.md
@@ -78,3 +78,59 @@ Spec 022 (default telemetry) in the main repo: footer link, docs updates and two
- JSON: `JSON.stringify(Get(id, {depth: 30, includePathGeometry: true}))`, checked against the length and FNV-1a hash
Pencil printed, then pretty-printed (2-space indent, UTF-8, trailing newline); zero `"..."` elisions. Screenshots:
`export_nodes` at 2×.
+
+## 2026-11-11 incremental: v0.4.0 docs and marketing sync
+
+Docs, marketing and footer screens updated to the v0.4.0 release (`chore(release): v0.4.0` and `docs: correct stale v0.4.0 status`
+in the main repo). Condensed text only; v0.4.0 changes are marked "(v0.4.0)" where the screen has room.
+
+- New screens: `xA0uh` (Docs — Standalone Panel, copied from `CuW6O`, 1440x1120) and `H8zQ2X` (Docs — Languages & Translations,
+ copied from `mYDXb`, 1440x900). Breadcrumb and active-sidebar state inside the Docs Top Bar instances (`egez2`, `rGlFW`)
+ still show the source page labels; these instances were not edited.
+- New sections and items: `FKsn6` (Upgrade notes for v0.4.0, on `D4SNhN`), `SQjeX` (Translations, on `N4TBV`), `Gxcze`
+ (Orientation item 4 on `X0DeYH`), `NmHVl` (Clusters and nodes reference block on `upO5i`), `Qzd2s` and `q53ll` (table rows on
+ `eDaA6` and `a0X2rT`), `tLPlD` (FAQ item on `Znh8i`), `iFA89` (language section on `yUfLD`), `J4pkIA` (NetworkCapture row on `IEkUB`).
+- Components changed: footer `gnZrl` versionLine now reads "v0.4.0 · AGPL-3.0-or-later · Built on Kubernetes".
+- Screens with text updates: `kTRsn` `n8pnD` `Yog9e` `SKMOT` `r4WPE` `aZAEs` `kSyrZ` `zeM79` `W3y92` `ZwM1N` `EWLk2` `g8vHa`
+ `cUrQn` `a33qlt` `b5srx` `PSdPq` `z6p3NP` `s3NwF` `M3eBWD` `CuW6O` `OIN7m` `rW1Ux` `iif2F` `TESyw` `Gx9Xj` `b5u3Ui` `oX22m`
+ `p5Gci` `SmOzJ` `KvC6V` `X0DeYH` `Yemnl` `QHFdH` `IwY6K` `mu58o` `QdLzE` `opatX` `yuCG9` `yUfLD` `D4SNhN` `N4TBV` `l1vmU`
+ `deVW7` `HpLFh` `BlviB` `oi58h` `ydcNa` `qXFiI` `P5qsD` `vAYOC` `mYDXb` `gEOuV` `ivU89` `wvEgh` `IEkUB` `KFLCi` `cpCjN`
+ `o5zdzd` `eDaA6` `a0X2rT` `Znh8i` `B39hL` `hnTHJ` `JjbY2` `IGuE6` `ei1qC` `K6tq5Z`.
+- Heights changed: `xA0uh` 1120, `H8zQ2X` 900, `ZwM1N` 900, `zeM79` 1060, `W3y92` 900, `QHFdH` 1140, `yUfLD` 1000,
+ `D4SNhN` 1050, `N4TBV` 960, `B39hL` 2970 (29 game cards in 10 rows; the screen grew, so the root screens below it moved).
+- Screens reviewed with no change: `K2Rt4H` (group-level sidebar only), `wCt6V`, `s0Q7Lf`, `lRCKI`, `ZTnNa`, `ac8lF`, `o7PQv`,
+ `A2sAtw`, `Dnjfp`, `FclAt`, `FUcVx`, `BEcZK`, `Nnd3Y`, `F7wFpj`, `U8xlE8`, `rqx1v`, `e8fTgD`, `h0PWaP`, `ncP9x`, `b7zNA`
+ (diff lines do not map to visible text on the condensed screen).
+- Moved roots (review-pass restack): all 102 root `Screen/` frames at x=0 were restacked in y order with 80 px gaps. The first one
+ (`hnTHJ`, Screen/Landing Page) keeps y=268; each next root sits at previous.y + previous.height + 80. The restack removed the
+ pre-existing overlaps (`B39hL`/`tfxmL`, `ei1qC`/`vh8hz`, `vh8hz`/`JjbY2`, `HpLFh`/`b5srx`). Overlap check: none among Screen roots.
+ Top-level `y` was patched in the JSON exports of all 101 moved roots (the first root is unchanged). Several exports held stale y
+ values (for example `ei1qC` 22443 and `zeM79` 61408 versus Pencil's pre-restack 22647 and 61612), and they were overwritten.
+ `hYJwr` is not among the 102 Screen roots and was not moved; it has no JSON export.
+- PNG sweep (review pass): all 102 root `Screen/` frames and the footer `gnZrl` were re-exported at 2x into `screenshots/`
+ (every PNG is non-empty). This supersedes the earlier partial sweep described above.
+- JSON method: `JSON.stringify(Get(id, {depth: 40, includePathGeometry: true}))`, printed in full (zero `"..."` elisions), written
+ verbatim, length checked against Pencil's printed length, then formatted with `jq .`.
+- Review fixes:
+ - Docs version chips: the `changedScreens` list in the chip note holds 67 ids, not the 68 the note states. The list was not
+ reconciled against Pencil, so the count is unverified. Chips were set to "v0.4" as described in the note. Chip JSON patches
+ were made in place and are not affected by the restack beyond the top-level y.
+ - Screen fixes, docs (7 screens): `X0DeYH` (callout text matches dashboard-tour.mdx; BFP6W item left as is), `ydcNa` (callout
+ matches ownership-danger-zone.mdx), `Znh8i` (pre-v1 v0.4.0 answer wording), `b5srx` (roadmap item now reads as a backup/restore
+ drill gap; a judgment call against roadmap.mdx), `D4SNhN` (TOC gains a "v0.4.0 notes" row, a duplicate of TOC Row 4; the
+ stray first copy was deleted), `CuW6O` (first sentence of the multi-cluster.mdx callout; the "In v0.2.0-beta.8" sentence was
+ dropped, so please confirm), `QHFdH` ("The agent gateway is available since v0.3.0.").
+ - Screen fixes, marketing and changelog (3 screens): `P5qsD` (v0.3.0 changelog entry added after v0.4.0; the root grew to 1189
+ px), `HpLFh` (headers GAMEPLANE / PTERODACTYL / CUBECODERS AMP / AGONES, PUFFERPANEL removed, " [BETA]" suffix removed; the
+ multi-tenancy Gameplane cell wording still differs from comparison.mdx and was not changed), `vAYOC` (push example image path
+ now ghcr.io/gameplanepanel/...). `b5u3Ui` had no OIDC install section and was not changed.
+ - Screen fixes, landing and Docs chrome (4 screens): `hnTHJ` (install command `--version 0.4.0`), `JjbY2` (footer line
+ "v0.4.0 · AGPL-3.0-or-later · Built on Kubernetes"), `xA0uh` and `H8zQ2X` (breadcrumb labels and active sidebar item set).
+ - Screens edited in Pencil are live in the open file and need saving through the Pencil UI. Their PNGs were covered by the
+ review-pass sweep above. Nothing was committed.
+ - Last design-fix pass (2026-11-11):
+ - Sidebar on `xA0uh` (instance `qlxUA`) and `H8zQ2X` (instance `bKw0z`): the overrides on `w7U9E`, `Ammc4` and `UNTiv` already equal the `K2Rt4H` component values (`$foreground/foreground` and `$muted`). Update cannot clear a descendants map (an empty object and `null` both left it unchanged), so the overrides remain as no-ops. Screenshots of `xA0uh`, `H8zQ2X` and `CuW6O` show the same highlight state.
+ - `P5qsD` changelog: bullet `I4g7Xd` (v0.3.0) already reads "(30 at v0.3.0; Hell Let Loose was withdrawn in v0.4.0)". No change.
+ - `b5srx` roadmap: first "Known limitations" item `uJQ0g` already reads "Users page: Service accounts and Identity providers tabs are placeholders, planned for v1.1 (OIDC is managed under Admin Settings → Authentication)." No change.
+ - Nav `Qczsa`: betaBadge `Y4gJBd` already overrides the label to "Pre-v1"; no "Beta" text remains in the document. The Badge/Outline component `X4Xyl` keeps its generic "Badge" label. Screenshot shows the badge unclipped.
+ - Exports: JSON for `xA0uh`, `H8zQ2X`, `P5qsD`, `b5srx` and `Qczsa` (zero elisions, lengths checked against Pencil). PNG re-export of all 102 root `Screen/` frames and `Qczsa` at 2x into `screenshots/`.
diff --git a/website-export/json/A2sAtw.json b/website-export/json/A2sAtw.json
index 23779e3..46a5eaf 100644
--- a/website-export/json/A2sAtw.json
+++ b/website-export/json/A2sAtw.json
@@ -1 +1,943 @@
-{"type":"frame","id":"A2sAtw","x":0,"y":88768,"name":"Screen/Docs — API & Realtime Development","theme":{"semantic":"dark"},"clip":true,"width":1440,"height":900,"fill":"$background/background","children":[{"id":"rPLWm","type":"ref","ref":"K2Rt4H","height":"fill_container","name":"DocsSidebar/Expanded","width":280},{"type":"frame","id":"cs3r4","name":"Docs Main","width":"fill_container","height":"fill_container","fill":"$background/background","layout":"vertical","children":[{"id":"fCFDT","type":"ref","ref":"SOdlr","name":"Docs Top Bar","width":"fill_container","descendants":{"NImey":{"content":"Develop"},"ikbi6":{"content":"API & Realtime"}}},{"type":"frame","id":"IAsmJ","name":"Docs Article Body","clip":true,"width":"fill_container","height":"fill_container","gap":32,"padding":32,"children":[{"type":"frame","id":"Jg1dx","name":"Docs Article","width":780,"layout":"vertical","gap":14,"children":[{"type":"text","id":"C7uJdH","name":"Article Eyebrow","fill":"$accent/accent","content":"DEVELOP","fontFamily":"JetBrains Mono","fontSize":11,"fontWeight":"600","letterSpacing":0.8},{"type":"text","id":"NsLjr","name":"Article Title","fill":"$foreground/foreground","textGrowth":"fixed-width","width":"fill_container","content":"API and realtime development","lineHeight":1.1,"fontFamily":"JetBrains Mono","fontSize":30,"fontWeight":"700"},{"type":"text","id":"irtr9","name":"Article Lead","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Add REST, SSE, or WebSocket behavior while preserving authentication, scoping, audit, and agent-proxy invariants.","lineHeight":1.45,"fontFamily":"Geist","fontSize":15,"fontWeight":"normal"},{"type":"frame","id":"DDMKj","name":"Article Metadata","gap":8,"alignItems":"center","children":[{"id":"IEQYX","type":"ref","ref":"NZPtq","name":"Meta Chip 0","descendants":{"NLG8t":{"content":"DEVELOPER GUIDE"}}},{"id":"uLXEY","type":"ref","ref":"EbSsA","name":"Meta Chip 1","descendants":{"yb6zz":{"content":"v0.2"}}},{"id":"y0JNS","type":"ref","ref":"EbSsA","name":"Meta Chip 2","descendants":{"yb6zz":{"content":"18 MIN"}}}]},{"type":"frame","id":"jESit","name":"Article Callout","width":"fill_container","fill":"$accent/soft","cornerRadius":"$radius/xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","gap":10,"padding":[10,12],"alignItems":"center","children":[{"type":"icon","id":"rEdo7","name":"Article Callout Icon","width":16,"height":16,"icon":"radio-tower","library":"lucide","fill":"$accent/soft-foreground"},{"type":"text","id":"iqabn","name":"Article Callout Text","fill":"$accent/soft-foreground","textGrowth":"fixed-width","width":"fill_container","content":"A route is incomplete until permission, cluster and namespace scope, safe errors, audit, tests, and docs are defined.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"qDKh5","name":"Guide Section 1","width":"fill_container","layout":"vertical","gap":6,"children":[{"type":"text","id":"ziBVE","name":"Section Title 1","fill":"$foreground/foreground","content":"REST gateway conventions","fontFamily":"JetBrains Mono","fontSize":17,"fontWeight":"600"},{"type":"text","id":"tly2e","name":"Section Body 1","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Handlers stay close to Kubernetes resources while enforcing session, CSRF, permission, scope, and safe-error contracts.","lineHeight":1.45,"fontFamily":"Geist","fontSize":13,"fontWeight":"normal"},{"type":"frame","id":"A6Axjr","name":"Section List 1","width":"fill_container","fill":"$surface/surface","cornerRadius":"$radius/2xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":5,"padding":[8,10],"children":[{"type":"frame","id":"TRuKF","name":"Section 1 Item 0","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"S0a5Z","name":"Section 1 Item Icon 0","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"u50kf","name":"Section 1 Item Text 0","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Declare auth/RBAC, namespace, cluster, errors, and audit for every route.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"n67936","name":"Section 1 Item 1","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"Z51Alr","name":"Section 1 Item Icon 1","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"FizhH","name":"Section 1 Item Text 1","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Mutations require session credentials and CSRF.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"yH9SU","name":"Section 1 Item 2","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"BLHYT","name":"Section 1 Item Icon 2","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"lkgtX","name":"Section 1 Item Text 2","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Document external service-account behavior explicitly when available.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]}]}]},{"type":"frame","id":"jvLOC","name":"Guide Section 2","width":"fill_container","layout":"vertical","gap":6,"children":[{"type":"text","id":"S4F4BJ","name":"Section Title 2","fill":"$foreground/foreground","content":"Realtime and proxy paths","fontFamily":"JetBrains Mono","fontSize":17,"fontWeight":"600"},{"type":"text","id":"QqzUG","name":"Section Body 2","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Cluster events, console, logs, files, players, mods, status, and actions use different transports and upstreams.","lineHeight":1.45,"fontFamily":"Geist","fontSize":13,"fontWeight":"normal"},{"type":"frame","id":"o1o0x","name":"Section List 2","width":"fill_container","fill":"$surface/surface","cornerRadius":"$radius/2xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":5,"padding":[8,10],"children":[{"type":"frame","id":"BFHJw","name":"Section 2 Item 0","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"U94mhA","name":"Section 2 Item Icon 0","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"q9mQs","name":"Section 2 Item Text 0","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"/events is authenticated SSE for invalidation.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"RMHI7","name":"Section 2 Item 1","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"X0ZrLY","name":"Section 2 Item Icon 1","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"o51cc7","name":"Section 2 Item Text 1","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Console and game logs are WebSockets through the agent.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"o76S0","name":"Section 2 Item 2","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"riRcq","name":"Section 2 Item Icon 2","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"vd2nI","name":"Section 2 Item Text 2","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Pod logs come from Kubernetes and fail differently from agent streams.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]}]}]},{"type":"frame","id":"nNreg","name":"Guide Section 3","width":"fill_container","layout":"vertical","gap":6,"children":[{"type":"text","id":"x1GeE","name":"Section Title 3","fill":"$foreground/foreground","content":"Add an endpoint","fontFamily":"JetBrains Mono","fontSize":17,"fontWeight":"600"},{"type":"text","id":"ZBxl2","name":"Section Body 3","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Mount once, add permission where needed, map errors centrally, test the right layer, and update UI and reference docs together.","lineHeight":1.45,"fontFamily":"Geist","fontSize":13,"fontWeight":"normal"},{"type":"frame","id":"dv4Gt","name":"Quick Reference","width":"fill_container","fill":"$surface/tertiary","cornerRadius":"$radius/xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":3,"padding":12,"children":[{"type":"text","id":"gPq0B","name":"Quick Reference Label","fill":"$accent/accent","content":"API CHANGE","fontFamily":"JetBrains Mono","fontSize":9,"fontWeight":"600","letterSpacing":0.6},{"type":"text","id":"CaiKh","name":"Quick Reference Line 1","fill":"$foreground/foreground","content":"01 cd api && go test ./...","fontFamily":"JetBrains Mono","fontSize":11.5,"fontWeight":"normal"},{"type":"text","id":"DcR5Q","name":"Quick Reference Line 2","fill":"$foreground/foreground","content":"02 make test-integration","fontFamily":"JetBrains Mono","fontSize":11.5,"fontWeight":"normal"},{"type":"text","id":"R0dExb","name":"Quick Reference Line 3","fill":"$foreground/foreground","content":"03 rg 'Mount|/ws/|/events' api/cmd api/internal","fontFamily":"JetBrains Mono","fontSize":11.5,"fontWeight":"normal"}]}]},{"type":"frame","id":"kPxlJ","name":"Article Next Link","width":"fill_container","stroke":"$border/border","strokeWidth":{"top":1},"strokeAlignment":"inner","strokeLinejoin":"round","padding":[10,0,0,0],"justifyContent":"space_between","alignItems":"center","children":[{"type":"frame","id":"xdLtu","name":"Next Link Text","layout":"vertical","gap":2,"children":[{"type":"text","id":"xjU3H","name":"Next Link Eyebrow","fill":"$field/placeholder","content":"NEXT GUIDE","fontFamily":"Geist","fontSize":10,"fontWeight":"normal"},{"type":"text","id":"oceKE","name":"Next Link Title","fill":"$foreground/foreground","content":"Kubectl & GitOps Recipes","fontFamily":"JetBrains Mono","fontSize":13,"fontWeight":"500"}]},{"type":"icon","id":"eil64","name":"Next Link Icon","width":15,"height":15,"icon":"arrow-right","library":"lucide","fill":"$muted"}]}]},{"type":"frame","id":"m7Qyt","name":"Docs Page Aside","width":250,"layout":"vertical","gap":16,"children":[{"type":"frame","id":"tZZd1","name":"Docs Table of Contents","width":"fill_container","fill":"$surface/secondary","cornerRadius":"$radius/2xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":10,"padding":16,"children":[{"type":"text","id":"jKISY","name":"TOC Label","fill":"$field/placeholder","content":"ON THIS PAGE","fontFamily":"JetBrains Mono","fontSize":9,"fontWeight":"600","letterSpacing":0.7},{"type":"frame","id":"Zm1pW","name":"TOC Row 0","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"DS8yv","name":"TOC Icon 0","width":12,"height":12,"icon":"hash","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"QcN6C","name":"TOC Text 0","fill":"$foreground/foreground","content":"REST","fontFamily":"Geist","fontSize":12.5,"fontWeight":"500"}]},{"type":"frame","id":"cobHQ","name":"TOC Row 1","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"lPGxs","name":"TOC Icon 1","width":12,"height":12,"icon":"hash","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"x3CCO","name":"TOC Text 1","fill":"$muted","content":"Realtime","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"Kv3aq","name":"TOC Row 2","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"c8bsWD","name":"TOC Icon 2","width":12,"height":12,"icon":"hash","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"N6aIUG","name":"TOC Text 2","fill":"$muted","content":"Endpoint workflow","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"rectangle","id":"u2tfyJ","name":"TOC Divider","fill":"$border/border","width":"fill_container","height":1},{"type":"text","id":"mn7Tc","name":"Coverage Label","fill":"$field/placeholder","content":"COVERS","fontFamily":"JetBrains Mono","fontSize":9,"fontWeight":"600","letterSpacing":0.7},{"type":"frame","id":"ag7PW","name":"Coverage Row 0","width":"fill_container","gap":7,"alignItems":"center","children":[{"type":"icon","id":"giBO5","name":"Coverage Icon 0","width":12,"height":12,"icon":"book-open","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"t4CpwF","name":"Coverage Text 0","fill":"$muted","content":"REST","fontFamily":"Geist","fontSize":12,"fontWeight":"normal"}]},{"type":"frame","id":"KxnkC","name":"Coverage Row 1","width":"fill_container","gap":7,"alignItems":"center","children":[{"type":"icon","id":"pCu5g","name":"Coverage Icon 1","width":12,"height":12,"icon":"book-open","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"bMj9M","name":"Coverage Text 1","fill":"$muted","content":"SSE","fontFamily":"Geist","fontSize":12,"fontWeight":"normal"}]},{"type":"frame","id":"z45bSf","name":"Coverage Row 2","width":"fill_container","gap":7,"alignItems":"center","children":[{"type":"icon","id":"SWW58","name":"Coverage Icon 2","width":12,"height":12,"icon":"book-open","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"nfc2w","name":"Coverage Text 2","fill":"$muted","content":"WebSockets","fontFamily":"Geist","fontSize":12,"fontWeight":"normal"}]}]},{"type":"frame","id":"enFBJ","name":"Edit Page Card","width":"fill_container","fill":"$background/background","cornerRadius":"$radius/3xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":6,"padding":14,"children":[{"type":"text","id":"OdGM0","name":"Edit Page Title","fill":"$foreground/foreground","content":"Improve this page","fontFamily":"JetBrains Mono","fontSize":12,"fontWeight":"600"},{"type":"text","id":"D0SsOg","name":"Edit Page Body","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Found a gap? Open a docs issue or suggest an edit on GitHub.","lineHeight":1.4,"fontFamily":"Geist","fontSize":11.5,"fontWeight":"normal"},{"type":"frame","id":"Gz2T2","name":"Edit Page Link","gap":6,"alignItems":"center","children":[{"type":"text","id":"lLDlB","name":"Edit Page Link Text","fill":"$accent/soft-foreground","content":"Edit this page","fontFamily":"Geist","fontSize":12,"fontWeight":"500"},{"type":"icon","id":"LNe6j","name":"Edit Page Link Icon","width":12,"height":12,"icon":"external-link","library":"lucide","fill":"$accent/accent"}]}]}]}]}]}]}
+{
+ "type": "frame",
+ "id": "A2sAtw",
+ "x": 0,
+ "y": 81680,
+ "name": "Screen/Docs — API & Realtime Development",
+ "theme": {
+ "semantic": "dark"
+ },
+ "clip": true,
+ "width": 1440,
+ "height": 900,
+ "fill": "$background/background",
+ "children": [
+ {
+ "id": "rPLWm",
+ "type": "ref",
+ "ref": "K2Rt4H",
+ "height": "fill_container",
+ "name": "DocsSidebar/Expanded",
+ "width": 280
+ },
+ {
+ "type": "frame",
+ "id": "cs3r4",
+ "name": "Docs Main",
+ "width": "fill_container",
+ "height": "fill_container",
+ "fill": "$background/background",
+ "layout": "vertical",
+ "children": [
+ {
+ "id": "fCFDT",
+ "type": "ref",
+ "ref": "SOdlr",
+ "name": "Docs Top Bar",
+ "width": "fill_container",
+ "descendants": {
+ "NImey": {
+ "content": "Develop"
+ },
+ "ikbi6": {
+ "content": "API & Realtime"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "IAsmJ",
+ "name": "Docs Article Body",
+ "clip": true,
+ "width": "fill_container",
+ "height": "fill_container",
+ "gap": 32,
+ "padding": 32,
+ "children": [
+ {
+ "type": "frame",
+ "id": "Jg1dx",
+ "name": "Docs Article",
+ "width": 780,
+ "layout": "vertical",
+ "gap": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "C7uJdH",
+ "name": "Article Eyebrow",
+ "fill": "$accent/accent",
+ "content": "DEVELOP",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11,
+ "fontWeight": "600",
+ "letterSpacing": 0.8
+ },
+ {
+ "type": "text",
+ "id": "NsLjr",
+ "name": "Article Title",
+ "fill": "$foreground/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "API and realtime development",
+ "lineHeight": 1.1,
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 30,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "irtr9",
+ "name": "Article Lead",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Add REST, SSE, or WebSocket behavior while preserving authentication, scoping, audit, and agent-proxy invariants.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 15,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "DDMKj",
+ "name": "Article Metadata",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "id": "IEQYX",
+ "type": "ref",
+ "ref": "NZPtq",
+ "name": "Meta Chip 0",
+ "descendants": {
+ "NLG8t": {
+ "content": "DEVELOPER GUIDE"
+ }
+ }
+ },
+ {
+ "id": "uLXEY",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 1",
+ "descendants": {
+ "yb6zz": {
+ "content": "v0.4"
+ }
+ }
+ },
+ {
+ "id": "y0JNS",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 2",
+ "descendants": {
+ "yb6zz": {
+ "content": "18 MIN"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "jESit",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "rEdo7",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "radio-tower",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "iqabn",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "A route is incomplete until permission, cluster and namespace scope, safe errors, audit, tests, and docs are defined.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "qDKh5",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "ziBVE",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "REST gateway conventions",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "tly2e",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Handlers stay close to Kubernetes resources while enforcing session, CSRF, permission, scope, and safe-error contracts.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "A6Axjr",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "TRuKF",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "S0a5Z",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "u50kf",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Declare auth/RBAC, namespace, cluster, errors, and audit for every route.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "n67936",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Z51Alr",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "FizhH",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Mutations require session credentials and CSRF.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "yH9SU",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "BLHYT",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "lkgtX",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Document external service-account behavior explicitly when available.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "jvLOC",
+ "name": "Guide Section 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "S4F4BJ",
+ "name": "Section Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Realtime and proxy paths",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "QqzUG",
+ "name": "Section Body 2",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Cluster events, console, logs, files, players, mods, status, and actions use different transports and upstreams.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "o1o0x",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "BFHJw",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "U94mhA",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "q9mQs",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "/events is authenticated SSE for invalidation.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "RMHI7",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "X0ZrLY",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "o51cc7",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Console and game logs are WebSockets through the agent.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "o76S0",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "riRcq",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "vd2nI",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pod logs come from Kubernetes and fail differently from agent streams.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "nNreg",
+ "name": "Guide Section 3",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "x1GeE",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Add an endpoint",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "ZBxl2",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Mount once, add permission where needed, map errors centrally, test the right layer, and update UI and reference docs together.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "dv4Gt",
+ "name": "Quick Reference",
+ "width": "fill_container",
+ "fill": "$surface/tertiary",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 3,
+ "padding": 12,
+ "children": [
+ {
+ "type": "text",
+ "id": "gPq0B",
+ "name": "Quick Reference Label",
+ "fill": "$accent/accent",
+ "content": "API CHANGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.6
+ },
+ {
+ "type": "text",
+ "id": "CaiKh",
+ "name": "Quick Reference Line 1",
+ "fill": "$foreground/foreground",
+ "content": "01 cd api && go test ./...",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "DcR5Q",
+ "name": "Quick Reference Line 2",
+ "fill": "$foreground/foreground",
+ "content": "02 make test-integration",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "R0dExb",
+ "name": "Quick Reference Line 3",
+ "fill": "$foreground/foreground",
+ "content": "03 rg 'Mount|/ws/|/events' api/cmd api/internal",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "kPxlJ",
+ "name": "Article Next Link",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "padding": [
+ 10,
+ 0,
+ 0,
+ 0
+ ],
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "xdLtu",
+ "name": "Next Link Text",
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "xjU3H",
+ "name": "Next Link Eyebrow",
+ "fill": "$field/placeholder",
+ "content": "NEXT GUIDE",
+ "fontFamily": "Geist",
+ "fontSize": 10,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "oceKE",
+ "name": "Next Link Title",
+ "fill": "$foreground/foreground",
+ "content": "Kubectl & GitOps Recipes",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 13,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "icon",
+ "id": "eil64",
+ "name": "Next Link Icon",
+ "width": 15,
+ "height": 15,
+ "icon": "arrow-right",
+ "library": "lucide",
+ "fill": "$muted"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "m7Qyt",
+ "name": "Docs Page Aside",
+ "width": 250,
+ "layout": "vertical",
+ "gap": 16,
+ "children": [
+ {
+ "type": "frame",
+ "id": "tZZd1",
+ "name": "Docs Table of Contents",
+ "width": "fill_container",
+ "fill": "$surface/secondary",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 10,
+ "padding": 16,
+ "children": [
+ {
+ "type": "text",
+ "id": "jKISY",
+ "name": "TOC Label",
+ "fill": "$field/placeholder",
+ "content": "ON THIS PAGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "Zm1pW",
+ "name": "TOC Row 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "DS8yv",
+ "name": "TOC Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "QcN6C",
+ "name": "TOC Text 0",
+ "fill": "$foreground/foreground",
+ "content": "REST",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "cobHQ",
+ "name": "TOC Row 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "lPGxs",
+ "name": "TOC Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "x3CCO",
+ "name": "TOC Text 1",
+ "fill": "$muted",
+ "content": "Realtime",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Kv3aq",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "c8bsWD",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "N6aIUG",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Endpoint workflow",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "rectangle",
+ "id": "u2tfyJ",
+ "name": "TOC Divider",
+ "fill": "$border/border",
+ "width": "fill_container",
+ "height": 1
+ },
+ {
+ "type": "text",
+ "id": "mn7Tc",
+ "name": "Coverage Label",
+ "fill": "$field/placeholder",
+ "content": "COVERS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "ag7PW",
+ "name": "Coverage Row 0",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "giBO5",
+ "name": "Coverage Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "t4CpwF",
+ "name": "Coverage Text 0",
+ "fill": "$muted",
+ "content": "REST",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "KxnkC",
+ "name": "Coverage Row 1",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "pCu5g",
+ "name": "Coverage Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "bMj9M",
+ "name": "Coverage Text 1",
+ "fill": "$muted",
+ "content": "SSE",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "z45bSf",
+ "name": "Coverage Row 2",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "SWW58",
+ "name": "Coverage Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "nfc2w",
+ "name": "Coverage Text 2",
+ "fill": "$muted",
+ "content": "WebSockets",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "enFBJ",
+ "name": "Edit Page Card",
+ "width": "fill_container",
+ "fill": "$background/background",
+ "cornerRadius": "$radius/3xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 6,
+ "padding": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "OdGM0",
+ "name": "Edit Page Title",
+ "fill": "$foreground/foreground",
+ "content": "Improve this page",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 12,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "D0SsOg",
+ "name": "Edit Page Body",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Found a gap? Open a docs issue or suggest an edit on GitHub.",
+ "lineHeight": 1.4,
+ "fontFamily": "Geist",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "Gz2T2",
+ "name": "Edit Page Link",
+ "gap": 6,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "lLDlB",
+ "name": "Edit Page Link Text",
+ "fill": "$accent/soft-foreground",
+ "content": "Edit this page",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "500"
+ },
+ {
+ "type": "icon",
+ "id": "LNe6j",
+ "name": "Edit Page Link Icon",
+ "width": 12,
+ "height": 12,
+ "icon": "external-link",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/website-export/json/AKe02.json b/website-export/json/AKe02.json
index 70deefc..bb70b8d 100644
--- a/website-export/json/AKe02.json
+++ b/website-export/json/AKe02.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "AKe02",
"x": 0,
- "y": 15119,
+ "y": 14179,
"name": "Screen/Docs — Get Involved",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/B39hL.json b/website-export/json/B39hL.json
index 74bd196..82c151a 100644
--- a/website-export/json/B39hL.json
+++ b/website-export/json/B39hL.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "B39hL",
"x": 0,
- "y": 18414,
+ "y": 17234,
"name": "Screen/Games",
"theme": {
"semantic": "dark"
@@ -72,7 +72,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": 640,
- "content": "Sixteen game servers ship out of the box — and the module format is open, so more are just a template away. Fourteen more arrive in v0.3.0.",
+ "content": "Twenty-nine game servers ship out of the box — and the module format is open, so more are just a template away.",
"textAlign": "center",
"fontFamily": "$typography/font-sans",
"fontSize": 16,
@@ -90,7 +90,7 @@
"children": [
{
"type": "frame",
- "id": "kRvv9",
+ "id": "CZusV",
"name": "gameRow1",
"width": "fill_container",
"gap": 24,
@@ -147,7 +147,7 @@
"name": "versionBadge",
"descendants": {
"W2qoN": {
- "content": "2.8.1"
+ "content": "2.9.1"
}
}
}
@@ -313,7 +313,7 @@
"name": "versionBadge",
"descendants": {
"W2qoN": {
- "content": "2.2.0"
+ "content": "2.2.3"
}
}
}
@@ -343,7 +343,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "dyqcT",
+ "name": "gameRow2",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "j9nolC",
@@ -426,16 +435,7 @@
"fontWeight": "normal"
}
]
- }
- ]
- },
- {
- "type": "frame",
- "id": "tZsqv",
- "name": "gameRow2",
- "width": "fill_container",
- "gap": 24,
- "children": [
+ },
{
"type": "frame",
"id": "oCRo6",
@@ -601,7 +601,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "SXyxX",
+ "name": "gameRow3",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "H1C3g",
@@ -767,16 +776,7 @@
"fontWeight": "normal"
}
]
- }
- ]
- },
- {
- "type": "frame",
- "id": "PIPxb",
- "name": "gameRow3",
- "width": "fill_container",
- "gap": 24,
- "children": [
+ },
{
"type": "frame",
"id": "b5Lvoi",
@@ -859,7 +859,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "KHPEf",
+ "name": "gameRow4",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "fexJ5",
@@ -1113,8 +1122,8 @@
},
{
"type": "frame",
- "id": "O0g36",
- "name": "gameRow4",
+ "id": "K4XGUq",
+ "name": "gameRow5",
"width": "fill_container",
"gap": 24,
"children": [
@@ -1366,7 +1375,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "U39WPp",
+ "name": "gameRow6",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "oL1wB",
@@ -1449,1209 +1467,1119 @@
"fontWeight": "normal"
}
]
- }
- ]
- }
- ]
- },
- {
- "type": "frame",
- "id": "PRgEx",
- "name": "v030Section",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 24,
- "children": [
- {
- "type": "frame",
- "id": "dqa8W",
- "name": "v030Header",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 12,
- "alignItems": "center",
- "children": [
- {
- "type": "text",
- "id": "W91H8O",
- "name": "eyebrow",
- "fill": "$accent/accent",
- "content": "COMING IN V0.3.0",
- "textAlign": "center",
- "fontFamily": "$typography/font-mono",
- "fontSize": 12,
- "fontWeight": "600",
- "letterSpacing": 1
- },
- {
- "type": "text",
- "id": "gnAdU",
- "name": "subhead",
- "fill": "$foreground/foreground",
- "textGrowth": "fixed-width",
- "width": 700,
- "content": "Fourteen more modules land in the next release",
- "textAlign": "center",
- "fontFamily": "$typography/font-mono",
- "fontSize": 22,
- "fontWeight": "700"
},
- {
- "type": "text",
- "id": "Zsyvv",
- "name": "subtext",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": 640,
- "content": "Not yet shipped in v0.2.0-beta.8 — these templates are staged for the v0.3.0 release.",
- "textAlign": "center",
- "fontFamily": "$typography/font-sans",
- "fontSize": 16,
- "fontWeight": "normal"
- }
- ]
- },
- {
- "type": "frame",
- "id": "kdiA9",
- "name": "v030Rows",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 24,
- "children": [
{
"type": "frame",
- "id": "JT5kD",
- "name": "v030Row1",
+ "id": "mFQCA",
+ "name": "FiveM",
"width": "fill_container",
- "gap": 24,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "V4NE54",
- "name": "FiveM",
+ "id": "fZ1iv",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "O6t4QU",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "oBwLH",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "g28Ud",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "y8X9m",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "car",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "RA7iC",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "LU7R2",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "car",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "IR3An",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "FiveM",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "pK0We",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Bundled txAdmin with embedded MariaDB supervision and REST controls.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
- },
- {
- "type": "frame",
- "id": "dUBg4",
- "name": "Farming Simulator 25",
- "width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "n5QX9",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "aDi89",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "Dpn3g",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "leaf",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "FR3x9",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "id": "ZcyU4",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
}
- ]
- },
- {
- "type": "text",
- "id": "t38Ovm",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Farming Simulator 25",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "D85A4I",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Headless Wine runtime with a supervised web management portal and REST admin.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ }
}
]
},
{
- "type": "frame",
- "id": "mL1tL",
- "name": "Euro Truck Simulator 2",
- "width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "OJiha",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "r2ZUP",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "g2Qwh",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "truck",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "cUyE7",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
- }
- ]
- },
- {
- "type": "text",
- "id": "HhkiG",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Euro Truck Simulator 2",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "ZLufY",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with diagnostic idle when the server logon token is missing.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
+ "type": "text",
+ "id": "PzlIu",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "FiveM",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
},
{
- "type": "frame",
- "id": "V1sU3b",
- "name": "Mount & Blade II: Bannerlord",
+ "type": "text",
+ "id": "H4OLUO",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "WSDQM",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "vIR2r",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "BQ7ah",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "shield",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "T5dnz",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
- }
- ]
- },
- {
- "type": "text",
- "id": "HKhBv",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Mount & Blade II: Bannerlord",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "GhW0r",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with skirmish, captain, and siege match hosting.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
+ "content": "Bundled txAdmin with embedded MariaDB supervision and REST controls.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "vy09A",
- "name": "v030Row2",
+ "id": "M9a8Wr",
+ "name": "Farming Simulator 25",
"width": "fill_container",
- "gap": 24,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "Hegww",
- "name": "tModLoader",
+ "id": "q1KwT2",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "x7RiZ8",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "jhgnr",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "udDeV",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "ymSdG",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "blocks",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "q81ho",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "kV6cA",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "leaf",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "ri3n6",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "tModLoader",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "xem9r",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Modded Terraria with a .tmod mod manager and interactive PTY console.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "Cj2Fw",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
},
{
- "type": "frame",
- "id": "kcuAa",
- "name": "Team Fortress 2",
- "width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "E4ssiU",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "qcRY5",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "rQhq0",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "target",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "U0NJdQ",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
- }
- ]
- },
- {
- "type": "text",
- "id": "TW9Oz",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Team Fortress 2",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "y0O5r4",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON console with SourceMod/MetaMod addon support.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
+ "type": "text",
+ "id": "SvIuL",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Farming Simulator 25",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
},
{
- "type": "frame",
- "id": "m9Vqb",
- "name": "BeamMP",
+ "type": "text",
+ "id": "Bjt1G",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Headless Wine runtime with a supervised web management portal and REST admin.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "TEX05",
+ "name": "gameRow7",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "e8qomB",
+ "name": "Euro Truck Simulator 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "rfVmn",
+ "name": "headerRow",
+ "width": "fill_container",
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "g3oKz7",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "sm9NE",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "truck",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ },
+ {
+ "id": "zkOWY",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "id": "CZ9Vq",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Euro Truck Simulator 2",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "K561y",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with diagnostic idle when the server logon token is missing.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YVlRr",
+ "name": "Mount & Blade II: Bannerlord",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "ORcZx",
+ "name": "headerRow",
+ "width": "fill_container",
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "Wt6rQ",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "N3b4Q",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "shield",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ },
+ {
+ "id": "zpDaw",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "id": "TXEzL",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Mount & Blade II: Bannerlord",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "vXUj8",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with skirmish, captain, and siege match hosting.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "SrEDO",
+ "name": "tModLoader",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "VjAWQ",
+ "name": "headerRow",
+ "width": "fill_container",
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "L4f66",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "AyPwC",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "blocks",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ },
+ {
+ "id": "tr1i6",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.2"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "id": "r6JJ8",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "tModLoader",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "rXVHf",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Modded Terraria with a .tmod mod manager and interactive PTY console.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "LFIgR",
+ "name": "gameRow8",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "dDAR2",
+ "name": "Team Fortress 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "F8fWY3",
+ "name": "headerRow",
+ "width": "fill_container",
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "w1yXJ",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "kIxIC",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "target",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ },
+ {
+ "id": "Y17HQc",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "id": "Gm5qX",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Team Fortress 2",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "JfaHG",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON console with SourceMod/MetaMod addon support.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Ww2SH",
+ "name": "BeamMP",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "PtwZm",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "UhIkk",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "hElNU",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "zydkG",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "abnaE",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "gauge",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
+ "type": "icon",
+ "id": "HEFn9",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "gauge",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ },
+ {
+ "id": "kO5Mq",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "id": "HmzI2",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "BeamMP",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "NJQvC",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with custom vehicle/map mods and diagnostic idle.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "yFELP",
+ "name": "Left 4 Dead 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "natek",
+ "name": "headerRow",
+ "width": "fill_container",
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "QYmmj",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
{
- "id": "J8cXVt",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "RYWie",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "skull",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "OIv85",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "BeamMP",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
+ "id": "m39H7",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "id": "A7B1T",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Left 4 Dead 2",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "XM1bV",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON console with SourceMod/MetaMod addon support.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Scf1I",
+ "name": "gameRow9",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "KRLXE",
+ "name": "The Isle",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
+ {
+ "type": "frame",
+ "id": "z9VuBg",
+ "name": "headerRow",
+ "width": "fill_container",
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "AG8jt",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "V9jgC",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "paw-print",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
},
{
- "type": "text",
- "id": "Shw9W",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with custom vehicle/map mods and diagnostic idle.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "W25r5",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "S2spZ",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "The Isle",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "iwZ5P",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON administration with persistent world save management.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "u7m1wv",
+ "name": "ARK: Survival Evolved",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "ZbpFL",
- "name": "Left 4 Dead 2",
+ "id": "Z4FCkx",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "AKNlO",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "PhPcP",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "uomeu",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "jZzKB",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "skull",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "xCO1C",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "g9O5O",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "bone",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "J9QDM3",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Left 4 Dead 2",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "K5OYy",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON console with SourceMod/MetaMod addon support.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "fg4mz",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
+ },
+ {
+ "type": "text",
+ "id": "BXeRH",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "ARK: Survival Evolved",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "ApFOV",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON console with cluster travel support and persistent world state.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "yBtgS",
- "name": "v030Row3",
+ "id": "mKvV3",
+ "name": "Arma Reforger",
"width": "fill_container",
- "gap": 24,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "xJ0sk",
- "name": "The Isle",
+ "id": "DnB0c",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "LqdyK",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "FfdyT",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "KTI0D",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "M3dUu9",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "paw-print",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "asryi",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "acEnp",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "crosshair",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "d5JFLh",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "The Isle",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "qG4W6",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON administration with persistent world save management.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "mNniY",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
{
- "type": "frame",
- "id": "BXObb",
- "name": "ARK: Survival Evolved",
- "width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "RdPHm",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "ctcbu",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "U9U8cu",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "bone",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "g4lw1",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
- }
- ]
- },
- {
- "type": "text",
- "id": "e41J3",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "ARK: Survival Evolved",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "POAGI",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON console with cluster travel support and persistent world state.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
+ "type": "text",
+ "id": "TWiBo",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Arma Reforger",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
},
+ {
+ "type": "text",
+ "id": "ViAxD",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with persistent saves and Steam Workshop mod support.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "d1CWz3",
+ "name": "gameRow10",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "UowmZ",
+ "name": "Squad",
+ "width": 410,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "vJMyg",
- "name": "Arma Reforger",
+ "id": "kYUKw",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "iAeN2",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "XJY4C",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "SqIQx",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "z4B0Vk",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "crosshair",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "NXPJa",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "t1DMWr",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "users",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "nsh00",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Arma Reforger",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "t3Qll",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with persistent saves and Steam Workshop mod support.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "Idds8",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
{
- "type": "frame",
- "id": "JPwYU",
- "name": "Squad",
+ "type": "text",
+ "id": "wmUYy",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Squad",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "mpt5b",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "hs13Z",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "u8f7W",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "MzQS9",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "users",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "cyWHY",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
- }
- ]
- },
- {
- "type": "text",
- "id": "AARvn",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Squad",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "LzSlK",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source-family RCON with match rotation and Steam Workshop modding.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
+ "content": "Source-family RCON with match rotation and Steam Workshop modding.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "v1Cozl",
- "name": "v030Row4",
- "width": "fill_container",
- "gap": 24,
+ "id": "mOaY3",
+ "name": "Nuclear Option",
+ "width": 410,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "F0d3e",
- "name": "Nuclear Option",
+ "id": "oagjO",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "RMtm2",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "lpHcm",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "WqQ1A",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "UAndT",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "radiation",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "JCnUW",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "TWGFw",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "radiation",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "qEz4v",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Nuclear Option",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "ovP9X",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Remote-command console, runtime-installed via SteamCMD on first boot.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "rUIzB",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
{
- "type": "frame",
- "id": "qlQu0",
- "name": "spacer",
- "width": "fill_container",
- "height": 1
- },
- {
- "type": "frame",
- "id": "J6H0pJ",
- "name": "spacer",
- "width": "fill_container",
- "height": 1
+ "type": "text",
+ "id": "VEa20",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Nuclear Option",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
},
{
- "type": "frame",
- "id": "Li4wj",
- "name": "spacer",
+ "type": "text",
+ "id": "bzLst",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
"width": "fill_container",
- "height": 1
+ "content": "Remote-command console, runtime-installed via SteamCMD on first boot.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
}
@@ -2715,7 +2643,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Every module — including all sixteen above — is just an OCI bundle: a template.yaml describing the container, config schema, and capabilities, plus a module.yaml with metadata. If a game runs in a container and takes a config file, it can become a Gameplane module.",
+ "content": "Every module — including all twenty-nine above — is just an OCI bundle: a template.yaml describing the container, config schema, and capabilities, plus a module.yaml with metadata. If a game runs in a container and takes a config file, it can become a Gameplane module.",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
diff --git a/website-export/json/BBcwU.json b/website-export/json/BBcwU.json
index 3a7b331..cd1037b 100644
--- a/website-export/json/BBcwU.json
+++ b/website-export/json/BBcwU.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "BBcwU",
"x": 0,
- "y": 77368,
+ "y": 71780,
"name": "Screen/Docs — Mod Registry Credentials",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/BEcZK.json b/website-export/json/BEcZK.json
index 0137a74..ed0150a 100644
--- a/website-export/json/BEcZK.json
+++ b/website-export/json/BEcZK.json
@@ -2,8 +2,8 @@
"type": "frame",
"id": "BEcZK",
"x": 0,
- "y": 62548,
- "name": "Screen/Docs \u2014 High Availability",
+ "y": 58940,
+ "name": "Screen/Docs — High Availability",
"theme": {
"semantic": "dark"
},
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -940,4 +940,4 @@
]
}
]
-}
\ No newline at end of file
+}
diff --git a/website-export/json/BlviB.json b/website-export/json/BlviB.json
index 5bb7312..7050893 100644
--- a/website-export/json/BlviB.json
+++ b/website-export/json/BlviB.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "BlviB",
"x": 0,
- "y": 67108,
+ "y": 62960,
"name": "Screen/Docs — Credential Rotation",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Include OIDC, recovery users, service tokens, DB, registry, and backup.",
+ "content": "Include OIDC, recovery users, service tokens, DB, registry, backup, and standalone panel keys.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Revoke compromised material, invalidate sessions, preserve evidence, and test that recovery remains readable.",
+ "content": "Revoke compromised material, invalidate sessions (a local password reset ends an account's sessions, v0.4.0), preserve evidence, and test that recovery remains readable.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -610,7 +610,7 @@
"id": "WZi2U",
"name": "Next Link Title",
"fill": "$foreground/foreground",
- "content": "Kubernetes maintenance",
+ "content": "Languages & Translations",
"fontFamily": "JetBrains Mono",
"fontSize": 13,
"fontWeight": "500"
diff --git a/website-export/json/Bnjed.json b/website-export/json/Bnjed.json
index ba3c52c..d5d30b1 100644
--- a/website-export/json/Bnjed.json
+++ b/website-export/json/Bnjed.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Bnjed",
"x": 0,
- "y": 28460,
+ "y": 28922,
"name": "Screen/Docs — Home (Mobile)",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/CuW6O.json b/website-export/json/CuW6O.json
index 85a3a55..8f3c42d 100644
--- a/website-export/json/CuW6O.json
+++ b/website-export/json/CuW6O.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "CuW6O",
"x": 0,
- "y": 60268,
+ "y": 56600,
"name": "Screen/Docs — Multi-cluster Topology",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "One control plane and database form one operational boundary.",
+ "content": "Combined installs share one control plane and database; standalone panels run them without Kubernetes.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Promote manifests and modules through GitOps; move worlds only through verified backup and restore.",
+ "content": "Combined installs promote Cluster CRs and modules through GitOps; standalone panels keep registrations in their database. Move worlds only through verified backup and restore.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -602,7 +602,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The optional agent gateway and the unified cross-cluster dashboard described below arrive in v0.3.0. In v0.2.0-beta.8 you can register clusters and manage their resources from one dashboard, but console and log streaming is scoped to the local control-plane cluster.",
+ "content": "The optional agent gateway and the unified cross-cluster dashboard described below are available since v0.3.0.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -634,7 +634,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "One central API and login manages independent registered clusters.",
+ "content": "One central API and login manages independent clusters, combined or standalone (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -714,7 +714,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Dashboard combines resources across clusters with optional Location filter (v0.3.0)",
+ "content": "Dashboard combines resources across clusters with optional Cluster filter (v0.3.0)",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -799,7 +799,7 @@
"id": "lJ4Me",
"name": "Next Link Title",
"fill": "$foreground/foreground",
- "content": "High availability and failure domains",
+ "content": "Standalone panel",
"fontFamily": "JetBrains Mono",
"fontSize": 13,
"fontWeight": "500"
diff --git a/website-export/json/D4SNhN.json b/website-export/json/D4SNhN.json
index 46c7460..1e2524a 100644
--- a/website-export/json/D4SNhN.json
+++ b/website-export/json/D4SNhN.json
@@ -2,14 +2,14 @@
"type": "frame",
"id": "D4SNhN",
"x": 0,
- "y": 46588,
+ "y": 44490,
"name": "Screen/Docs — Upgrades & Migrations",
"theme": {
"semantic": "dark"
},
"clip": true,
"width": 1440,
- "height": 1000,
+ "height": 1050,
"fill": "$background/background",
"children": [
{
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -601,6 +601,39 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "FKsn6",
+ "name": "Guide Section v0.4.0 notes",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "ovaZH",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Upgrade notes for v0.4.0",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "CP6zr",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Breaking: admin-level grants need `*`, and probes reach only probe ports. Telemetry is on by default for new installs. Password reset ends all sessions. Full list in the CHANGELOG.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
{
"type": "frame",
"id": "w2Xb8",
@@ -850,6 +883,36 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "BEmWD",
+ "name": "TOC Row v0.4.0 notes",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "s6dx7",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "SflIS",
+ "name": "TOC Text v0.4.0 notes",
+ "fill": "$muted",
+ "content": "v0.4.0 notes",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
{
"type": "frame",
"id": "dHQHZ",
diff --git a/website-export/json/Dnjfp.json b/website-export/json/Dnjfp.json
index 36373d8..63ac59a 100644
--- a/website-export/json/Dnjfp.json
+++ b/website-export/json/Dnjfp.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Dnjfp",
"x": 0,
- "y": 85348,
+ "y": 78740,
"name": "Screen/Docs — Local Development Setup",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/EWLk2.json b/website-export/json/EWLk2.json
index c779da7..1769b17 100644
--- a/website-export/json/EWLk2.json
+++ b/website-export/json/EWLk2.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "EWLk2",
"x": 0,
- "y": 114988,
+ "y": 104320,
"name": "Screen/Docs — Notification Events & Payloads",
"theme": {
"semantic": "dark"
@@ -1509,7 +1509,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Every payload includes event, occurredAt, resource identity, cluster identity, severity, and a details object.",
+ "content": "Every payload includes event, occurredAt, resource and cluster identity, severity, and details. Webhooks add language, title, text (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/F7wFpj.json b/website-export/json/F7wFpj.json
index d398f7b..133c82c 100644
--- a/website-export/json/F7wFpj.json
+++ b/website-export/json/F7wFpj.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "F7wFpj",
"x": 0,
- "y": 68248,
+ "y": 63940,
"name": "Screen/Docs — Kubernetes Maintenance",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/FUcVx.json b/website-export/json/FUcVx.json
index 4d32d95..332cf98 100644
--- a/website-export/json/FUcVx.json
+++ b/website-export/json/FUcVx.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "FUcVx",
"x": 0,
- "y": 64828,
+ "y": 61000,
"name": "Screen/Docs — Uninstall & Decommission",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/FclAt.json b/website-export/json/FclAt.json
index 155767f..bdb66bd 100644
--- a/website-export/json/FclAt.json
+++ b/website-export/json/FclAt.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "FclAt",
"x": 0,
- "y": 75088,
+ "y": 69820,
"name": "Screen/Docs — Backup Destinations",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/Gx9Xj.json b/website-export/json/Gx9Xj.json
index a5b064a..ed2ec68 100644
--- a/website-export/json/Gx9Xj.json
+++ b/website-export/json/Gx9Xj.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Gx9Xj",
"x": 0,
- "y": 31768,
+ "y": 31750,
"name": "Screen/Docs — Create a Server",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -403,7 +403,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use equal CPU and memory requests/limits for Guaranteed QoS.",
+ "content": "Equal CPU and memory requests/limits give Guaranteed QoS; reserve less for Burstable (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/H8zQ2X.json b/website-export/json/H8zQ2X.json
new file mode 100644
index 0000000..171dde8
--- /dev/null
+++ b/website-export/json/H8zQ2X.json
@@ -0,0 +1,951 @@
+{
+ "type": "frame",
+ "id": "H8zQ2X",
+ "x": 0,
+ "y": 112357,
+ "name": "Screen/Docs — Languages & Translations",
+ "theme": {
+ "semantic": "dark"
+ },
+ "clip": true,
+ "width": 1440,
+ "height": 900,
+ "fill": "$background/background",
+ "children": [
+ {
+ "id": "bKw0z",
+ "type": "ref",
+ "ref": "K2Rt4H",
+ "height": "fill_container",
+ "name": "DocsSidebar/Expanded",
+ "width": 280,
+ "descendants": {
+ "w7U9E": {
+ "fill": "$foreground/foreground"
+ },
+ "UNTiv": {
+ "fill": "$muted"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "eqeRz",
+ "name": "Docs Main",
+ "width": "fill_container",
+ "height": "fill_container",
+ "fill": "$background/background",
+ "layout": "vertical",
+ "children": [
+ {
+ "id": "rGlFW",
+ "type": "ref",
+ "ref": "SOdlr",
+ "name": "Docs Top Bar",
+ "width": "fill_container",
+ "descendants": {
+ "NImey": {
+ "content": "Platform"
+ },
+ "ikbi6": {
+ "content": "Languages & Translations"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "iYmXB",
+ "name": "Docs Article Body",
+ "clip": true,
+ "width": "fill_container",
+ "height": "fill_container",
+ "gap": 32,
+ "padding": 32,
+ "children": [
+ {
+ "type": "frame",
+ "id": "rUnsZ",
+ "name": "Docs Article",
+ "width": 780,
+ "layout": "vertical",
+ "gap": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "zRDJo",
+ "name": "Article Eyebrow",
+ "fill": "$accent/accent",
+ "content": "ACCESS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11,
+ "fontWeight": "600",
+ "letterSpacing": 0.8
+ },
+ {
+ "type": "text",
+ "id": "a3RCgy",
+ "name": "Article Title",
+ "fill": "$foreground/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Languages & Translations",
+ "lineHeight": 1.1,
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 30,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "vL5jn",
+ "name": "Article Lead",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pick a dashboard language, set the instance default, and translate Gameplane or module text.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 15,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "iXDMF",
+ "name": "Article Metadata",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "id": "St1wV",
+ "type": "ref",
+ "ref": "NZPtq",
+ "name": "Meta Chip 0",
+ "descendants": {
+ "NLG8t": {
+ "content": "ADMIN GUIDE"
+ }
+ }
+ },
+ {
+ "id": "AU6GT",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 1",
+ "descendants": {
+ "yb6zz": {
+ "content": "v0.4"
+ }
+ }
+ },
+ {
+ "id": "F2zc0E",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 2",
+ "descendants": {
+ "yb6zz": {
+ "content": "8 MIN"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "mfCzY",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "QCGap",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "users-round",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "HTjNt",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Only languages at 80% translated appear in the picker. Missing messages show in English.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "JDjJ3",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "q5o7Z",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Choose your language",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "B4KF6",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pick the dashboard language on Theme & Appearance. Signed-in choices follow you across devices.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "IYwBK",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "E7CIr",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "EH7NL",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "UVCtw",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Saved to your account when signed in; Automatic clears it.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "RDKZo",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "RC0nr",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "C9AxK",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Signed-out pages save the choice to that browser only.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "bvaY7",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "jJns6",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "ZbHJ4",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Dates, numbers and relative times follow the active language.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "gQgWS",
+ "name": "Guide Section 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "twApc",
+ "name": "Section Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Admins set the defaults",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "z6awsN",
+ "name": "Section Body 2",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Set the instance default, then a language for each notification destination.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "oyjWo",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "jhZCE",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "QLEQV",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "ZHmUO",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Instance default: Language card in Admin Settings, starts as English.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "CVu1B",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "M4Sal",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Lrz5P",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Notification language: Discord, email and webhook destinations.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "t93Mym",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "eIOX4",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "LA70U",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Telemetry: the extended usage report includes the UI language.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "DZ7n6",
+ "name": "Guide Section 3",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "lW7l3",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Translate and check packs",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "nKgOp",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Each language is a folder under i18n/locales with app.json and meta.json.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "BZJoW",
+ "name": "Quick Reference",
+ "width": "fill_container",
+ "fill": "$surface/tertiary",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 3,
+ "padding": 12,
+ "children": [
+ {
+ "type": "text",
+ "id": "oLLpC",
+ "name": "Quick Reference Label",
+ "fill": "$accent/accent",
+ "content": "LANGUAGES",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.6
+ },
+ {
+ "type": "text",
+ "id": "UOznm",
+ "name": "Quick Reference Line 1",
+ "fill": "$foreground/foreground",
+ "content": "01 Choice: account → browser → instance default → English",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "SQDhd",
+ "name": "Quick Reference Line 2",
+ "fill": "$foreground/foreground",
+ "content": "02 Listed in the picker at 80% translated",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "fO1Y2",
+ "name": "Quick Reference Line 3",
+ "fill": "$foreground/foreground",
+ "content": "03 Check packs with go run ./cmd/i18n-check locales",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "roWiP",
+ "name": "Article Next Link",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "padding": [
+ 10,
+ 0,
+ 0,
+ 0
+ ],
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "hPw6R",
+ "name": "Next Link Text",
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "Ag63g",
+ "name": "Next Link Eyebrow",
+ "fill": "$field/placeholder",
+ "content": "NEXT GUIDE",
+ "fontFamily": "Geist",
+ "fontSize": 10,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "KXxvn",
+ "name": "Next Link Title",
+ "fill": "$foreground/foreground",
+ "content": "Audit & Observability",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 13,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "icon",
+ "id": "d9c1sW",
+ "name": "Next Link Icon",
+ "width": 15,
+ "height": 15,
+ "icon": "arrow-right",
+ "library": "lucide",
+ "fill": "$muted"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "V3WYf",
+ "name": "Docs Page Aside",
+ "width": 250,
+ "layout": "vertical",
+ "gap": 16,
+ "children": [
+ {
+ "type": "frame",
+ "id": "Z7aolI",
+ "name": "Docs Table of Contents",
+ "width": "fill_container",
+ "fill": "$surface/secondary",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 10,
+ "padding": 16,
+ "children": [
+ {
+ "type": "text",
+ "id": "nWF0J",
+ "name": "TOC Label",
+ "fill": "$field/placeholder",
+ "content": "ON THIS PAGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "hOxj7",
+ "name": "TOC Row 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "CyTpc",
+ "name": "TOC Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Y55Skm",
+ "name": "TOC Text 0",
+ "fill": "$foreground/foreground",
+ "content": "Choose",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "T3ld1",
+ "name": "TOC Row 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Z6wd0",
+ "name": "TOC Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "Pbgkd",
+ "name": "TOC Text 1",
+ "fill": "$muted",
+ "content": "Defaults",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "RgQua",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "T5odSB",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "gp0MB",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Translate",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "rectangle",
+ "id": "oYOpW",
+ "name": "TOC Divider",
+ "fill": "$border/border",
+ "width": "fill_container",
+ "height": 1
+ },
+ {
+ "type": "text",
+ "id": "OAPLN",
+ "name": "Coverage Label",
+ "fill": "$field/placeholder",
+ "content": "COVERS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "gOyM1",
+ "name": "Coverage Row 0",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "QSoNy",
+ "name": "Coverage Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "P5YpR",
+ "name": "Coverage Text 0",
+ "fill": "$muted",
+ "content": "Languages",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "mhIIt",
+ "name": "Coverage Row 1",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Alxec",
+ "name": "Coverage Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "Q7UHa",
+ "name": "Coverage Text 1",
+ "fill": "$muted",
+ "content": "Translations",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "wXbBj",
+ "name": "Coverage Row 2",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "L7lmf",
+ "name": "Coverage Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "dfJx1",
+ "name": "Coverage Text 2",
+ "fill": "$muted",
+ "content": "Locales",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "OaS2L",
+ "name": "Edit Page Card",
+ "width": "fill_container",
+ "fill": "$background/background",
+ "cornerRadius": "$radius/3xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 6,
+ "padding": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "nI25o",
+ "name": "Edit Page Title",
+ "fill": "$foreground/foreground",
+ "content": "Improve this page",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 12,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "HC2An",
+ "name": "Edit Page Body",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Found a gap? Open a docs issue or suggest an edit on GitHub.",
+ "lineHeight": 1.4,
+ "fontFamily": "Geist",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "Eklxu",
+ "name": "Edit Page Link",
+ "gap": 6,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "AcCo4",
+ "name": "Edit Page Link Text",
+ "fill": "$accent/soft-foreground",
+ "content": "Edit this page",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "500"
+ },
+ {
+ "type": "icon",
+ "id": "Uio0s",
+ "name": "Edit Page Link Icon",
+ "width": 12,
+ "height": 12,
+ "icon": "external-link",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/website-export/json/HpLFh.json b/website-export/json/HpLFh.json
index 1c584a9..b824680 100644
--- a/website-export/json/HpLFh.json
+++ b/website-export/json/HpLFh.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "HpLFh",
"x": 0,
- "y": 10559,
+ "y": 9590,
"name": "Screen/Docs — Comparison",
"theme": {
"semantic": "dark"
@@ -135,7 +135,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "AMP",
+ "content": "PTERODACTYL",
"fontFamily": "$typography/font-mono",
"fontSize": 10,
"fontWeight": "600",
@@ -147,7 +147,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "PTERODACTYL",
+ "content": "CUBECODERS AMP",
"fontFamily": "$typography/font-mono",
"fontSize": 10,
"fontWeight": "600",
@@ -159,7 +159,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "PUFFERPANEL",
+ "content": "AGONES",
"fontFamily": "$typography/font-mono",
"fontSize": 10,
"fontWeight": "600",
@@ -202,7 +202,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Kubernetes-native CRDs and controller-runtime operator; scales from k3s homelab to multi-node clusters. [BETA]",
+ "content": "Kubernetes-native CRDs and controller-runtime operator; scales from k3s homelab to multi-node clusters.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -597,7 +597,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 30 ready-to-use templates on master (16 in v0.2.0-beta.8; the other 14 arrive in v0.3.0).",
+ "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 29 ready-to-use templates in v0.4.0 (16 in v0.2.0-beta.8; 14 added in v0.3.0; Hell Let Loose withdrawn in v0.4.0).",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -676,7 +676,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Cluster CRD for remote registration and health checks; in v0.2.0-beta.8 console/log streaming is local-cluster only. From v0.3.0: remote Pod logs/PTY, optional private gateway, and unified dashboard with location filters.",
+ "content": "Cluster CRD for remote registration and health checks; local-only streaming in v0.2.0-beta.8, then remote Pod logs/PTY, private gateway and unified dashboard from v0.3.0. From v0.4.0: a central panel runs without a local cluster; a Nodes page lists all clusters.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
diff --git a/website-export/json/IEkUB.json b/website-export/json/IEkUB.json
index 78e82c6..90de592 100644
--- a/website-export/json/IEkUB.json
+++ b/website-export/json/IEkUB.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "IEkUB",
"x": 0,
- "y": 107008,
+ "y": 97460,
"name": "Screen/Docs — CRD Catalog",
"theme": {
"semantic": "dark"
@@ -841,6 +841,127 @@
]
}
]
+ },
+ {
+ "type": "frame",
+ "id": "J4pkIA",
+ "name": "Reference 1 Row 4 NetworkCapture",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$background/background",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "bG5mL",
+ "name": "Reference 1 Row 4 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "RF0am",
+ "name": "Reference 1 Row 4 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "NetworkCapture",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YoNvz",
+ "name": "Reference 1 Row 4 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "zbCJv",
+ "name": "Reference 1 Row 4 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Namespaced",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "X94Vm",
+ "name": "Reference 1 Row 4 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "ahBE9",
+ "name": "Reference 1 Row 4 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "cap",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "xn2Xt",
+ "name": "Reference 1 Row 4 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "O5CZ1f",
+ "name": "Reference 1 Row 4 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Packet-capture record for a server (v0.3.0).",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/website-export/json/IGuE6.json b/website-export/json/IGuE6.json
index 38918fd..07c850c 100644
--- a/website-export/json/IGuE6.json
+++ b/website-export/json/IGuE6.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "IGuE6",
"x": 0,
- "y": 16259,
+ "y": 15159,
"name": "Screen/Features",
"theme": {
"semantic": "dark"
@@ -139,7 +139,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Eight purpose-built Custom Resource Definitions — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, and ModuleSource — are reconciled by a single controller-runtime operator. Whether you create a server through the dashboard or with kubectl apply, the outcome is identical: the operator is the single source of truth.",
+ "content": "Nine purpose-built Custom Resource Definitions — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, ModuleSource, and NetworkCapture — are reconciled by a single controller-runtime operator. Whether you create a server through the dashboard or with kubectl apply, the outcome is identical: the operator is the single source of truth.",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -200,7 +200,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The exact same CRDs, controllers, and Helm chart that run on a single-node k3s homelab also run on a multi-node production cluster. There's no separate 'production mode' to migrate to — StatefulSets, PVCs, and rolling upgrades from day one.",
+ "content": "The exact same CRDs, controllers, and Helm chart that run on a single-node k3s homelab also run on a multi-node production cluster. There's no separate 'production mode' to migrate to — StatefulSets, PVCs, and rolling upgrades from day one. The dashboard and API can also run standalone on Docker Compose; games still need a registered cluster. (v0.4.0)",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -383,7 +383,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Scheduled or on-demand snapshots are pushed to any S3-compatible storage backend using restic, giving you deduplicated, encrypted, incremental backups. Restoring is a single click from the dashboard's Backups tab.",
+ "content": "Scheduled or on-demand snapshots are pushed to any S3-compatible storage backend using restic, giving you deduplicated, encrypted, incremental backups. Restoring is a single click from the dashboard's Backups tab. A stopped server with several data volumes can be recovered from its restic backups. (v0.4.0)",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -444,7 +444,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Sixteen games ship out of the box, and the open template format supports any game with a config file and a start command.",
+ "content": "Twenty-nine games ship out of the box, and the open template format supports any game with a config file and a start command.",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -505,7 +505,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Authenticate with local accounts or federate through OIDC — Keycloak, Google, or GitHub. Three built-in roles (admin, operator, viewer) scope access per namespace, so a shared cluster can host multiple teams safely.",
+ "content": "Authenticate with local accounts or federate through OIDC — Keycloak, Authentik, Google, Okta, or Entra ID. Three built-in roles (admin, operator, viewer) scope access per namespace, so a shared cluster can host multiple teams safely. Only full administrators can grant admin-level permissions. (v0.4.0)",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
diff --git a/website-export/json/IwY6K.json b/website-export/json/IwY6K.json
index be0f4bf..1e474f2 100644
--- a/website-export/json/IwY6K.json
+++ b/website-export/json/IwY6K.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "IwY6K",
"x": 0,
- "y": 96748,
+ "y": 88540,
"name": "Screen/Docs — Extension Services",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -287,7 +287,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "telemetry-receiver accepts the opt-in product telemetry path.",
+ "content": "telemetry-receiver accepts anonymous daily usage reports in a basic and an extended tier.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/JjbY2.json b/website-export/json/JjbY2.json
index 7ed0a35..ab0b6aa 100644
--- a/website-export/json/JjbY2.json
+++ b/website-export/json/JjbY2.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "JjbY2",
"x": 0,
- "y": 25482,
+ "y": 26095,
"name": "Screen/Landing Page (Mobile)",
"theme": {
"semantic": "dark"
@@ -97,7 +97,7 @@
"ref": "X4Xyl",
"descendants": {
"W2qoN": {
- "content": "v0.2.0-beta.8 — actively developed"
+ "content": "v0.4.0"
}
}
},
@@ -293,7 +293,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Seven CRDs reconciled by one operator. kubectl and the dashboard always agree.",
+ "content": "Nine CRDs reconciled by one operator. kubectl and the dashboard always agree.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -857,7 +857,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": " oci://ghcr.io/valgulnecron/",
+ "content": " oci://ghcr.io/gameplanepanel/",
"fontFamily": "$typography/font-mono",
"fontSize": 11,
"fontWeight": "normal"
@@ -1080,7 +1080,7 @@
"type": "text",
"id": "BAypr",
"fill": "$muted",
- "content": "v0.2.0-beta.8 · AGPL-3.0-or-later",
+ "content": "v0.4.0 · AGPL-3.0-or-later · Built on Kubernetes",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
diff --git a/website-export/json/K6tq5Z.json b/website-export/json/K6tq5Z.json
index b1cc966..8ced8f0 100644
--- a/website-export/json/K6tq5Z.json
+++ b/website-export/json/K6tq5Z.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "K6tq5Z",
"x": 0,
- "y": 120468,
+ "y": 109460,
"name": "Screen/Telemetry Statement",
"theme": {
"semantic": "dark"
@@ -72,7 +72,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": 760,
- "content": "Last updated 2026-10-07.",
+ "content": "Last updated 2026-11-10.",
"textAlign": "center",
"fontFamily": "$typography/font-sans",
"fontSize": 16,
@@ -146,7 +146,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Two tiers, about once a day, only while an admin leaves them on.",
+ "content": "Two tiers, about once a day. New installs send both by default, after the first-login notice; an admin can turn either off. Upgraded installs that saved basic on with no destination start sending basic reports to the project default.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/KFLCi.json b/website-export/json/KFLCi.json
index 8aa4116..9c8c64c 100644
--- a/website-export/json/KFLCi.json
+++ b/website-export/json/KFLCi.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "KFLCi",
"x": 0,
- "y": 7139,
+ "y": 6590,
"name": "Screen/Docs — Security",
"theme": {
"semantic": "dark"
@@ -169,7 +169,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Permission-based RBAC with admin/operator/viewer roles, scoped per namespace or cluster-wide. Registering a cluster grants no user access by itself: remote access uses supplemental per-cluster grants, and a global union of permission names never authorizes a row in another cluster.",
+ "content": "Permission-based RBAC with admin/operator/viewer roles, scoped per namespace or cluster-wide. Registering a cluster grants no user access by itself, and a global permission union never authorizes another cluster's rows. Admin permissions can be granted only by a `*` holder (v0.4.0).",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
diff --git a/website-export/json/KvC6V.json b/website-export/json/KvC6V.json
index a554de5..1d51a37 100644
--- a/website-export/json/KvC6V.json
+++ b/website-export/json/KvC6V.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "KvC6V",
"x": 0,
- "y": 32908,
+ "y": 32730,
"name": "Screen/Docs — Server Operations",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Treat transfers and destructive actions as audited workflows with a recovery path.",
+ "content": "Treat transfers and destructive actions as audited workflows with a recovery path. Wipes, backups and restores of one server never overlap (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/M3eBWD.json b/website-export/json/M3eBWD.json
index e72cb48..5c2cf75 100644
--- a/website-export/json/M3eBWD.json
+++ b/website-export/json/M3eBWD.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "M3eBWD",
"x": 0,
- "y": 35188,
+ "y": 34690,
"name": "Screen/Docs — Files, Players & Mods",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -403,7 +403,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Confirm player identity before applying whitelist or ban changes.",
+ "content": "Confirm identity before whitelist or ban changes; Steam names show with a Steam key (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/N4TBV.json b/website-export/json/N4TBV.json
index a5f7f69..0e59fb1 100644
--- a/website-export/json/N4TBV.json
+++ b/website-export/json/N4TBV.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "N4TBV",
"x": 0,
- "y": 9419,
+ "y": 8550,
"name": "Screen/Docs — Contributing",
"theme": {
"semantic": "dark"
@@ -260,6 +260,37 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "SQjeX",
+ "name": "Translations section",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "xsjAd",
+ "fill": "$foreground/foreground",
+ "content": "Translations",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 18,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "HaW1z",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Language packs live in i18n/locales/
/ and need no code changes. A language appears in the picker once 80% of its messages are translated.",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 14,
+ "fontWeight": "normal"
+ }
+ ]
+ },
{
"type": "frame",
"id": "ceKhm",
diff --git a/website-export/json/Nnd3Y.json b/website-export/json/Nnd3Y.json
index b0025a5..c4f0dad 100644
--- a/website-export/json/Nnd3Y.json
+++ b/website-export/json/Nnd3Y.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Nnd3Y",
"x": 0,
- "y": 56848,
+ "y": 53660,
"name": "Screen/Docs — Production Installation",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/OIN7m.json b/website-export/json/OIN7m.json
index 243e793..0be6917 100644
--- a/website-export/json/OIN7m.json
+++ b/website-export/json/OIN7m.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "OIN7m",
"x": 0,
- "y": 5999,
+ "y": 5510,
"name": "Screen/Docs — Architecture",
"theme": {
"semantic": "dark"
@@ -570,7 +570,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "ModuleSource CRs declare where templates come from — OCI registry, git, HTTP, local, or dashboard upload.",
+ "content": "ModuleSource CRs declare where templates come from — OCI registry, git, HTTP, local, or dashboard upload. Standalone panels need a registered cluster for module operations.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -601,7 +601,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "One central API and dashboard can manage independent clusters registered as Cluster resources. Each target cluster runs its own operator, and optionally a private gateway built from the API image. The gateway has no database, no user login and no browser or admin routes. Users authenticate only to the central API, which stays the authorization authority.",
+ "content": "One central API and dashboard can manage independent clusters, registered as Cluster resources or, in a standalone panel, in its database. Each target cluster runs its own operator, and optionally a private gateway built from the API image. The gateway has no database, no user login and no browser or admin routes. Users authenticate only to the central API, which stays the authorization authority.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
diff --git a/website-export/json/P5qsD.json b/website-export/json/P5qsD.json
index 870fa22..cef7a78 100644
--- a/website-export/json/P5qsD.json
+++ b/website-export/json/P5qsD.json
@@ -2,21 +2,21 @@
"type": "frame",
"id": "P5qsD",
"x": 0,
- "y": 13979,
+ "y": 12910,
"name": "Screen/Docs — Changelog",
"theme": {
"semantic": "dark"
},
"clip": true,
"width": 1440,
- "height": 1085,
+ "height": 1189,
"fill": "$background/background",
"children": [
{
"id": "sPZ1k",
"type": "ref",
"ref": "K2Rt4H",
- "height": "fill_container",
+ "height": 1189,
"name": "DocsSidebar/Expanded",
"width": 280
},
@@ -118,7 +118,7 @@
"type": "text",
"id": "qM6nJ",
"fill": "$accent/accent",
- "content": "Unreleased",
+ "content": "v0.4.0",
"fontFamily": "$typography/font-mono",
"fontSize": 15,
"fontWeight": "700"
@@ -127,7 +127,7 @@
"type": "text",
"id": "uWOXK",
"fill": "$muted",
- "content": "in development",
+ "content": "2026-11-10",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
@@ -140,7 +140,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Multicluster gateways, theme customization, PostgreSQL support, network capture, module authoring, 14 new game modules.",
+ "content": "Standalone central panel, French translations, extended telemetry tier, credential maintenance, fleet-wide node inventory, Steam display names, security hardening, and upgrade notes.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -148,6 +148,100 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "y3i1S",
+ "name": "v0.3.0",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "bottom": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "gap": 24,
+ "padding": [
+ 16,
+ 0
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "nkHDr",
+ "width": 150,
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "hHFHv",
+ "fill": "$foreground/foreground",
+ "content": "v0.3.0",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 15,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "x79yu",
+ "fill": "$muted",
+ "content": "2026-10-05",
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "fkA3g",
+ "name": "Bullets",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "kMyyz",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Multicluster gateways: an optional private mTLS gateway manages game servers across independent clusters.",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "lLha3",
+ "name": "Bullet",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Network capture, the gp-module authoring toolkit, PostgreSQL end-to-end support and user theme customization.",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "I4g7Xd",
+ "name": "Bullet",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "REST and CLI console protocols, Helm-seeded OIDC role mappings and 14 new game modules (30 at v0.3.0; Hell Let Loose was withdrawn in v0.4.0).",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
{
"type": "frame",
"id": "d4v1q0",
diff --git a/website-export/json/PSdPq.json b/website-export/json/PSdPq.json
index c02a3a4..4fc9e4e 100644
--- a/website-export/json/PSdPq.json
+++ b/website-export/json/PSdPq.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "PSdPq",
"x": 0,
- "y": 39748,
+ "y": 38610,
"name": "Screen/Docs — Cluster & Storage",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -287,7 +287,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Reserve headroom for the operator, agents, ingress, and backup jobs.",
+ "content": "Reserve headroom for the operator, agents, ingress, and backup jobs; v0.4.0 adds requests for auxiliary pods.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use scheduler defaults first, then add affinity, tolerations, GPU selectors, or pinning only for a clear constraint.",
+ "content": "Use scheduler defaults first; v0.4.0 adds chart placement keys for management pods. Add affinity or pinning only for a clear constraint.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/QHFdH.json b/website-export/json/QHFdH.json
index 13732e6..e0e1678 100644
--- a/website-export/json/QHFdH.json
+++ b/website-export/json/QHFdH.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "QHFdH",
"x": 0,
- "y": 118088,
+ "y": 107260,
"name": "Screen/Docs — Remote Agent Gateway",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -175,7 +175,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The gateway ships in v0.3.0 and is not available in v0.2.0-beta.8.",
+ "content": "The agent gateway is available since v0.3.0.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -544,7 +544,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Create a credential Secret in the central API namespace, then add the gateway reference to the existing Cluster resource with URL and tlsSecretRef.",
+ "content": "Combined installs: create a labeled credential Secret in the central API namespace and add the gateway reference to the Cluster resource. Standalone panels: PUT /clusters//gateway.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -692,7 +692,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Confirm the gateway Pod is Ready, the Cluster resource shows Healthy, and test console, file manager and players on a test server.",
+ "content": "Confirm the gateway Pod is Ready, the cluster reports healthy, and test console, file manager and players on a test server.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -748,7 +748,7 @@
"id": "Rzlo6",
"name": "Quick Reference Line 3",
"fill": "$foreground/foreground",
- "content": "03 Central: labeled credential Secret + Cluster spec.agentGateway",
+ "content": "03 Central: labeled Secret + Cluster agentGateway, or panel API",
"fontFamily": "JetBrains Mono",
"fontSize": 11.5,
"fontWeight": "normal"
diff --git a/website-export/json/Qczsa.json b/website-export/json/Qczsa.json
index 3b4db86..c5eb37b 100644
--- a/website-export/json/Qczsa.json
+++ b/website-export/json/Qczsa.json
@@ -38,7 +38,7 @@
"type": "image",
"enabled": true,
"url": "design-assets/gameplane-icon.png",
- "mode": "fill"
+ "mode": "cover"
},
"cornerRadius": "$radius/md",
"justifyContent": "center",
@@ -61,7 +61,7 @@
"name": "betaBadge",
"descendants": {
"W2qoN": {
- "content": "Beta"
+ "content": "Pre-v1"
}
}
}
diff --git a/website-export/json/QdLzE.json b/website-export/json/QdLzE.json
index a3ec916..dbdaaca 100644
--- a/website-export/json/QdLzE.json
+++ b/website-export/json/QdLzE.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "QdLzE",
"x": 0,
- "y": 38608,
+ "y": 37630,
"name": "Screen/Docs — Backups & Recovery",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Balance keep-last, hourly, daily, weekly, monthly, and yearly retention.",
+ "content": "Trim Backup resources by retention; repository storage is not reclaimed automatically.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Restore into a new server for verification, or overwrite only after stopping writes and confirming ownership.",
+ "content": "Restore into a new server for verification, or overwrite only after stopping writes. All-data captures check volume layout first.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/SKMOT.json b/website-export/json/SKMOT.json
index 479511b..cb9dea7 100644
--- a/website-export/json/SKMOT.json
+++ b/website-export/json/SKMOT.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "SKMOT",
"x": 0,
- "y": 42028,
+ "y": 40570,
"name": "Screen/Docs — Audit, Observability & Admin",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -467,7 +467,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Document telemetry settings and privacy expectations for operators.",
+ "content": "Telemetry is on by default for new installs (v0.4.0); each tier can be turned off in Admin Settings.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/SmOzJ.json b/website-export/json/SmOzJ.json
index 527e509..6c97ffe 100644
--- a/website-export/json/SmOzJ.json
+++ b/website-export/json/SmOzJ.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "SmOzJ",
"x": 0,
- "y": 43168,
+ "y": 41550,
"name": "Screen/Docs — Modules & Sources",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Package metadata, templates, assets, and compatibility as versioned OCI content with a reproducible release process.",
+ "content": "Package metadata, templates, assets, and compatibility as versioned OCI content. gp-module also runs i18n extract and i18n stamp (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/TESyw.json b/website-export/json/TESyw.json
index 8740919..1cd291f 100644
--- a/website-export/json/TESyw.json
+++ b/website-export/json/TESyw.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "TESyw",
"x": 0,
- "y": 54568,
+ "y": 51700,
"name": "Screen/Docs — File Manager",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -287,7 +287,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use the editor only for supported text content.",
+ "content": "Use the editor only for supported text content; only regular files open or download (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Include the correct extension and avoid accidental replacement.",
+ "content": "Include the extension; new files never overwrite an existing name (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/U8xlE8.json b/website-export/json/U8xlE8.json
index 495976f..a7b11ed 100644
--- a/website-export/json/U8xlE8.json
+++ b/website-export/json/U8xlE8.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "U8xlE8",
"x": 0,
- "y": 63688,
+ "y": 60020,
"name": "Screen/Docs — Executable Upgrades & Rollback",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/VgF1s.json b/website-export/json/VgF1s.json
index d91ba46..6f734cb 100644
--- a/website-export/json/VgF1s.json
+++ b/website-export/json/VgF1s.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "VgF1s",
"x": 0,
- "y": 105868,
+ "y": 96380,
"name": "Screen/Docs — WebSocket & Event Streams",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/VtYGz.json b/website-export/json/VtYGz.json
index 472b84d..0e722c9 100644
--- a/website-export/json/VtYGz.json
+++ b/website-export/json/VtYGz.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "VtYGz",
"x": 0,
- "y": 34048,
+ "y": 33710,
"name": "Screen/Docs — Console, Events & Logs",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/W3y92.json b/website-export/json/W3y92.json
index 0fe816a..f3d8188 100644
--- a/website-export/json/W3y92.json
+++ b/website-export/json/W3y92.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "W3y92",
"x": 0,
- "y": 65968,
+ "y": 61980,
"name": "Screen/Docs — Platform Disaster Recovery",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Include release, values, CRDs/specs, DB, Secrets/keys, and sources.",
+ "content": "Include release, values, CRDs/specs, DB, Secrets/keys, sources, and panel DB + key.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/W5p4Z1.json b/website-export/json/W5p4Z1.json
index 66bd1a7..78283bb 100644
--- a/website-export/json/W5p4Z1.json
+++ b/website-export/json/W5p4Z1.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "W5p4Z1",
"x": 0,
- "y": 94468,
+ "y": 86580,
"name": "Screen/Docs — Contribution & Design Workflow",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/X0DeYH.json b/website-export/json/X0DeYH.json
index 6b03d24..c5cd7da 100644
--- a/website-export/json/X0DeYH.json
+++ b/website-export/json/X0DeYH.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "X0DeYH",
"x": 0,
- "y": 30628,
+ "y": 30770,
"name": "Screen/Docs — Dashboard Tour",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -175,7 +175,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "In v0.2.0-beta.8, a cluster selector scopes everything. From v0.3.0, the dashboard combines every authorized cluster with an optional Location filter.",
+ "content": "The dashboard, Servers, Backups and Search combine every registered cluster you can access, and an optional Location filter narrows them (since v0.3.0; v0.2.0-beta.8 used a top-bar cluster selector that scoped everything to one cluster).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -325,6 +325,38 @@
"fontWeight": "normal"
}
]
+ },
+ {
+ "type": "frame",
+ "id": "Gxcze",
+ "name": "Section 1 Item 3",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "UgjGo",
+ "name": "Section 1 Item Icon 3",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Q7nAm5",
+ "name": "Section 1 Item Text 3",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pick the dashboard language in Settings, saved to your account or browser (v0.4.0).",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
}
]
}
@@ -435,7 +467,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Cluster health shows node readiness and allocatable CPU and memory.",
+ "content": "Cluster health shows node readiness and allocatable CPU and memory; the Nodes page spans every visible cluster (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/Yemnl.json b/website-export/json/Yemnl.json
index e332675..38eedd3 100644
--- a/website-export/json/Yemnl.json
+++ b/website-export/json/Yemnl.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Yemnl",
"x": 0,
- "y": 71668,
+ "y": 66880,
"name": "Screen/Docs — Mods & Modpacks",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Back up first, confirm the manifest, allow the required restart, and validate events, logs, and player joins.",
+ "content": "Back up first, confirm the manifest, allow the required restart, and validate events, logs, and player joins. Installs stay inside the server's mods root (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/Yog9e.json b/website-export/json/Yog9e.json
index ce12b58..56afc9f 100644
--- a/website-export/json/Yog9e.json
+++ b/website-export/json/Yog9e.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Yog9e",
"x": 0,
- "y": 57988,
+ "y": 54640,
"name": "Screen/Docs — Ingress, TLS & External Access",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Separate dashboard/API traffic from game Services.",
+ "content": "Separate dashboard/API, /share, and game traffic from game Services.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Configure proxy hops, forwarded headers, timeouts, and upload limits.",
+ "content": "Configure proxy hops, forwarded headers, timeouts, and upload limits (512m default).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -467,7 +467,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Keep agent, database, and management Services private behind the edge.",
+ "content": "Keep agent and database paths private; the API mounts only the CA cert.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/ZTnNa.json b/website-export/json/ZTnNa.json
index ad37fe9..fb74bfc 100644
--- a/website-export/json/ZTnNa.json
+++ b/website-export/json/ZTnNa.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ZTnNa",
"x": 0,
- "y": 110428,
+ "y": 100400,
"name": "Screen/Docs — Module & Cluster CRDs",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/Znh8i.json b/website-export/json/Znh8i.json
index 2209f1c..109d1de 100644
--- a/website-export/json/Znh8i.json
+++ b/website-export/json/Znh8i.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "Znh8i",
"x": 0,
- "y": 12839,
+ "y": 11930,
"name": "Screen/Docs — FAQ",
"theme": {
"semantic": "dark"
@@ -129,7 +129,7 @@
"content": "Is Gameplane production-ready?"
},
"tne6e": {
- "content": "It's in beta (v0.2.0-beta.8). Core workflows are feature-complete and tested, but not yet recommended for unattended production — see the Roadmap."
+ "content": "It's a pre-v1 release (v0.4.0). Core workflows are feature-complete and tested, but not yet recommended for unattended production — see the Roadmap."
}
}
},
@@ -192,7 +192,7 @@
"content": "What database does it use?"
},
"tne6e": {
- "content": "SQLite by default and is the production-tested driver. A PostgreSQL driver exists but is experimental (build-tag-gated, work in progress)."
+ "content": "SQLite by default and is the production-tested driver. The PostgreSQL driver works end to end but is experimental: it needs an API image built with the `postgres` build tag, and the API must stay a single replica."
}
}
},
@@ -213,6 +213,24 @@
"content": "Yes. Advanced users can bypass the API entirely and manage everything with kubectl apply — the operator is authoritative, so both stay in sync."
}
}
+ },
+ {
+ "id": "tLPlD",
+ "type": "ref",
+ "ref": "v9zjax",
+ "name": "FAQ Item Dashboard Cluster",
+ "width": "fill_container",
+ "descendants": {
+ "C2FCOL": {
+ "icon": "circle-help"
+ },
+ "XvFxz": {
+ "content": "Do I need a Kubernetes cluster to run the dashboard?"
+ },
+ "tne6e": {
+ "content": "Not for the panel itself since v0.4.0. Docker Compose or a standalone Helm profile runs the API and dashboard without Kubernetes; games still run on registered clusters, each with its own operator and agents."
+ }
+ }
}
]
}
diff --git a/website-export/json/ZwM1N.json b/website-export/json/ZwM1N.json
index 810fee4..ea99339 100644
--- a/website-export/json/ZwM1N.json
+++ b/website-export/json/ZwM1N.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ZwM1N",
"x": 0,
- "y": 87628,
+ "y": 80700,
"name": "Screen/Docs — Web Dashboard Development",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -207,7 +207,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "React and Vite use explicit routing, query caches, reusable components, Monaco, and terminal primitives.",
+ "content": "React and Vite use explicit routing, query caches, reusable components, bundled Monaco, and terminal primitives under a CSP (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -403,7 +403,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "api injects credentials, CSRF on mutations, and uniform APIError.",
+ "content": "api injects credentials, CSRF, and localized problem+json errors (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use strict build, lint, Vitest/MSW, and the appropriate Playwright mode; UI changes cite Pencil node IDs.",
+ "content": "Use strict build, lint, Vitest/MSW, and Playwright; wrap UI text with intl and run i18n:extract (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/a0X2rT.json b/website-export/json/a0X2rT.json
index cec9583..79fdf03 100644
--- a/website-export/json/a0X2rT.json
+++ b/website-export/json/a0X2rT.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "a0X2rT",
"x": 0,
- "y": 113848,
+ "y": 103340,
"name": "Screen/Docs — Metrics, Alerts & Dashboards",
"theme": {
"semantic": "dark"
@@ -1470,6 +1470,127 @@
]
}
]
+ },
+ {
+ "type": "frame",
+ "id": "q53ll",
+ "name": "Reference 2 Row 4",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$surface/secondary",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "VhdSJ",
+ "name": "Reference 2 Row 3 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "KDGi6",
+ "name": "Reference 2 Row 3 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GameplaneRelayUnavailable",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "tNMOL",
+ "name": "Reference 2 Row 3 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "NNasz",
+ "name": "Reference 2 Row 3 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "relay or forwards down",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "qdlhf",
+ "name": "Reference 2 Row 3 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "ver06",
+ "name": "Reference 2 Row 3 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "2m",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "XRxbM",
+ "name": "Reference 2 Row 3 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "t2CKd",
+ "name": "Reference 2 Row 3 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Check tunnel provider",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/website-export/json/a33qlt.json b/website-export/json/a33qlt.json
index ec5ebf8..814ca4e 100644
--- a/website-export/json/a33qlt.json
+++ b/website-export/json/a33qlt.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "a33qlt",
"x": 0,
- "y": 69388,
+ "y": 64920,
"name": "Screen/Docs — Backup Repository Operations",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Define initialization, locks, checks, prune, retention, concurrency, bandwidth, and credential rotation.",
+ "content": "Define initialization, locks, checks, prune, retention, and rotation; live multi-volume copies are not consistent (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/aZAEs.json b/website-export/json/aZAEs.json
index a0a8f30..4d600ea 100644
--- a/website-export/json/aZAEs.json
+++ b/website-export/json/aZAEs.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "aZAEs",
"x": 0,
- "y": 101308,
+ "y": 92460,
"name": "Screen/Docs — Runtime Capabilities & Actions",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Never hard-code an RCON or console password.",
+ "content": "Never hard-code a console password; authentication: false only for no-password consoles (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/ac8lF.json b/website-export/json/ac8lF.json
index a113d93..36956c3 100644
--- a/website-export/json/ac8lF.json
+++ b/website-export/json/ac8lF.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ac8lF",
"x": 0,
- "y": 93328,
+ "y": 85600,
"name": "Screen/Docs — Testing, Coverage & E2E",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/b5srx.json b/website-export/json/b5srx.json
index 10ee999..a13e20a 100644
--- a/website-export/json/b5srx.json
+++ b/website-export/json/b5srx.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "b5srx",
"x": 0,
- "y": 11699,
+ "y": 10950,
"name": "Screen/Docs — Roadmap",
"theme": {
"semantic": "dark"
@@ -95,7 +95,7 @@
"type": "text",
"id": "Cd5C8",
"fill": "$foreground/foreground",
- "content": "Beta status — v0.2.0-beta.8",
+ "content": "Pre-v1 status — v0.4.0",
"fontFamily": "$typography/font-mono",
"fontSize": 16,
"fontWeight": "600"
@@ -157,7 +157,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "WebSocket console/log/file streams are local-cluster-scoped in v0.2.0-beta.8 — remote clusters are registered and health-checked but not yet streamed. v0.3.0 adds remote access through an optional agent gateway.",
+ "content": "Users page: Service accounts and Identity providers tabs are placeholders, planned for v1.1 (OIDC is managed under Admin Settings → Authentication).",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -189,7 +189,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The PostgreSQL driver is experimental (build-tag-gated); SQLite is the production-tested database. v0.3.0 makes the driver work end to end, but it stays experimental: keep a single API replica, and it is not yet covered by e2e or upgrade tests.",
+ "content": "The PostgreSQL driver is experimental (build-tag-gated); SQLite is the production-tested database. v0.4.0 runs the auth, RBAC and upgrade e2e buckets on Postgres in CI, but it stays experimental: keep a single API replica, and handler and audit suites are not yet run against it.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
diff --git a/website-export/json/b5u3Ui.json b/website-export/json/b5u3Ui.json
index 2b69ec9..d489e56 100644
--- a/website-export/json/b5u3Ui.json
+++ b/website-export/json/b5u3Ui.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "b5u3Ui",
"x": 0,
- "y": 45448,
+ "y": 43510,
"name": "Screen/Docs — Installation & Helm",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Set external URL, ingress and TLS, storage, authentication, cluster operations, telemetry, and update policy deliberately.",
+ "content": "Set external URL, ingress and TLS, storage, authentication, cluster operations, telemetry (on by default from v0.4.0), and update policy deliberately.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/b7zNA.json b/website-export/json/b7zNA.json
index a053f74..bfc638d 100644
--- a/website-export/json/b7zNA.json
+++ b/website-export/json/b7zNA.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "b7zNA",
"x": 0,
- "y": 51148,
+ "y": 48760,
"name": "Screen/Docs — Template-specific Configuration",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/cUrQn.json b/website-export/json/cUrQn.json
index f48833d..12a270e 100644
--- a/website-export/json/cUrQn.json
+++ b/website-export/json/cUrQn.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "cUrQn",
"x": 0,
- "y": 55708,
+ "y": 52680,
"name": "Screen/Docs — Player Administration",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -319,7 +319,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Resolve the exact identity before applying an access change.",
+ "content": "Resolve exact identity; Steam names need a Web API key (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/cpCjN.json b/website-export/json/cpCjN.json
index ee0c6d7..7590a4c 100644
--- a/website-export/json/cpCjN.json
+++ b/website-export/json/cpCjN.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "cpCjN",
"x": 0,
- "y": 83068,
+ "y": 76780,
"name": "Screen/Docs — Platform Settings & Telemetry",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Set api.telemetry.enabled=false for a hard off; api.telemetry.endpoint redirects reports.",
+ "content": "Set api.telemetry.enabled=false for a hard off; a custom api.telemetry.endpoint replaces the default destination.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -467,7 +467,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Installs that never saved a choice stay off after an upgrade; recheck the setting.",
+ "content": "Basic-saved installs with no destination start sending after v0.4.0; set api.telemetry.enabled=false before upgrading.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/deVW7.json b/website-export/json/deVW7.json
index 563a0a2..de92eb9 100644
--- a/website-export/json/deVW7.json
+++ b/website-export/json/deVW7.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "deVW7",
"x": 0,
- "y": 103588,
+ "y": 94420,
"name": "Screen/Docs — Supported Versions Matrix",
"theme": {
"semantic": "dark"
@@ -1047,7 +1047,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "1.25+",
+ "content": "1.27+",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
diff --git a/website-export/json/e1SUXK.json b/website-export/json/e1SUXK.json
index 76a73dd..3aa0b17 100644
--- a/website-export/json/e1SUXK.json
+++ b/website-export/json/e1SUXK.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "e1SUXK",
"x": 0,
- "y": 116128,
+ "y": 105300,
"name": "Screen/Docs — Kubectl & GitOps Recipes",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/e8fTgD.json b/website-export/json/e8fTgD.json
index 4ac6698..029230b 100644
--- a/website-export/json/e8fTgD.json
+++ b/website-export/json/e8fTgD.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "e8fTgD",
"x": 0,
- "y": 44308,
+ "y": 42530,
"name": "Screen/Docs — API & CRDs",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/eDaA6.json b/website-export/json/eDaA6.json
index 312bd14..4d5b2c2 100644
--- a/website-export/json/eDaA6.json
+++ b/website-export/json/eDaA6.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "eDaA6",
"x": 0,
- "y": 111568,
+ "y": 101380,
"name": "Screen/Docs — Status, Phases & Conditions",
"theme": {
"semantic": "dark"
@@ -1194,7 +1194,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Ready",
+ "content": "Ready · Consistency",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -1470,6 +1470,127 @@
]
}
]
+ },
+ {
+ "type": "frame",
+ "id": "Qzd2s",
+ "name": "Reference 2 Row 4",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$surface/secondary",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "GMUHG",
+ "name": "Reference 2 Row 3 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "WR9O4",
+ "name": "Reference 2 Row 3 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GameTemplate",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "NKQya",
+ "name": "Reference 2 Row 3 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "CIoRH",
+ "name": "Reference 2 Row 3 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Valid · Invalid",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "B0oHW9",
+ "name": "Reference 2 Row 3 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "KMRU6",
+ "name": "Reference 2 Row 3 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "LocalesValid (v0.4.0)",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YWbjE",
+ "name": "Reference 2 Row 3 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "s3DeE",
+ "name": "Reference 2 Row 3 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Never blocks install",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/website-export/json/eQ4ES.json b/website-export/json/eQ4ES.json
index f2f5bee..2e31fb8 100644
--- a/website-export/json/eQ4ES.json
+++ b/website-export/json/eQ4ES.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "eQ4ES",
"x": 0,
- "y": 84208,
+ "y": 77760,
"name": "Screen/Docs — Using the Mobile Dashboard",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/eSsXv.json b/website-export/json/eSsXv.json
index 160b23d..35b15ed 100644
--- a/website-export/json/eSsXv.json
+++ b/website-export/json/eSsXv.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "eSsXv",
"x": 0,
- "y": 4859,
+ "y": 4530,
"name": "Screen/Docs — Home",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/ei1qC.json b/website-export/json/ei1qC.json
index e73750a..77a1259 100644
--- a/website-export/json/ei1qC.json
+++ b/website-export/json/ei1qC.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ei1qC",
"x": 0,
- "y": 22443,
+ "y": 22025,
"name": "Screen/Compare",
"theme": {
"semantic": "dark"
@@ -222,7 +222,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Kubernetes-native CRDs and controller-runtime operator; scales from k3s homelab to multi-node clusters. [BETA]",
+ "content": "Combined Kubernetes install or standalone panel on Docker Compose; game workloads use Kubernetes CRDs and a controller-runtime operator, from k3s to multi-node clusters. [PRE-V1]",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -558,7 +558,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Local argon2id + OIDC (Keycloak/Google/GitHub); three built-in roles (admin/operator/viewer); custom roles supported.",
+ "content": "Local argon2id + OIDC (Keycloak, Authentik, Google, Okta, Entra ID); three built-in roles (admin/operator/viewer); custom roles supported.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -642,7 +642,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 16 ready-to-use templates shipped.",
+ "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 29 ready-to-use templates shipped.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -726,7 +726,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Cluster CRD for remote registration/monitoring; console/log streaming local-cluster only. [local cluster only for streaming]",
+ "content": "Remote registration via Cluster CRDs (combined) or SQL (standalone); central user grants; remote Pod logs and PTY; optional private gateway for agent operations. [gateway optional]",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -894,7 +894,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Self-hosted only; runs on Kubernetes (k3s, kubeadm, managed services); no managed SaaS offering.",
+ "content": "Self-hosted only; panel runs on Docker Compose or Kubernetes, while games require Kubernetes (k3s, kubeadm, managed services); no managed SaaS offering.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
diff --git a/website-export/json/g8vHa.json b/website-export/json/g8vHa.json
index 4361066..bf52844 100644
--- a/website-export/json/g8vHa.json
+++ b/website-export/json/g8vHa.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "g8vHa",
"x": 0,
- "y": 102448,
+ "y": 93440,
"name": "Screen/Docs — Test, Publish & Sign Modules",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Validate metadata/schema and wait for ModuleSource synchronization.",
+ "content": "Validate metadata/schema, wait for sync, and check LocalesValid=Valid when translated (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/gEOuV.json b/website-export/json/gEOuV.json
index 1759a1a..7eb8064 100644
--- a/website-export/json/gEOuV.json
+++ b/website-export/json/gEOuV.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "gEOuV",
"x": 0,
- "y": 50008,
+ "y": 47780,
"name": "Screen/Docs — Sign-in & Account Recovery",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -403,7 +403,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Re-enter the identifier and avoid repeated guesses that trigger rate limits.",
+ "content": "Re-enter the identifier and avoid repeated guesses; a browser already signed in skips the per-username limit (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use self-service recovery only when configured; otherwise perform an audited local reset and test the effective role in a private session.",
+ "content": "Use self-service recovery only when configured; otherwise an audited local reset signs out all sessions (v0.4.0). Test the effective role privately.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/gnZrl.json b/website-export/json/gnZrl.json
index 8878971..d546010 100644
--- a/website-export/json/gnZrl.json
+++ b/website-export/json/gnZrl.json
@@ -282,7 +282,7 @@
"id": "ZqbcN",
"name": "versionLine",
"fill": "$muted",
- "content": "v0.2.0-beta.8 · AGPL-3.0-or-later · Built on Kubernetes",
+ "content": "v0.4.0 · AGPL-3.0-or-later · Built on Kubernetes",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
diff --git a/website-export/json/h0PWaP.json b/website-export/json/h0PWaP.json
index fe4adf1..4062e80 100644
--- a/website-export/json/h0PWaP.json
+++ b/website-export/json/h0PWaP.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "h0PWaP",
"x": 0,
- "y": 52288,
+ "y": 49740,
"name": "Screen/Docs — Server Overview & Connections",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/hnTHJ.json b/website-export/json/hnTHJ.json
index 9b3e5ae..bebd6e1 100644
--- a/website-export/json/hnTHJ.json
+++ b/website-export/json/hnTHJ.json
@@ -48,7 +48,7 @@
"ref": "X4Xyl",
"descendants": {
"W2qoN": {
- "content": "v0.2.0-beta.8 — actively developed"
+ "content": "v0.4.0 — actively developed"
}
}
},
@@ -141,7 +141,7 @@
"id": "Or7du",
"name": "Helper",
"fill": "$muted",
- "content": "Issues and PRs welcome — beta software, expect rough edges.",
+ "content": "Issues and PRs welcome — pre-v1 software, expect rough edges.",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
@@ -387,7 +387,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Eight purpose-built CRDs — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, and ModuleSource — reconciled by one operator. kubectl apply and the dashboard always agree.",
+ "content": "Nine purpose-built CRDs — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, ModuleSource, and NetworkCapture — reconciled by one operator. kubectl apply and the dashboard always agree.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -691,7 +691,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Versioned templates distributed as OCI bundles. Sixteen games ship out of the box — bring your own game via the template format.",
+ "content": "Versioned templates distributed as OCI bundles. Twenty-nine games ship out of the box — bring your own game via the template format.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -750,7 +750,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Local accounts or OIDC (Keycloak, Google, GitHub), three built-in roles, namespace-scoped authorization.",
+ "content": "Local accounts or OIDC (Keycloak, Authentik, Google, Okta, Entra ID), three built-in roles, namespace-scoped authorization.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -988,7 +988,7 @@
"type": "text",
"id": "ozONO",
"fill": "$foreground/foreground",
- "content": " oci://ghcr.io/valgulnecron/charts/gameplane \\",
+ "content": " oci://ghcr.io/gameplanepanel/charts/gameplane \\",
"fontFamily": "$typography/font-mono",
"fontSize": 14,
"fontWeight": "normal"
@@ -997,7 +997,7 @@
"type": "text",
"id": "qAKmm",
"fill": "$muted",
- "content": " --version 0.2.0-beta.8 \\",
+ "content": " --version 0.4.0 \\",
"fontFamily": "$typography/font-mono",
"fontSize": 14,
"fontWeight": "normal"
diff --git a/website-export/json/iif2F.json b/website-export/json/iif2F.json
index e53cc4d..29aed45 100644
--- a/website-export/json/iif2F.json
+++ b/website-export/json/iif2F.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "iif2F",
"x": 0,
- "y": 3719,
+ "y": 3550,
"name": "Screen/Docs — Getting Started",
"theme": {
"semantic": "dark"
@@ -189,7 +189,7 @@
"type": "text",
"id": "rlUsL",
"fill": "$foreground/foreground",
- "content": " oci://ghcr.io/valgulnecron/charts/gameplane \\",
+ "content": " oci://ghcr.io/gameplanepanel/charts/gameplane \\",
"fontFamily": "$typography/font-mono",
"fontSize": 13,
"fontWeight": "normal"
@@ -198,7 +198,7 @@
"type": "text",
"id": "GXUF4",
"fill": "$foreground/foreground",
- "content": " --version 0.2.0-beta.8 \\",
+ "content": " --version 0.4.0 \\",
"fontFamily": "$typography/font-mono",
"fontSize": 13,
"fontWeight": "normal"
diff --git a/website-export/json/ivU89.json b/website-export/json/ivU89.json
index 2d4f853..aa3857c 100644
--- a/website-export/json/ivU89.json
+++ b/website-export/json/ivU89.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ivU89",
"x": 0,
- "y": 36328,
+ "y": 35670,
"name": "Screen/Docs — Server Configuration",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -287,7 +287,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Equal requests and limits produce Guaranteed QoS for sensitive servers.",
+ "content": "Equal requests and limits produce Guaranteed QoS; Reserve less than the limit (v0.4.0) allows Burstable instead.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/kSyrZ.json b/website-export/json/kSyrZ.json
index 6895f6f..838f7cb 100644
--- a/website-export/json/kSyrZ.json
+++ b/website-export/json/kSyrZ.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "kSyrZ",
"x": 0,
- "y": 47728,
+ "y": 45620,
"name": "Screen/Docs — Troubleshooting",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Classify the symptom before choosing a runbook: Pending, image pull, crash loop, probe, volume, service, auth, backup, or source sync.",
+ "content": "Classify the symptom before choosing a runbook: Pending, image pull, crash loop, probe, volume, service, auth, backup, source sync, or tunnel not ready.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/kTRsn.json b/website-export/json/kTRsn.json
index 5fdcef9..150e917 100644
--- a/website-export/json/kTRsn.json
+++ b/website-export/json/kTRsn.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "kTRsn",
"x": 0,
- "y": 48868,
+ "y": 46600,
"name": "Screen/Docs — Helm Values Reference",
"theme": {
"semantic": "dark"
@@ -1728,7 +1728,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Hard on/off; false never sends and shows no first-login notice.",
+ "content": "Hard on/off; false never sends. From v0.4.0, new installs send by default.",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
diff --git a/website-export/json/l1vmU.json b/website-export/json/l1vmU.json
index 788a1ec..65a425e 100644
--- a/website-export/json/l1vmU.json
+++ b/website-export/json/l1vmU.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "l1vmU",
"x": 0,
- "y": 89908,
+ "y": 82660,
"name": "Screen/Docs — Operator & CRD Development",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -175,7 +175,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Helm does not upgrade existing CRDs automatically; generated chart CRDs and explicit upgrade instructions must stay synchronized.",
+ "content": "Helm does not upgrade existing CRDs automatically; keep generated chart CRDs and upgrade instructions in sync. The standalone profile (operator.enabled=false) omits bundled CRDs (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -467,7 +467,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Review operator/config/crd and charts/gameplane/crds together.",
+ "content": "Review operator/config/crd and charts/gameplane/charts/gameplane-crds/crds together.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/lRCKI.json b/website-export/json/lRCKI.json
index 05c8872..e62c4b2 100644
--- a/website-export/json/lRCKI.json
+++ b/website-export/json/lRCKI.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "lRCKI",
"x": 0,
- "y": 109288,
+ "y": 99420,
"name": "Screen/Docs — Backup & Restore CRDs",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/mYDXb.json b/website-export/json/mYDXb.json
index dfe1622..dc7e23f 100644
--- a/website-export/json/mYDXb.json
+++ b/website-export/json/mYDXb.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "mYDXb",
"x": 0,
- "y": 79648,
+ "y": 73740,
"name": "Screen/Docs — User Administration",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -403,7 +403,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Edit display name, email, and primary role deliberately.",
+ "content": "Edit display name, email, and primary role deliberately; only a full administrator can grant admin-level roles (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Reset only local passwords in Gameplane with a new 12+ character value.",
+ "content": "Reset only local passwords in Gameplane with a new 12+ character value; this ends all of the user's sessions (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/mu58o.json b/website-export/json/mu58o.json
index 467421c..391c158 100644
--- a/website-export/json/mu58o.json
+++ b/website-export/json/mu58o.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "mu58o",
"x": 0,
- "y": 112708,
+ "y": 102360,
"name": "Screen/Docs — Permission Catalog",
"theme": {
"semantic": "dark"
@@ -1509,7 +1509,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Unknown permission strings are rejected. Effective access is permission + resource scope + ownership.",
+ "content": "Unknown permissions are rejected. Admin-level grants need the * wildcard. Effective access is permission + scope + ownership.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/n8pnD.json b/website-export/json/n8pnD.json
index cd9edf0..2420a44 100644
--- a/website-export/json/n8pnD.json
+++ b/website-export/json/n8pnD.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "n8pnD",
"x": 0,
- "y": 78508,
+ "y": 72760,
"name": "Screen/Docs — Cluster Nodes & Kubeconfig",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -207,7 +207,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Confirm distribution, version, ready count, roles, pressure, uptime, pod capacity, CPU, and memory before changing infrastructure.",
+ "content": "Confirm distribution, version, ready count, roles, pressure, uptime, pod capacity, CPU, and memory on the Nodes page (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The action requires clusterOps.enabled and an authorized role, and the file must be handled as a secret.",
+ "content": "The action requires clusterOps.enabled and an authorized role. Replace a standalone registration by PUT, never by delete and re-register (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/ncP9x.json b/website-export/json/ncP9x.json
index 09a663b..344946d 100644
--- a/website-export/json/ncP9x.json
+++ b/website-export/json/ncP9x.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ncP9x",
"x": 0,
- "y": 53428,
+ "y": 50720,
"name": "Screen/Docs — General Server Settings",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/o5zdzd.json b/website-export/json/o5zdzd.json
index 3f01773..2b30509 100644
--- a/website-export/json/o5zdzd.json
+++ b/website-export/json/o5zdzd.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "o5zdzd",
"x": 0,
- "y": 91048,
+ "y": 83640,
"name": "Screen/Docs — Agent & Game Protocols",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Model console mode and credentials without hard-coding secrets.",
+ "content": "Model console mode and credentials without hard-coding secrets; a console with no password sets spec.rcon.authentication: false (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/o7PQv.json b/website-export/json/o7PQv.json
index 27d0fc8..f482e00 100644
--- a/website-export/json/o7PQv.json
+++ b/website-export/json/o7PQv.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "o7PQv",
"x": 0,
- "y": 72808,
+ "y": 67860,
"name": "Screen/Docs — Lifecycle & Health Probes",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/oX22m.json b/website-export/json/oX22m.json
index cd80270..53332dc 100644
--- a/website-export/json/oX22m.json
+++ b/website-export/json/oX22m.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "oX22m",
"x": 0,
- "y": 108148,
+ "y": 98440,
"name": "Screen/Docs — GameServer & Template Schema",
"theme": {
"semantic": "dark"
@@ -712,7 +712,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "CPU and memory requests and limits.",
+ "content": "CPU and memory requests and limits; requests may sit below limits (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
diff --git a/website-export/json/oi58h.json b/website-export/json/oi58h.json
index 8c3a7e5..8b77417 100644
--- a/website-export/json/oi58h.json
+++ b/website-export/json/oi58h.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "oi58h",
"x": 0,
- "y": 70528,
+ "y": 65900,
"name": "Screen/Docs — Production Observability",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Scrape documented API, operator, and agent metric endpoints.",
+ "content": "Scrape documented API, operator, agent, and relay tunnel metric endpoints.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Alert on stuck/failed work, capacity, DB, certs, backups, and sources.",
+ "content": "Alert on stuck/failed work, capacity, DB, certs, backups, sources, relay health, and performance (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/opatX.json b/website-export/json/opatX.json
index c0e47a9..b2cd05e 100644
--- a/website-export/json/opatX.json
+++ b/website-export/json/opatX.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "opatX",
"x": 0,
- "y": 97888,
+ "y": 89520,
"name": "Screen/Docs — Public Website Development",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -287,7 +287,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Docs MDX lives in website/src/content/docs with a shared DocsLayout.",
+ "content": "Docs MDX lives in website/src/content/docs with a shared DocsLayout. Sidebar order comes from src/lib/docs-nav.ts.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/p5Gci.json b/website-export/json/p5Gci.json
index 15cbaf7..6132cad 100644
--- a/website-export/json/p5Gci.json
+++ b/website-export/json/p5Gci.json
@@ -1 +1,943 @@
-{"type":"frame","id":"p5Gci","x":0,"y":59128,"name":"Screen/Docs — Database Configuration & Lifecycle","theme":{"semantic":"dark"},"clip":true,"width":1440,"height":900,"fill":"$background/background","children":[{"id":"SblbP","type":"ref","ref":"K2Rt4H","height":"fill_container","name":"DocsSidebar/Expanded","width":280},{"type":"frame","id":"iLeaa","name":"Docs Main","width":"fill_container","height":"fill_container","fill":"$background/background","layout":"vertical","children":[{"id":"mpJgT","type":"ref","ref":"SOdlr","name":"Docs Top Bar","width":"fill_container","descendants":{"NImey":{"content":"Platform"},"ikbi6":{"content":"Database"}}},{"type":"frame","id":"a6pOmF","name":"Docs Article Body","clip":true,"width":"fill_container","height":"fill_container","gap":32,"padding":32,"children":[{"type":"frame","id":"mgxfD","name":"Docs Article","width":780,"layout":"vertical","gap":14,"children":[{"type":"text","id":"r55DX","name":"Article Eyebrow","fill":"$accent/accent","content":"DATA","fontFamily":"JetBrains Mono","fontSize":11,"fontWeight":"600","letterSpacing":0.8},{"type":"text","id":"z69lHR","name":"Article Title","fill":"$foreground/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Database configuration and lifecycle","lineHeight":1.1,"fontFamily":"JetBrains Mono","fontSize":30,"fontWeight":"700"},{"type":"text","id":"tZ8sO","name":"Article Lead","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Select a supported topology, secure its connection, control migrations, and recover platform state independently of game worlds.","lineHeight":1.45,"fontFamily":"Geist","fontSize":15,"fontWeight":"normal"},{"type":"frame","id":"cZCFi","name":"Article Metadata","gap":8,"alignItems":"center","children":[{"id":"kaitV","type":"ref","ref":"NZPtq","name":"Meta Chip 0","descendants":{"NLG8t":{"content":"PLATFORM GUIDE"}}},{"id":"WG6lI","type":"ref","ref":"EbSsA","name":"Meta Chip 1","descendants":{"yb6zz":{"content":"v0.2"}}},{"id":"Y7dcih","type":"ref","ref":"EbSsA","name":"Meta Chip 2","descendants":{"yb6zz":{"content":"18 MIN"}}}]},{"type":"frame","id":"N3EVIF","name":"Article Callout","width":"fill_container","fill":"$accent/soft","cornerRadius":"$radius/xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","gap":10,"padding":[10,12],"alignItems":"center","children":[{"type":"icon","id":"HA9YI","name":"Article Callout Icon","width":16,"height":16,"icon":"database","library":"lucide","fill":"$accent/soft-foreground"},{"type":"text","id":"ybd2Y","name":"Article Callout Text","fill":"$accent/soft-foreground","textGrowth":"fixed-width","width":"fill_container","content":"Game-world backups do not contain users, roles, sessions, settings, or audit state stored in the platform database.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"DKfDF","name":"Guide Section 1","width":"fill_container","layout":"vertical","gap":6,"children":[{"type":"text","id":"HE1q6","name":"Section Title 1","fill":"$foreground/foreground","content":"Select and provision","fontFamily":"JetBrains Mono","fontSize":17,"fontWeight":"600"},{"type":"text","id":"TvmbH","name":"Section Body 1","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Document engine, version, availability model, storage, ownership, connection limits, and TLS.","lineHeight":1.45,"fontFamily":"Geist","fontSize":13,"fontWeight":"normal"},{"type":"frame","id":"ynE3D","name":"Section List 1","width":"fill_container","fill":"$surface/surface","cornerRadius":"$radius/2xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":5,"padding":[8,10],"children":[{"type":"frame","id":"pvWnO","name":"Section 1 Item 0","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"GdFLV","name":"Section 1 Item Icon 0","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"Q8fWmI","name":"Section 1 Item Text 0","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Use SQLite only within its documented single-instance constraints.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"SBFHT","name":"Section 1 Item 1","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"i5GXC","name":"Section 1 Item Icon 1","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"ZCbCA","name":"Section 1 Item Text 1","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"For PostgreSQL, define DNS, TLS/CA, user ownership, pooling, and limits.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"AvNey","name":"Section 1 Item 2","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"NE9tI","name":"Section 1 Item Icon 2","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"mh1iU","name":"Section 1 Item Text 2","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Keep credentials in a Kubernetes Secret and database traffic private.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]}]}]},{"type":"frame","id":"NzSDt","name":"Guide Section 2","width":"fill_container","layout":"vertical","gap":6,"children":[{"type":"text","id":"p7PONH","name":"Section Title 2","fill":"$foreground/foreground","content":"Migrate and operate","fontFamily":"JetBrains Mono","fontSize":17,"fontWeight":"600"},{"type":"text","id":"b2gdm","name":"Section Body 2","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Tie schema migrations to a pinned release and observe connectivity, locks, latency, growth, and failures.","lineHeight":1.45,"fontFamily":"Geist","fontSize":13,"fontWeight":"normal"},{"type":"frame","id":"sLqyb","name":"Section List 2","width":"fill_container","fill":"$surface/surface","cornerRadius":"$radius/2xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":5,"padding":[8,10],"children":[{"type":"frame","id":"x9gdW","name":"Section 2 Item 0","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"RZoOF","name":"Section 2 Item Icon 0","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"vseqb","name":"Section 2 Item Text 0","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"State whether migrations run automatically or as an explicit job.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"S2lL6o","name":"Section 2 Item 1","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"CIvJb","name":"Section 2 Item Icon 1","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"RP3M6","name":"Section 2 Item Text 1","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Monitor saturation, locks, latency, storage, and failed migrations.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"Yi1AW","name":"Section 2 Item 2","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"lQhsC","name":"Section 2 Item Icon 2","width":13,"height":13,"icon":"check","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"yMz9n","name":"Section 2 Item Text 2","fill":"$default/foreground","textGrowth":"fixed-width","width":"fill_container","content":"Rotate credentials with overlap and test reconnection before revocation.","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]}]}]},{"type":"frame","id":"lZ5lO","name":"Guide Section 3","width":"fill_container","layout":"vertical","gap":6,"children":[{"type":"text","id":"IZqRA","name":"Section Title 3","fill":"$foreground/foreground","content":"Back up and recover","fontFamily":"JetBrains Mono","fontSize":17,"fontWeight":"600"},{"type":"text","id":"zja4I","name":"Section Body 3","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Restore database, values, identity configuration, CRDs, and Secrets as one version-compatible recovery set.","lineHeight":1.45,"fontFamily":"Geist","fontSize":13,"fontWeight":"normal"},{"type":"frame","id":"dtFsR","name":"Quick Reference","width":"fill_container","fill":"$surface/tertiary","cornerRadius":"$radius/xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":3,"padding":12,"children":[{"type":"text","id":"k3SY5d","name":"Quick Reference Label","fill":"$accent/accent","content":"DATABASE RUNBOOK","fontFamily":"JetBrains Mono","fontSize":9,"fontWeight":"600","letterSpacing":0.6},{"type":"text","id":"N6Rm7","name":"Quick Reference Line 1","fill":"$foreground/foreground","content":"01 Record engine/version, endpoint, TLS, Secret, schema, backup","fontFamily":"JetBrains Mono","fontSize":11.5,"fontWeight":"normal"},{"type":"text","id":"TpIkh","name":"Quick Reference Line 2","fill":"$foreground/foreground","content":"02 Upgrade gate → backup + migration notes + connection headroom","fontFamily":"JetBrains Mono","fontSize":11.5,"fontWeight":"normal"},{"type":"text","id":"C8taog","name":"Quick Reference Line 3","fill":"$foreground/foreground","content":"03 Restore DB → matching release → validate schema, login, audit, settings","fontFamily":"JetBrains Mono","fontSize":11.5,"fontWeight":"normal"}]}]},{"type":"frame","id":"mniyp","name":"Article Next Link","width":"fill_container","stroke":"$border/border","strokeWidth":{"top":1},"strokeAlignment":"inner","strokeLinejoin":"round","padding":[10,0,0,0],"justifyContent":"space_between","alignItems":"center","children":[{"type":"frame","id":"r4q7Uw","name":"Next Link Text","layout":"vertical","gap":2,"children":[{"type":"text","id":"enAQR","name":"Next Link Eyebrow","fill":"$field/placeholder","content":"NEXT GUIDE","fontFamily":"Geist","fontSize":10,"fontWeight":"normal"},{"type":"text","id":"li2nn","name":"Next Link Title","fill":"$foreground/foreground","content":"Platform Disaster Recovery","fontFamily":"JetBrains Mono","fontSize":13,"fontWeight":"500"}]},{"type":"icon","id":"lwCjR","name":"Next Link Icon","width":15,"height":15,"icon":"arrow-right","library":"lucide","fill":"$muted"}]}]},{"type":"frame","id":"TSXo3","name":"Docs Page Aside","width":250,"layout":"vertical","gap":16,"children":[{"type":"frame","id":"IyLl6","name":"Docs Table of Contents","width":"fill_container","fill":"$surface/secondary","cornerRadius":"$radius/2xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":10,"padding":16,"children":[{"type":"text","id":"dFnGx","name":"TOC Label","fill":"$field/placeholder","content":"ON THIS PAGE","fontFamily":"JetBrains Mono","fontSize":9,"fontWeight":"600","letterSpacing":0.7},{"type":"frame","id":"w7yEQP","name":"TOC Row 0","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"WFoNi","name":"TOC Icon 0","width":12,"height":12,"icon":"hash","library":"lucide","fill":"$accent/accent"},{"type":"text","id":"Tnc5J","name":"TOC Text 0","fill":"$foreground/foreground","content":"Provision","fontFamily":"Geist","fontSize":12.5,"fontWeight":"500"}]},{"type":"frame","id":"RduIF","name":"TOC Row 1","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"bzx4w","name":"TOC Icon 1","width":12,"height":12,"icon":"hash","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"Ve1Ke","name":"TOC Text 1","fill":"$muted","content":"Migrate and operate","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"frame","id":"G7JCWk","name":"TOC Row 2","width":"fill_container","gap":8,"alignItems":"center","children":[{"type":"icon","id":"P8iKp","name":"TOC Icon 2","width":12,"height":12,"icon":"hash","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"uYiM7","name":"TOC Text 2","fill":"$muted","content":"Recover","fontFamily":"Geist","fontSize":12.5,"fontWeight":"normal"}]},{"type":"rectangle","id":"OIFwR","name":"TOC Divider","fill":"$border/border","width":"fill_container","height":1},{"type":"text","id":"Pu8zV","name":"Coverage Label","fill":"$field/placeholder","content":"COVERS","fontFamily":"JetBrains Mono","fontSize":9,"fontWeight":"600","letterSpacing":0.7},{"type":"frame","id":"ZhJKd","name":"Coverage Row 0","width":"fill_container","gap":7,"alignItems":"center","children":[{"type":"icon","id":"HYVNh","name":"Coverage Icon 0","width":12,"height":12,"icon":"book-open","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"hu6Qi","name":"Coverage Text 0","fill":"$muted","content":"SQLite","fontFamily":"Geist","fontSize":12,"fontWeight":"normal"}]},{"type":"frame","id":"Z6QBc","name":"Coverage Row 1","width":"fill_container","gap":7,"alignItems":"center","children":[{"type":"icon","id":"kmUF2","name":"Coverage Icon 1","width":12,"height":12,"icon":"book-open","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"lDsTG","name":"Coverage Text 1","fill":"$muted","content":"PostgreSQL","fontFamily":"Geist","fontSize":12,"fontWeight":"normal"}]},{"type":"frame","id":"hhIqz","name":"Coverage Row 2","width":"fill_container","gap":7,"alignItems":"center","children":[{"type":"icon","id":"ZVMmt","name":"Coverage Icon 2","width":12,"height":12,"icon":"book-open","library":"lucide","fill":"$field/placeholder"},{"type":"text","id":"pf0vi","name":"Coverage Text 2","fill":"$muted","content":"Migrations","fontFamily":"Geist","fontSize":12,"fontWeight":"normal"}]}]},{"type":"frame","id":"Ptk6I","name":"Edit Page Card","width":"fill_container","fill":"$background/background","cornerRadius":"$radius/3xl","stroke":"$border/border","strokeWidth":1,"strokeAlignment":"inner","layout":"vertical","gap":6,"padding":14,"children":[{"type":"text","id":"n4mDoU","name":"Edit Page Title","fill":"$foreground/foreground","content":"Improve this page","fontFamily":"JetBrains Mono","fontSize":12,"fontWeight":"600"},{"type":"text","id":"r4lkRF","name":"Edit Page Body","fill":"$muted","textGrowth":"fixed-width","width":"fill_container","content":"Found a gap? Open a docs issue or suggest an edit on GitHub.","lineHeight":1.4,"fontFamily":"Geist","fontSize":11.5,"fontWeight":"normal"},{"type":"frame","id":"IdWes","name":"Edit Page Link","gap":6,"alignItems":"center","children":[{"type":"text","id":"H2omr","name":"Edit Page Link Text","fill":"$accent/soft-foreground","content":"Edit this page","fontFamily":"Geist","fontSize":12,"fontWeight":"500"},{"type":"icon","id":"s6iraX","name":"Edit Page Link Icon","width":12,"height":12,"icon":"external-link","library":"lucide","fill":"$accent/accent"}]}]}]}]}]}]}
+{
+ "type": "frame",
+ "id": "p5Gci",
+ "x": 0,
+ "y": 55620,
+ "name": "Screen/Docs — Database Configuration & Lifecycle",
+ "theme": {
+ "semantic": "dark"
+ },
+ "clip": true,
+ "width": 1440,
+ "height": 900,
+ "fill": "$background/background",
+ "children": [
+ {
+ "id": "SblbP",
+ "type": "ref",
+ "ref": "K2Rt4H",
+ "height": "fill_container",
+ "name": "DocsSidebar/Expanded",
+ "width": 280
+ },
+ {
+ "type": "frame",
+ "id": "iLeaa",
+ "name": "Docs Main",
+ "width": "fill_container",
+ "height": "fill_container",
+ "fill": "$background/background",
+ "layout": "vertical",
+ "children": [
+ {
+ "id": "mpJgT",
+ "type": "ref",
+ "ref": "SOdlr",
+ "name": "Docs Top Bar",
+ "width": "fill_container",
+ "descendants": {
+ "NImey": {
+ "content": "Platform"
+ },
+ "ikbi6": {
+ "content": "Database"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "a6pOmF",
+ "name": "Docs Article Body",
+ "clip": true,
+ "width": "fill_container",
+ "height": "fill_container",
+ "gap": 32,
+ "padding": 32,
+ "children": [
+ {
+ "type": "frame",
+ "id": "mgxfD",
+ "name": "Docs Article",
+ "width": 780,
+ "layout": "vertical",
+ "gap": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "r55DX",
+ "name": "Article Eyebrow",
+ "fill": "$accent/accent",
+ "content": "DATA",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11,
+ "fontWeight": "600",
+ "letterSpacing": 0.8
+ },
+ {
+ "type": "text",
+ "id": "z69lHR",
+ "name": "Article Title",
+ "fill": "$foreground/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Database configuration and lifecycle",
+ "lineHeight": 1.1,
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 30,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "tZ8sO",
+ "name": "Article Lead",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Select a supported topology, secure its connection, control migrations, and recover platform state independently of game worlds.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 15,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "cZCFi",
+ "name": "Article Metadata",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "id": "kaitV",
+ "type": "ref",
+ "ref": "NZPtq",
+ "name": "Meta Chip 0",
+ "descendants": {
+ "NLG8t": {
+ "content": "PLATFORM GUIDE"
+ }
+ }
+ },
+ {
+ "id": "WG6lI",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 1",
+ "descendants": {
+ "yb6zz": {
+ "content": "v0.4"
+ }
+ }
+ },
+ {
+ "id": "Y7dcih",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 2",
+ "descendants": {
+ "yb6zz": {
+ "content": "18 MIN"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "N3EVIF",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "HA9YI",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "database",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "ybd2Y",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Game-world backups do not contain users, roles, sessions, settings, or audit state stored in the platform database.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "DKfDF",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "HE1q6",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Select and provision",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "TvmbH",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Document engine, version, availability model, storage, ownership, connection limits, and TLS.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "ynE3D",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "pvWnO",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "GdFLV",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Q8fWmI",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Use SQLite only within its documented single-instance constraints.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "SBFHT",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "i5GXC",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "ZCbCA",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "For PostgreSQL, define DNS, TLS/CA, user ownership, pooling, and limits.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "AvNey",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "NE9tI",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "mh1iU",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Keep credentials in a Kubernetes Secret and database traffic private.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "NzSDt",
+ "name": "Guide Section 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "p7PONH",
+ "name": "Section Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Migrate and operate",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "b2gdm",
+ "name": "Section Body 2",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Tie schema migrations to a pinned release and observe connectivity, locks, latency, growth, and failures.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "sLqyb",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "x9gdW",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "RZoOF",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "vseqb",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Migrations run on API startup; v0.4.0 applies 019 and ends a user's sessions on password reset.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "S2lL6o",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "CIvJb",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "RP3M6",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Monitor saturation, locks, latency, storage, and failed migrations.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Yi1AW",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "lQhsC",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "yMz9n",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Rotate credentials with overlap and test reconnection before revocation.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "lZ5lO",
+ "name": "Guide Section 3",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "IZqRA",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Back up and recover",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "zja4I",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Restore database, values, identity configuration, CRDs, and Secrets as one version-compatible recovery set.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "dtFsR",
+ "name": "Quick Reference",
+ "width": "fill_container",
+ "fill": "$surface/tertiary",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 3,
+ "padding": 12,
+ "children": [
+ {
+ "type": "text",
+ "id": "k3SY5d",
+ "name": "Quick Reference Label",
+ "fill": "$accent/accent",
+ "content": "DATABASE RUNBOOK",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.6
+ },
+ {
+ "type": "text",
+ "id": "N6Rm7",
+ "name": "Quick Reference Line 1",
+ "fill": "$foreground/foreground",
+ "content": "01 Record engine/version, endpoint, TLS, Secret, schema, backup",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "TpIkh",
+ "name": "Quick Reference Line 2",
+ "fill": "$foreground/foreground",
+ "content": "02 Upgrade gate → backup + migration notes + connection headroom",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "C8taog",
+ "name": "Quick Reference Line 3",
+ "fill": "$foreground/foreground",
+ "content": "03 Restore DB → matching release → validate schema, login, audit, settings",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "mniyp",
+ "name": "Article Next Link",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "padding": [
+ 10,
+ 0,
+ 0,
+ 0
+ ],
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "r4q7Uw",
+ "name": "Next Link Text",
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "enAQR",
+ "name": "Next Link Eyebrow",
+ "fill": "$field/placeholder",
+ "content": "NEXT GUIDE",
+ "fontFamily": "Geist",
+ "fontSize": 10,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "li2nn",
+ "name": "Next Link Title",
+ "fill": "$foreground/foreground",
+ "content": "Platform Disaster Recovery",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 13,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "icon",
+ "id": "lwCjR",
+ "name": "Next Link Icon",
+ "width": 15,
+ "height": 15,
+ "icon": "arrow-right",
+ "library": "lucide",
+ "fill": "$muted"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "TSXo3",
+ "name": "Docs Page Aside",
+ "width": 250,
+ "layout": "vertical",
+ "gap": 16,
+ "children": [
+ {
+ "type": "frame",
+ "id": "IyLl6",
+ "name": "Docs Table of Contents",
+ "width": "fill_container",
+ "fill": "$surface/secondary",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 10,
+ "padding": 16,
+ "children": [
+ {
+ "type": "text",
+ "id": "dFnGx",
+ "name": "TOC Label",
+ "fill": "$field/placeholder",
+ "content": "ON THIS PAGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "w7yEQP",
+ "name": "TOC Row 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "WFoNi",
+ "name": "TOC Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Tnc5J",
+ "name": "TOC Text 0",
+ "fill": "$foreground/foreground",
+ "content": "Provision",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "RduIF",
+ "name": "TOC Row 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "bzx4w",
+ "name": "TOC Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "Ve1Ke",
+ "name": "TOC Text 1",
+ "fill": "$muted",
+ "content": "Migrate and operate",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "G7JCWk",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "P8iKp",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "uYiM7",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Recover",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "rectangle",
+ "id": "OIFwR",
+ "name": "TOC Divider",
+ "fill": "$border/border",
+ "width": "fill_container",
+ "height": 1
+ },
+ {
+ "type": "text",
+ "id": "Pu8zV",
+ "name": "Coverage Label",
+ "fill": "$field/placeholder",
+ "content": "COVERS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "ZhJKd",
+ "name": "Coverage Row 0",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "HYVNh",
+ "name": "Coverage Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "hu6Qi",
+ "name": "Coverage Text 0",
+ "fill": "$muted",
+ "content": "SQLite",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Z6QBc",
+ "name": "Coverage Row 1",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "kmUF2",
+ "name": "Coverage Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "lDsTG",
+ "name": "Coverage Text 1",
+ "fill": "$muted",
+ "content": "PostgreSQL",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "hhIqz",
+ "name": "Coverage Row 2",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "ZVMmt",
+ "name": "Coverage Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "pf0vi",
+ "name": "Coverage Text 2",
+ "fill": "$muted",
+ "content": "Migrations",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Ptk6I",
+ "name": "Edit Page Card",
+ "width": "fill_container",
+ "fill": "$background/background",
+ "cornerRadius": "$radius/3xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 6,
+ "padding": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "n4mDoU",
+ "name": "Edit Page Title",
+ "fill": "$foreground/foreground",
+ "content": "Improve this page",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 12,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "r4lkRF",
+ "name": "Edit Page Body",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Found a gap? Open a docs issue or suggest an edit on GitHub.",
+ "lineHeight": 1.4,
+ "fontFamily": "Geist",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "IdWes",
+ "name": "Edit Page Link",
+ "gap": 6,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "H2omr",
+ "name": "Edit Page Link Text",
+ "fill": "$accent/soft-foreground",
+ "content": "Edit this page",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "500"
+ },
+ {
+ "type": "icon",
+ "id": "s6iraX",
+ "name": "Edit Page Link Icon",
+ "width": 12,
+ "height": 12,
+ "icon": "external-link",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/website-export/json/qXFiI.json b/website-export/json/qXFiI.json
index 55a3e66..dc8d9fe 100644
--- a/website-export/json/qXFiI.json
+++ b/website-export/json/qXFiI.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "qXFiI",
"x": 0,
- "y": 76228,
+ "y": 70800,
"name": "Screen/Docs — Upload a Module",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -319,7 +319,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Validate identity, semver, capabilities, images, and supported versions.",
+ "content": "Validate identity, semver, capabilities, images, supported versions, and locales (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/r4WPE.json b/website-export/json/r4WPE.json
index 59133b2..716ca93 100644
--- a/website-export/json/r4WPE.json
+++ b/website-export/json/r4WPE.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "r4WPE",
"x": 0,
- "y": 100168,
+ "y": 91480,
"name": "Screen/Docs — GameTemplate Schema",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Map typed inputs to environment, args, or rendered files without exposing secrets in status.",
+ "content": "Map typed inputs to env, args, or files without exposing secrets. Ship locales/.json translations (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/rW1Ux.json b/website-export/json/rW1Ux.json
index 7d4d12b..04f148d 100644
--- a/website-export/json/rW1Ux.json
+++ b/website-export/json/rW1Ux.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "rW1Ux",
"x": 0,
- "y": 95608,
+ "y": 87560,
"name": "Screen/Docs — CI, Releases & Signing",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Changes on main publish rolling edge and immutable sha tags for all released components.",
+ "content": "Changes on master publish rolling edge and immutable sha tags for all released components.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -559,7 +559,7 @@
"id": "paKl1",
"name": "Quick Reference Line 3",
"fill": "$foreground/foreground",
- "content": "03 cosign verify --key cosign.pub --insecure-ignore-tlog=true ",
+ "content": "03 cosign verify --key signing/cosign.pub ",
"fontFamily": "JetBrains Mono",
"fontSize": 11.5,
"fontWeight": "normal"
diff --git a/website-export/json/rqx1v.json b/website-export/json/rqx1v.json
index faf271f..c37fd64 100644
--- a/website-export/json/rqx1v.json
+++ b/website-export/json/rqx1v.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "rqx1v",
"x": 0,
- "y": 86488,
+ "y": 79720,
"name": "Screen/Docs — Repository & Components",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/s0Q7Lf.json b/website-export/json/s0Q7Lf.json
index 7ddc39f..2f0e109 100644
--- a/website-export/json/s0Q7Lf.json
+++ b/website-export/json/s0Q7Lf.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "s0Q7Lf",
"x": 0,
- "y": 119308,
+ "y": 108480,
"name": "Screen/Docs — Telemetry Provider on Kubernetes",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.3"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/s3NwF.json b/website-export/json/s3NwF.json
index 6fd9111..e76dd99 100644
--- a/website-export/json/s3NwF.json
+++ b/website-export/json/s3NwF.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "s3NwF",
"x": 0,
- "y": 37468,
+ "y": 36650,
"name": "Screen/Docs — Network & Automation",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -387,7 +387,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Treat every port override and CIDR allow-list as part of the server's documented interface.",
+ "content": "Treat every port override and CIDR allow-list as part of the server’s documented interface.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Expose only required TCP or UDP ports from the selected module.",
+ "content": "Expose only required TCP or UDP ports; v0.4.0 lets kubelet probes reach only those ports.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/tfxmL.json b/website-export/json/tfxmL.json
index 3f6fb77..d32f89f 100644
--- a/website-export/json/tfxmL.json
+++ b/website-export/json/tfxmL.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "tfxmL",
"x": 0,
- "y": 20534,
+ "y": 20284,
"name": "Screen/Showcase",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/upO5i.json b/website-export/json/upO5i.json
index ef78eee..dac0eef 100644
--- a/website-export/json/upO5i.json
+++ b/website-export/json/upO5i.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "upO5i",
"x": 0,
- "y": 104728,
+ "y": 95400,
"name": "Screen/Docs — REST API Reference",
"theme": {
"semantic": "dark"
@@ -846,6 +846,393 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "NmHVl",
+ "name": "Reference Block Clusters",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 7,
+ "children": [
+ {
+ "type": "text",
+ "id": "N3paj",
+ "name": "Reference Block Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Clusters and nodes",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 14,
+ "fontWeight": "600"
+ },
+ {
+ "type": "frame",
+ "id": "tmbED",
+ "name": "Reference Table 2",
+ "clip": true,
+ "width": "fill_container",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "children": [
+ {
+ "type": "frame",
+ "id": "XPgN8",
+ "name": "Reference Table Header 2",
+ "width": "fill_container",
+ "height": 32,
+ "fill": "$surface/surface",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "wSbOK",
+ "name": "Header 2 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "Ninxs",
+ "name": "Header 2 Text 0",
+ "fill": "$field/placeholder",
+ "content": "ROUTE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YUpDB",
+ "name": "Header 2 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "PZHDh",
+ "name": "Header 2 Text 1",
+ "fill": "$field/placeholder",
+ "content": "METHOD",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "ve2cO",
+ "name": "Header 2 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "xFNnL",
+ "name": "Header 2 Text 2",
+ "fill": "$field/placeholder",
+ "content": "PERMISSION",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "LPCKL",
+ "name": "Header 2 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "ddLLQ",
+ "name": "Header 2 Text 3",
+ "fill": "$field/placeholder",
+ "content": "DESCRIPTION",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "xChTe",
+ "name": "Reference 2 Row 0",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$background/background",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "ULZhG",
+ "name": "Reference 2 Row 0 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "vxUMV",
+ "name": "Reference 2 Row 0 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "/clusters",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Z83vzn",
+ "name": "Reference 2 Row 0 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "Ar6n7",
+ "name": "Reference 2 Row 0 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GET · POST",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "l72phB",
+ "name": "Reference 2 Row 0 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "r5MRuz",
+ "name": "Reference 2 Row 0 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "cluster:manage (POST)",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "OcZrJ",
+ "name": "Reference 2 Row 0 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "bxAnk",
+ "name": "Reference 2 Row 0 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "List visible clusters; register one with POST.",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "bY9gs",
+ "name": "Reference 2 Row 1",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$surface/secondary",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "iRKlY",
+ "name": "Reference 2 Row 1 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "K9cgrT",
+ "name": "Reference 2 Row 1 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "/fleet/inventory",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "CqVs1",
+ "name": "Reference 2 Row 1 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "C6hAl",
+ "name": "Reference 2 Row 1 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GET",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "ZyOMk",
+ "name": "Reference 2 Row 1 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "GcJll",
+ "name": "Reference 2 Row 1 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "inventory grant",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "SJ21J",
+ "name": "Reference 2 Row 1 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "xVRGv",
+ "name": "Reference 2 Row 1 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Nodes of every cluster you can see (v0.4.0).",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
{
"type": "frame",
"id": "R45w3",
diff --git a/website-export/json/vAYOC.json b/website-export/json/vAYOC.json
index e74532d..70b0313 100644
--- a/website-export/json/vAYOC.json
+++ b/website-export/json/vAYOC.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "vAYOC",
"x": 0,
- "y": 8279,
+ "y": 7570,
"name": "Screen/Docs — Module Authoring",
"theme": {
"semantic": "dark"
@@ -107,7 +107,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "A module directory holds template.yaml, module.yaml, an optional README, and an optional icon.",
+ "content": "A module directory holds template.yaml, module.yaml, an optional README, icon, and locales (v0.4.0).",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -198,7 +198,7 @@
"type": "text",
"id": "klpAX",
"fill": "$foreground/foreground",
- "content": " ghcr.io/valgulnecron/gameplane-modules/minecraft-java:1.0.0 \\",
+ "content": " ghcr.io/gameplanepanel/gameplane-modules/minecraft-java:1.0.0 \\",
"fontFamily": "$typography/font-mono",
"fontSize": 13,
"fontWeight": "normal"
@@ -239,7 +239,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "An OCI artifact with named layers, tagged application/vnd.gameplane.module.v1+json.",
+ "content": "An OCI artifact with named layers, including optional locales (v0.4.0), tagged application/vnd.gameplane.module.v1+json.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
diff --git a/website-export/json/vh8hz.json b/website-export/json/vh8hz.json
index e339184..18434ae 100644
--- a/website-export/json/vh8hz.json
+++ b/website-export/json/vh8hz.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "vh8hz",
"x": 0,
- "y": 24247,
+ "y": 24752,
"name": "Screen/Not Found",
"theme": {
"semantic": "dark"
diff --git a/website-export/json/vqKLi.json b/website-export/json/vqKLi.json
index ed4f602..5087eea 100644
--- a/website-export/json/vqKLi.json
+++ b/website-export/json/vqKLi.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "vqKLi",
"x": 0,
- "y": 29544,
+ "y": 29846,
"name": "Screen/Docs — Article (Mobile)",
"theme": {
"semantic": "dark"
@@ -228,7 +228,7 @@
"name": "Mobile Meta Chip 2",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
}
diff --git a/website-export/json/w7kbJ.json b/website-export/json/w7kbJ.json
index 5f44bf4..d5ebc76 100644
--- a/website-export/json/w7kbJ.json
+++ b/website-export/json/w7kbJ.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "w7kbJ",
"x": 0,
- "y": 80788,
+ "y": 74720,
"name": "Screen/Docs — System Log Viewer",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/wCt6V.json b/website-export/json/wCt6V.json
index 10e6edb..c4b3d5a 100644
--- a/website-export/json/wCt6V.json
+++ b/website-export/json/wCt6V.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "wCt6V",
"x": 0,
- "y": 117108,
+ "y": 106280,
"name": "Screen/Docs — Server Networking & Tunnels",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
diff --git a/website-export/json/wvEgh.json b/website-export/json/wvEgh.json
index 33b6dd1..191ce0c 100644
--- a/website-export/json/wvEgh.json
+++ b/website-export/json/wvEgh.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "wvEgh",
"x": 0,
- "y": 99028,
+ "y": 90500,
"name": "Screen/Docs — Module Authoring Quickstart",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -255,7 +255,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Create module.yaml, template.yaml, and README.md.",
+ "content": "Create module.yaml, template.yaml, and README.md, plus optional locales/ translations (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Validate, push to the local registry, wait for source synchronization, install, and prove Module and generated template readiness.",
+ "content": "Validate (checks translations, v0.4.0), push to the local registry, wait for source synchronization, install, and prove Module and generated template readiness.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/xA0uh.json b/website-export/json/xA0uh.json
new file mode 100644
index 0000000..1fb0ed6
--- /dev/null
+++ b/website-export/json/xA0uh.json
@@ -0,0 +1,1170 @@
+{
+ "type": "frame",
+ "id": "xA0uh",
+ "x": 0,
+ "y": 111157,
+ "name": "Screen/Docs — Standalone Panel",
+ "theme": {
+ "semantic": "dark"
+ },
+ "clip": true,
+ "width": 1440,
+ "height": 1120,
+ "fill": "$background/background",
+ "children": [
+ {
+ "id": "qlxUA",
+ "type": "ref",
+ "ref": "K2Rt4H",
+ "height": "fill_container",
+ "name": "DocsSidebar/Expanded",
+ "width": 280,
+ "descendants": {
+ "w7U9E": {
+ "fill": "$foreground/foreground"
+ },
+ "Ammc4": {
+ "fill": "$muted"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "ndfDZ",
+ "name": "Docs Main",
+ "width": "fill_container",
+ "height": "fill_container",
+ "fill": "$background/background",
+ "layout": "vertical",
+ "children": [
+ {
+ "id": "egez2",
+ "type": "ref",
+ "ref": "SOdlr",
+ "name": "Docs Top Bar",
+ "width": "fill_container",
+ "descendants": {
+ "NImey": {
+ "content": "Platform"
+ },
+ "ikbi6": {
+ "content": "Standalone panel"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "CjXGW",
+ "name": "Docs Article Body",
+ "clip": true,
+ "width": "fill_container",
+ "height": "fill_container",
+ "gap": 32,
+ "padding": 32,
+ "children": [
+ {
+ "type": "frame",
+ "id": "ieVmb",
+ "name": "Docs Article",
+ "width": 780,
+ "layout": "vertical",
+ "gap": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "ZG2L3",
+ "name": "Article Eyebrow",
+ "fill": "$accent/accent",
+ "content": "PLATFORM",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11,
+ "fontWeight": "600",
+ "letterSpacing": 0.8
+ },
+ {
+ "type": "text",
+ "id": "OvPMn",
+ "name": "Article Title",
+ "fill": "$foreground/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Standalone panel",
+ "lineHeight": 1.1,
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 30,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "nGWrj",
+ "name": "Article Lead",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Run the dashboard and API on a host without Kubernetes, then register remote game clusters and manage their credentials.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 15,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "t5OwMd",
+ "name": "Article Metadata",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "id": "Z2iUw1",
+ "type": "ref",
+ "ref": "NZPtq",
+ "name": "Meta Chip 0",
+ "descendants": {
+ "NLG8t": {
+ "content": "PLATFORM"
+ }
+ }
+ },
+ {
+ "id": "YC4mj",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 1",
+ "descendants": {
+ "yb6zz": {
+ "content": "v0.4"
+ }
+ }
+ },
+ {
+ "id": "njn3h",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 2",
+ "descendants": {
+ "yb6zz": {
+ "content": "14 MIN"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "iYPQJ",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "vt30T",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "network",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "BMHNM",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Set GAMEPLANE_REMOTE_ALLOWED_CIDRS before registering clusters, or registration can reach any private address the panel host can reach.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "I8yGH",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "gtRy3",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Run with Docker Compose",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "nyBCG",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Two services, no Kubernetes on the host; the API stays on the Compose network.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "nJsri",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "k4OTHn",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "mqFko",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "XMUvf",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Set GAMEPLANE_REMOTE_ALLOWED_CIDRS to your API and gateway networks.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "AnFlw",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "ZfPYL",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "E2xb0",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Run exactly one gameplane-api container; never scale it.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "gNJrb",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "ZatCl",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Sr6oe",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Bootstrap the first admin against the same database volume.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "k4cwC",
+ "name": "Guide Section 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "Ww67A",
+ "name": "Section Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Keep the database and key apart",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "cSGrL",
+ "name": "Section Body 2",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Settings and credentials are encrypted with the panel key; recovery needs both halves.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "Q5ak2L",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "TyO4C",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "b83re",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Y8jRT7",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Back up the database and WAL files after stopping services.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "AWUc0",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "TE45d",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "kkCah",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Back up the panel key separately, with restricted access.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "yoxKU",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "npk5q",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "IfqcZ",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Provision the key outside database storage when you can.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "b05AFm",
+ "name": "Guide Section 3",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "tGAOW",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Register remote clusters",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "bGpxK",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Each target runs its own operator. The panel stores registrations in SQL, with no Cluster resource.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "uJQM4",
+ "name": "Quick Reference",
+ "width": "fill_container",
+ "fill": "$surface/tertiary",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 3,
+ "padding": 12,
+ "children": [
+ {
+ "type": "text",
+ "id": "mMtHe",
+ "name": "Quick Reference Label",
+ "fill": "$accent/accent",
+ "content": "STANDALONE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.6
+ },
+ {
+ "type": "text",
+ "id": "Io9zZ",
+ "name": "Quick Reference Line 1",
+ "fill": "$foreground/foreground",
+ "content": "01 Compose: set GAMEPLANE_REMOTE_ALLOWED_CIDRS, run one API",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "UciYF",
+ "name": "Quick Reference Line 2",
+ "fill": "$foreground/foreground",
+ "content": "02 Back up the database and panel key separately",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "nEigk",
+ "name": "Quick Reference Line 3",
+ "fill": "$foreground/foreground",
+ "content": "03 Register clusters with POST /clusters; grant per cluster",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "BTFOG",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "iOkFM",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "milestone",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "ErCN0",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Restore the database and key together; a new key cannot decrypt existing credentials.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YzcIM",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "ARYpc",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Rotate kubeconfigs and upgrade",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "TnQGi",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Rotate with PUT, then verify the cluster before revoking the old credential.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "N5gdW",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "J7g3o",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "k4alwm",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "v2Iiy1",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Use PUT /clusters/NAME/kubeconfig; the registration keeps its identity.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "oavLx",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "L8QEXB",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "XBBqf",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Verify required operations before revoking the old credential.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "g4QIn5",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "OAbhd",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "UcLxA",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Stop services and back up before upgrading; match remote operator versions.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "ci0bP",
+ "name": "Article Next Link",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "padding": [
+ 10,
+ 0,
+ 0,
+ 0
+ ],
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "fNKDe",
+ "name": "Next Link Text",
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "Sf2Zb",
+ "name": "Next Link Eyebrow",
+ "fill": "$field/placeholder",
+ "content": "NEXT GUIDE",
+ "fontFamily": "Geist",
+ "fontSize": 10,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "VCpU7",
+ "name": "Next Link Title",
+ "fill": "$foreground/foreground",
+ "content": "High availability and failure domains",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 13,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "icon",
+ "id": "ZIT9o",
+ "name": "Next Link Icon",
+ "width": 15,
+ "height": 15,
+ "icon": "arrow-right",
+ "library": "lucide",
+ "fill": "$muted"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "liArD",
+ "name": "Docs Page Aside",
+ "width": 250,
+ "layout": "vertical",
+ "gap": 16,
+ "children": [
+ {
+ "type": "frame",
+ "id": "LP7LV",
+ "name": "Docs Table of Contents",
+ "width": "fill_container",
+ "fill": "$surface/secondary",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 10,
+ "padding": 16,
+ "children": [
+ {
+ "type": "text",
+ "id": "vsIoY",
+ "name": "TOC Label",
+ "fill": "$field/placeholder",
+ "content": "ON THIS PAGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "F7NXy",
+ "name": "TOC Row 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "WtPj5",
+ "name": "TOC Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "nnh6u",
+ "name": "TOC Text 0",
+ "fill": "$foreground/foreground",
+ "content": "Compose",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "T3c3S1",
+ "name": "TOC Row 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "RMquy",
+ "name": "TOC Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "L78YR",
+ "name": "TOC Text 1",
+ "fill": "$muted",
+ "content": "Keys",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "g0YMDY",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Pf5Or",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "o8UsN",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Register",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Q9mj05",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Bts1U",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "s2Sh3v",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Credentials",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "rectangle",
+ "id": "pFRY1",
+ "name": "TOC Divider",
+ "fill": "$border/border",
+ "width": "fill_container",
+ "height": 1
+ },
+ {
+ "type": "text",
+ "id": "pzZra",
+ "name": "Coverage Label",
+ "fill": "$field/placeholder",
+ "content": "COVERS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "ROn2A",
+ "name": "Coverage Row 0",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "qHAol",
+ "name": "Coverage Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "Bs4Zv",
+ "name": "Coverage Text 0",
+ "fill": "$muted",
+ "content": "Compose",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "wdb5p",
+ "name": "Coverage Row 1",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "byxKO",
+ "name": "Coverage Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "GgrpR",
+ "name": "Coverage Text 1",
+ "fill": "$muted",
+ "content": "Registration",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "VTrJN",
+ "name": "Coverage Row 2",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "B4t6A",
+ "name": "Coverage Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "j2hwTD",
+ "name": "Coverage Text 2",
+ "fill": "$muted",
+ "content": "Keys",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "zIHX7",
+ "name": "Edit Page Card",
+ "width": "fill_container",
+ "fill": "$background/background",
+ "cornerRadius": "$radius/3xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 6,
+ "padding": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "uHDjX",
+ "name": "Edit Page Title",
+ "fill": "$foreground/foreground",
+ "content": "Improve this page",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 12,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "kobaP",
+ "name": "Edit Page Body",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Found a gap? Open a docs issue or suggest an edit on GitHub.",
+ "lineHeight": 1.4,
+ "fontFamily": "Geist",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "TdANt",
+ "name": "Edit Page Link",
+ "gap": 6,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "hPX3l",
+ "name": "Edit Page Link Text",
+ "fill": "$accent/soft-foreground",
+ "content": "Edit this page",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "500"
+ },
+ {
+ "type": "icon",
+ "id": "j7IG8a",
+ "name": "Edit Page Link Icon",
+ "width": 12,
+ "height": 12,
+ "icon": "external-link",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/website-export/json/yUfLD.json b/website-export/json/yUfLD.json
index 56ac628..9b06d18 100644
--- a/website-export/json/yUfLD.json
+++ b/website-export/json/yUfLD.json
@@ -2,14 +2,14 @@
"type": "frame",
"id": "yUfLD",
"x": 0,
- "y": 81928,
+ "y": 75700,
"name": "Screen/Docs — Notification Sinks",
"theme": {
"semantic": "dark"
},
"clip": true,
"width": 1440,
- "height": 900,
+ "height": 1000,
"fill": "$background/background",
"children": [
{
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -330,6 +330,154 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "iFA89",
+ "name": "Guide Section 1b Language",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "MYCYJ",
+ "name": "Section Title Language",
+ "fill": "$foreground/foreground",
+ "content": "Set the language per destination (v0.4.0)",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "S5glg1",
+ "name": "Section Body Language",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Each sink can have its own language. Its messages and test sends use it; sinks without one use the instance default, which falls back to English.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "jyeyF",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "M9gdl",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "vLR4T",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "UbvjT",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Discord, email and webhook messages follow the sink's language.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "s6Dp9",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "z07t6",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "GRzec",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Unsupported language tags are rejected with 400.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "KBC7p",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "E8rmHM",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "p2f0GY",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Kubernetes reason and message stay in English.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
{
"type": "frame",
"id": "H3Nk1",
diff --git a/website-export/json/ydcNa.json b/website-export/json/ydcNa.json
index 49a4f63..6030467 100644
--- a/website-export/json/ydcNa.json
+++ b/website-export/json/ydcNa.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "ydcNa",
"x": 0,
- "y": 73948,
+ "y": 68840,
"name": "Screen/Docs — Ownership & Danger Zone",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -175,7 +175,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Ownership, collaborators, transfer, wipe, and delete are available in v0.2.0-beta.8, where operator-role users can also run them on servers they don't own. From v0.3.0, transferring ownership, editing collaborators, wiping data and deleting a server need the server's owner or an admin. Servers with no recorded owner (for example created with kubectl or GitOps) can then be transferred, wiped or deleted only by an admin.",
+ "content": "Transferring ownership, editing collaborators, wiping data and deleting a server need the server's owner or an admin. Servers with no recorded owner (for example created with kubectl or GitOps) can be transferred, wiped or deleted only by an admin. In v0.2.0-beta.8 and earlier, operator-role users could also run these on servers they don't own.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -355,7 +355,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Select an existing user who accepts the server's data and operational obligations, then verify every downstream access path.",
+ "content": "Select an existing user who accepts the server’s data and operational obligations, then verify every downstream access path.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Wipe keeps configuration and resets world data; Delete removes the GameServer, workload, and data volume.",
+ "content": "Wipe keeps configuration and resets world data; Delete removes the GameServer, workload, and data volume. A wipe and a backup or restore of one server never overlap (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/json/yuCG9.json b/website-export/json/yuCG9.json
index 7988d95..c04542d 100644
--- a/website-export/json/yuCG9.json
+++ b/website-export/json/yuCG9.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "yuCG9",
"x": 0,
- "y": 40888,
+ "y": 39590,
"name": "Screen/Docs — Users, Auth & RBAC",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -435,7 +435,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Separate global administration from per-server collaboration.",
+ "content": "Separate global administration from per-server collaboration. Only * holders grant admin-level permissions.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
diff --git a/website-export/json/z6p3NP.json b/website-export/json/z6p3NP.json
index a5e2510..4dd59a9 100644
--- a/website-export/json/z6p3NP.json
+++ b/website-export/json/z6p3NP.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "z6p3NP",
"x": 0,
- "y": 92188,
+ "y": 84620,
"name": "Screen/Docs — Database Migrations",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -319,7 +319,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Embedded migration SQL runs in filename order at startup.",
+ "content": "Shared SQL in migrations/common/ runs in filename order after the per-driver sets.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -539,7 +539,7 @@
"id": "p2LgJ",
"name": "Quick Reference Line 1",
"fill": "$foreground/foreground",
- "content": "01 api/internal/db/migrations/006_.sql",
+ "content": "01 api/internal/db/migrations/common/020_.sql",
"fontFamily": "JetBrains Mono",
"fontSize": 11.5,
"fontWeight": "normal"
diff --git a/website-export/json/zeM79.json b/website-export/json/zeM79.json
index f223afe..9ef2b10 100644
--- a/website-export/json/zeM79.json
+++ b/website-export/json/zeM79.json
@@ -2,7 +2,7 @@
"type": "frame",
"id": "zeM79",
"x": 0,
- "y": 61408,
+ "y": 57800,
"name": "Screen/Docs — Air-gapped Installation",
"theme": {
"semantic": "dark"
@@ -124,7 +124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -503,7 +503,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "New installs report to telemetry.gameplane.net; turn it off at install time so an offline cluster never retries.",
+ "content": "New installs report to telemetry.gameplane.net; an empty endpoint uses it too. Turn it off at install so offline clusters never retry.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
diff --git a/website-export/screenshots/A2sAtw.png b/website-export/screenshots/A2sAtw.png
index efc6cc2..e36d2af 100644
Binary files a/website-export/screenshots/A2sAtw.png and b/website-export/screenshots/A2sAtw.png differ
diff --git a/website-export/screenshots/AKe02.png b/website-export/screenshots/AKe02.png
index 4124160..4f9db0b 100644
Binary files a/website-export/screenshots/AKe02.png and b/website-export/screenshots/AKe02.png differ
diff --git a/website-export/screenshots/B39hL.png b/website-export/screenshots/B39hL.png
index 0a56037..d9b51fb 100644
Binary files a/website-export/screenshots/B39hL.png and b/website-export/screenshots/B39hL.png differ
diff --git a/website-export/screenshots/BBcwU.png b/website-export/screenshots/BBcwU.png
index 22b392a..848f1ba 100644
Binary files a/website-export/screenshots/BBcwU.png and b/website-export/screenshots/BBcwU.png differ
diff --git a/website-export/screenshots/BEcZK.png b/website-export/screenshots/BEcZK.png
index aa9b259..b239aa1 100644
Binary files a/website-export/screenshots/BEcZK.png and b/website-export/screenshots/BEcZK.png differ
diff --git a/website-export/screenshots/BlviB.png b/website-export/screenshots/BlviB.png
index 601130b..9ff6187 100644
Binary files a/website-export/screenshots/BlviB.png and b/website-export/screenshots/BlviB.png differ
diff --git a/website-export/screenshots/Bnjed.png b/website-export/screenshots/Bnjed.png
index f997855..377bfcc 100644
Binary files a/website-export/screenshots/Bnjed.png and b/website-export/screenshots/Bnjed.png differ
diff --git a/website-export/screenshots/CuW6O.png b/website-export/screenshots/CuW6O.png
index 02cc465..7c2d059 100644
Binary files a/website-export/screenshots/CuW6O.png and b/website-export/screenshots/CuW6O.png differ
diff --git a/website-export/screenshots/D4SNhN.png b/website-export/screenshots/D4SNhN.png
index d3b332b..0d8423e 100644
Binary files a/website-export/screenshots/D4SNhN.png and b/website-export/screenshots/D4SNhN.png differ
diff --git a/website-export/screenshots/Dnjfp.png b/website-export/screenshots/Dnjfp.png
index 8b22d65..ca799c4 100644
Binary files a/website-export/screenshots/Dnjfp.png and b/website-export/screenshots/Dnjfp.png differ
diff --git a/website-export/screenshots/EWLk2.png b/website-export/screenshots/EWLk2.png
index 8da97d9..fae806d 100644
Binary files a/website-export/screenshots/EWLk2.png and b/website-export/screenshots/EWLk2.png differ
diff --git a/website-export/screenshots/F7wFpj.png b/website-export/screenshots/F7wFpj.png
index f2feb99..e45ce28 100644
Binary files a/website-export/screenshots/F7wFpj.png and b/website-export/screenshots/F7wFpj.png differ
diff --git a/website-export/screenshots/FUcVx.png b/website-export/screenshots/FUcVx.png
index 63502d1..352b068 100644
Binary files a/website-export/screenshots/FUcVx.png and b/website-export/screenshots/FUcVx.png differ
diff --git a/website-export/screenshots/FclAt.png b/website-export/screenshots/FclAt.png
index c60da70..73844a2 100644
Binary files a/website-export/screenshots/FclAt.png and b/website-export/screenshots/FclAt.png differ
diff --git a/website-export/screenshots/Gx9Xj.png b/website-export/screenshots/Gx9Xj.png
index f805d23..4afa79f 100644
Binary files a/website-export/screenshots/Gx9Xj.png and b/website-export/screenshots/Gx9Xj.png differ
diff --git a/website-export/screenshots/H8zQ2X.png b/website-export/screenshots/H8zQ2X.png
new file mode 100644
index 0000000..4117073
Binary files /dev/null and b/website-export/screenshots/H8zQ2X.png differ
diff --git a/website-export/screenshots/HpLFh.png b/website-export/screenshots/HpLFh.png
index a08fd3e..ca971a3 100644
Binary files a/website-export/screenshots/HpLFh.png and b/website-export/screenshots/HpLFh.png differ
diff --git a/website-export/screenshots/IEkUB.png b/website-export/screenshots/IEkUB.png
index ce44782..a8b5964 100644
Binary files a/website-export/screenshots/IEkUB.png and b/website-export/screenshots/IEkUB.png differ
diff --git a/website-export/screenshots/IGuE6.png b/website-export/screenshots/IGuE6.png
index 379823a..7b1c427 100644
Binary files a/website-export/screenshots/IGuE6.png and b/website-export/screenshots/IGuE6.png differ
diff --git a/website-export/screenshots/IwY6K.png b/website-export/screenshots/IwY6K.png
index 3439e3d..604addb 100644
Binary files a/website-export/screenshots/IwY6K.png and b/website-export/screenshots/IwY6K.png differ
diff --git a/website-export/screenshots/JjbY2.png b/website-export/screenshots/JjbY2.png
index 08773d3..aa9b2ba 100644
Binary files a/website-export/screenshots/JjbY2.png and b/website-export/screenshots/JjbY2.png differ
diff --git a/website-export/screenshots/K6tq5Z.png b/website-export/screenshots/K6tq5Z.png
index 29049ae..639de32 100644
Binary files a/website-export/screenshots/K6tq5Z.png and b/website-export/screenshots/K6tq5Z.png differ
diff --git a/website-export/screenshots/KFLCi.png b/website-export/screenshots/KFLCi.png
index 6dc572d..4cf562a 100644
Binary files a/website-export/screenshots/KFLCi.png and b/website-export/screenshots/KFLCi.png differ
diff --git a/website-export/screenshots/KvC6V.png b/website-export/screenshots/KvC6V.png
index 77a74f9..bad3bb2 100644
Binary files a/website-export/screenshots/KvC6V.png and b/website-export/screenshots/KvC6V.png differ
diff --git a/website-export/screenshots/M3eBWD.png b/website-export/screenshots/M3eBWD.png
index 5c5057c..fa2dd1c 100644
Binary files a/website-export/screenshots/M3eBWD.png and b/website-export/screenshots/M3eBWD.png differ
diff --git a/website-export/screenshots/N4TBV.png b/website-export/screenshots/N4TBV.png
index b1765fe..b4c014b 100644
Binary files a/website-export/screenshots/N4TBV.png and b/website-export/screenshots/N4TBV.png differ
diff --git a/website-export/screenshots/Nnd3Y.png b/website-export/screenshots/Nnd3Y.png
index bc84c06..1771e3e 100644
Binary files a/website-export/screenshots/Nnd3Y.png and b/website-export/screenshots/Nnd3Y.png differ
diff --git a/website-export/screenshots/OIN7m.png b/website-export/screenshots/OIN7m.png
index ea08e44..0512745 100644
Binary files a/website-export/screenshots/OIN7m.png and b/website-export/screenshots/OIN7m.png differ
diff --git a/website-export/screenshots/P5qsD.png b/website-export/screenshots/P5qsD.png
index 3a798b3..4c30747 100644
Binary files a/website-export/screenshots/P5qsD.png and b/website-export/screenshots/P5qsD.png differ
diff --git a/website-export/screenshots/PSdPq.png b/website-export/screenshots/PSdPq.png
index 209e235..6962e06 100644
Binary files a/website-export/screenshots/PSdPq.png and b/website-export/screenshots/PSdPq.png differ
diff --git a/website-export/screenshots/QHFdH.png b/website-export/screenshots/QHFdH.png
index 435d896..aa9469d 100644
Binary files a/website-export/screenshots/QHFdH.png and b/website-export/screenshots/QHFdH.png differ
diff --git a/website-export/screenshots/Qczsa.png b/website-export/screenshots/Qczsa.png
index 906c399..4b2157d 100644
Binary files a/website-export/screenshots/Qczsa.png and b/website-export/screenshots/Qczsa.png differ
diff --git a/website-export/screenshots/QdLzE.png b/website-export/screenshots/QdLzE.png
index cef6f9b..ec37d15 100644
Binary files a/website-export/screenshots/QdLzE.png and b/website-export/screenshots/QdLzE.png differ
diff --git a/website-export/screenshots/SKMOT.png b/website-export/screenshots/SKMOT.png
index dfe7b25..487abcb 100644
Binary files a/website-export/screenshots/SKMOT.png and b/website-export/screenshots/SKMOT.png differ
diff --git a/website-export/screenshots/SmOzJ.png b/website-export/screenshots/SmOzJ.png
index f6a120a..b1163b9 100644
Binary files a/website-export/screenshots/SmOzJ.png and b/website-export/screenshots/SmOzJ.png differ
diff --git a/website-export/screenshots/TESyw.png b/website-export/screenshots/TESyw.png
index ba4f723..42dc1d4 100644
Binary files a/website-export/screenshots/TESyw.png and b/website-export/screenshots/TESyw.png differ
diff --git a/website-export/screenshots/U8xlE8.png b/website-export/screenshots/U8xlE8.png
index df4786f..24d8f57 100644
Binary files a/website-export/screenshots/U8xlE8.png and b/website-export/screenshots/U8xlE8.png differ
diff --git a/website-export/screenshots/VgF1s.png b/website-export/screenshots/VgF1s.png
index 39f0edd..f1738d5 100644
Binary files a/website-export/screenshots/VgF1s.png and b/website-export/screenshots/VgF1s.png differ
diff --git a/website-export/screenshots/VtYGz.png b/website-export/screenshots/VtYGz.png
index 064739b..7e97817 100644
Binary files a/website-export/screenshots/VtYGz.png and b/website-export/screenshots/VtYGz.png differ
diff --git a/website-export/screenshots/W3y92.png b/website-export/screenshots/W3y92.png
index d846992..fc5b307 100644
Binary files a/website-export/screenshots/W3y92.png and b/website-export/screenshots/W3y92.png differ
diff --git a/website-export/screenshots/W5p4Z1.png b/website-export/screenshots/W5p4Z1.png
index 5713718..fa0d2f9 100644
Binary files a/website-export/screenshots/W5p4Z1.png and b/website-export/screenshots/W5p4Z1.png differ
diff --git a/website-export/screenshots/X0DeYH.png b/website-export/screenshots/X0DeYH.png
index ea22c7c..0aaf237 100644
Binary files a/website-export/screenshots/X0DeYH.png and b/website-export/screenshots/X0DeYH.png differ
diff --git a/website-export/screenshots/Yemnl.png b/website-export/screenshots/Yemnl.png
index c6f8b2d..8d239f9 100644
Binary files a/website-export/screenshots/Yemnl.png and b/website-export/screenshots/Yemnl.png differ
diff --git a/website-export/screenshots/Yog9e.png b/website-export/screenshots/Yog9e.png
index 763967a..e874a5f 100644
Binary files a/website-export/screenshots/Yog9e.png and b/website-export/screenshots/Yog9e.png differ
diff --git a/website-export/screenshots/ZTnNa.png b/website-export/screenshots/ZTnNa.png
index 0499b7b..d30f7e7 100644
Binary files a/website-export/screenshots/ZTnNa.png and b/website-export/screenshots/ZTnNa.png differ
diff --git a/website-export/screenshots/Znh8i.png b/website-export/screenshots/Znh8i.png
index 3ee8227..87f7eea 100644
Binary files a/website-export/screenshots/Znh8i.png and b/website-export/screenshots/Znh8i.png differ
diff --git a/website-export/screenshots/ZwM1N.png b/website-export/screenshots/ZwM1N.png
index 4be2d17..cf59da1 100644
Binary files a/website-export/screenshots/ZwM1N.png and b/website-export/screenshots/ZwM1N.png differ
diff --git a/website-export/screenshots/a0X2rT.png b/website-export/screenshots/a0X2rT.png
index afcb4e5..f864597 100644
Binary files a/website-export/screenshots/a0X2rT.png and b/website-export/screenshots/a0X2rT.png differ
diff --git a/website-export/screenshots/a33qlt.png b/website-export/screenshots/a33qlt.png
index 4dfb0ef..6d9adee 100644
Binary files a/website-export/screenshots/a33qlt.png and b/website-export/screenshots/a33qlt.png differ
diff --git a/website-export/screenshots/aZAEs.png b/website-export/screenshots/aZAEs.png
index c0efffd..05b4f85 100644
Binary files a/website-export/screenshots/aZAEs.png and b/website-export/screenshots/aZAEs.png differ
diff --git a/website-export/screenshots/ac8lF.png b/website-export/screenshots/ac8lF.png
index 51a39be..ca8b3bd 100644
Binary files a/website-export/screenshots/ac8lF.png and b/website-export/screenshots/ac8lF.png differ
diff --git a/website-export/screenshots/b5srx.png b/website-export/screenshots/b5srx.png
index 580cbce..cd62d12 100644
Binary files a/website-export/screenshots/b5srx.png and b/website-export/screenshots/b5srx.png differ
diff --git a/website-export/screenshots/b5u3Ui.png b/website-export/screenshots/b5u3Ui.png
index fc3ded5..ef7fb61 100644
Binary files a/website-export/screenshots/b5u3Ui.png and b/website-export/screenshots/b5u3Ui.png differ
diff --git a/website-export/screenshots/b7zNA.png b/website-export/screenshots/b7zNA.png
index fcec006..8a8cb00 100644
Binary files a/website-export/screenshots/b7zNA.png and b/website-export/screenshots/b7zNA.png differ
diff --git a/website-export/screenshots/cUrQn.png b/website-export/screenshots/cUrQn.png
index 7198433..7774241 100644
Binary files a/website-export/screenshots/cUrQn.png and b/website-export/screenshots/cUrQn.png differ
diff --git a/website-export/screenshots/cpCjN.png b/website-export/screenshots/cpCjN.png
index 83aee3f..dfdf02e 100644
Binary files a/website-export/screenshots/cpCjN.png and b/website-export/screenshots/cpCjN.png differ
diff --git a/website-export/screenshots/deVW7.png b/website-export/screenshots/deVW7.png
index 0c9e625..df52b30 100644
Binary files a/website-export/screenshots/deVW7.png and b/website-export/screenshots/deVW7.png differ
diff --git a/website-export/screenshots/e1SUXK.png b/website-export/screenshots/e1SUXK.png
index b75729d..302ebcb 100644
Binary files a/website-export/screenshots/e1SUXK.png and b/website-export/screenshots/e1SUXK.png differ
diff --git a/website-export/screenshots/e8fTgD.png b/website-export/screenshots/e8fTgD.png
index b8fc037..f1f0d07 100644
Binary files a/website-export/screenshots/e8fTgD.png and b/website-export/screenshots/e8fTgD.png differ
diff --git a/website-export/screenshots/eDaA6.png b/website-export/screenshots/eDaA6.png
index c522252..6d1bca4 100644
Binary files a/website-export/screenshots/eDaA6.png and b/website-export/screenshots/eDaA6.png differ
diff --git a/website-export/screenshots/eQ4ES.png b/website-export/screenshots/eQ4ES.png
index 2ebe4f2..c9eacb9 100644
Binary files a/website-export/screenshots/eQ4ES.png and b/website-export/screenshots/eQ4ES.png differ
diff --git a/website-export/screenshots/eSsXv.png b/website-export/screenshots/eSsXv.png
index 31e3157..5601818 100644
Binary files a/website-export/screenshots/eSsXv.png and b/website-export/screenshots/eSsXv.png differ
diff --git a/website-export/screenshots/ei1qC.png b/website-export/screenshots/ei1qC.png
index 144c548..3a4f85d 100644
Binary files a/website-export/screenshots/ei1qC.png and b/website-export/screenshots/ei1qC.png differ
diff --git a/website-export/screenshots/g8vHa.png b/website-export/screenshots/g8vHa.png
index 3247540..48516e2 100644
Binary files a/website-export/screenshots/g8vHa.png and b/website-export/screenshots/g8vHa.png differ
diff --git a/website-export/screenshots/gEOuV.png b/website-export/screenshots/gEOuV.png
index adbaf66..7cb6af5 100644
Binary files a/website-export/screenshots/gEOuV.png and b/website-export/screenshots/gEOuV.png differ
diff --git a/website-export/screenshots/gnZrl.png b/website-export/screenshots/gnZrl.png
index 275feb0..b50b606 100644
Binary files a/website-export/screenshots/gnZrl.png and b/website-export/screenshots/gnZrl.png differ
diff --git a/website-export/screenshots/h0PWaP.png b/website-export/screenshots/h0PWaP.png
index 0dacb5b..4d6bd93 100644
Binary files a/website-export/screenshots/h0PWaP.png and b/website-export/screenshots/h0PWaP.png differ
diff --git a/website-export/screenshots/hnTHJ.png b/website-export/screenshots/hnTHJ.png
index 8c46783..55cdea9 100644
Binary files a/website-export/screenshots/hnTHJ.png and b/website-export/screenshots/hnTHJ.png differ
diff --git a/website-export/screenshots/iif2F.png b/website-export/screenshots/iif2F.png
index d52f4bc..a2b29d1 100644
Binary files a/website-export/screenshots/iif2F.png and b/website-export/screenshots/iif2F.png differ
diff --git a/website-export/screenshots/ivU89.png b/website-export/screenshots/ivU89.png
index 3d80703..78f3d92 100644
Binary files a/website-export/screenshots/ivU89.png and b/website-export/screenshots/ivU89.png differ
diff --git a/website-export/screenshots/kSyrZ.png b/website-export/screenshots/kSyrZ.png
index 14c4792..f903461 100644
Binary files a/website-export/screenshots/kSyrZ.png and b/website-export/screenshots/kSyrZ.png differ
diff --git a/website-export/screenshots/kTRsn.png b/website-export/screenshots/kTRsn.png
index 45e0836..d51eb1b 100644
Binary files a/website-export/screenshots/kTRsn.png and b/website-export/screenshots/kTRsn.png differ
diff --git a/website-export/screenshots/l1vmU.png b/website-export/screenshots/l1vmU.png
index 95bf238..eff80f8 100644
Binary files a/website-export/screenshots/l1vmU.png and b/website-export/screenshots/l1vmU.png differ
diff --git a/website-export/screenshots/lRCKI.png b/website-export/screenshots/lRCKI.png
index 630f49a..76633b7 100644
Binary files a/website-export/screenshots/lRCKI.png and b/website-export/screenshots/lRCKI.png differ
diff --git a/website-export/screenshots/mYDXb.png b/website-export/screenshots/mYDXb.png
index e3aa2e0..54cd9b0 100644
Binary files a/website-export/screenshots/mYDXb.png and b/website-export/screenshots/mYDXb.png differ
diff --git a/website-export/screenshots/mu58o.png b/website-export/screenshots/mu58o.png
index 41f6dd9..14a1b1b 100644
Binary files a/website-export/screenshots/mu58o.png and b/website-export/screenshots/mu58o.png differ
diff --git a/website-export/screenshots/n8pnD.png b/website-export/screenshots/n8pnD.png
index 7f47950..7f99f3e 100644
Binary files a/website-export/screenshots/n8pnD.png and b/website-export/screenshots/n8pnD.png differ
diff --git a/website-export/screenshots/ncP9x.png b/website-export/screenshots/ncP9x.png
index 12c0097..aaea308 100644
Binary files a/website-export/screenshots/ncP9x.png and b/website-export/screenshots/ncP9x.png differ
diff --git a/website-export/screenshots/o5zdzd.png b/website-export/screenshots/o5zdzd.png
index 26a8557..88fc38d 100644
Binary files a/website-export/screenshots/o5zdzd.png and b/website-export/screenshots/o5zdzd.png differ
diff --git a/website-export/screenshots/o7PQv.png b/website-export/screenshots/o7PQv.png
index e8a63c7..158733a 100644
Binary files a/website-export/screenshots/o7PQv.png and b/website-export/screenshots/o7PQv.png differ
diff --git a/website-export/screenshots/oX22m.png b/website-export/screenshots/oX22m.png
index 18d91b5..0066c99 100644
Binary files a/website-export/screenshots/oX22m.png and b/website-export/screenshots/oX22m.png differ
diff --git a/website-export/screenshots/oi58h.png b/website-export/screenshots/oi58h.png
index 004d11c..8f71dff 100644
Binary files a/website-export/screenshots/oi58h.png and b/website-export/screenshots/oi58h.png differ
diff --git a/website-export/screenshots/opatX.png b/website-export/screenshots/opatX.png
index c95d81c..f99edce 100644
Binary files a/website-export/screenshots/opatX.png and b/website-export/screenshots/opatX.png differ
diff --git a/website-export/screenshots/p5Gci.png b/website-export/screenshots/p5Gci.png
index 6a464cd..b776b27 100644
Binary files a/website-export/screenshots/p5Gci.png and b/website-export/screenshots/p5Gci.png differ
diff --git a/website-export/screenshots/qXFiI.png b/website-export/screenshots/qXFiI.png
index d22bd74..3e037c9 100644
Binary files a/website-export/screenshots/qXFiI.png and b/website-export/screenshots/qXFiI.png differ
diff --git a/website-export/screenshots/r4WPE.png b/website-export/screenshots/r4WPE.png
index c53117e..60a4276 100644
Binary files a/website-export/screenshots/r4WPE.png and b/website-export/screenshots/r4WPE.png differ
diff --git a/website-export/screenshots/rW1Ux.png b/website-export/screenshots/rW1Ux.png
index 3e10e97..d14a644 100644
Binary files a/website-export/screenshots/rW1Ux.png and b/website-export/screenshots/rW1Ux.png differ
diff --git a/website-export/screenshots/rqx1v.png b/website-export/screenshots/rqx1v.png
index 3e92def..e398cb4 100644
Binary files a/website-export/screenshots/rqx1v.png and b/website-export/screenshots/rqx1v.png differ
diff --git a/website-export/screenshots/s0Q7Lf.png b/website-export/screenshots/s0Q7Lf.png
index 09e0e82..8eab8dd 100644
Binary files a/website-export/screenshots/s0Q7Lf.png and b/website-export/screenshots/s0Q7Lf.png differ
diff --git a/website-export/screenshots/s3NwF.png b/website-export/screenshots/s3NwF.png
index f0473f4..bb187fd 100644
Binary files a/website-export/screenshots/s3NwF.png and b/website-export/screenshots/s3NwF.png differ
diff --git a/website-export/screenshots/tfxmL.png b/website-export/screenshots/tfxmL.png
index 53db459..defe596 100644
Binary files a/website-export/screenshots/tfxmL.png and b/website-export/screenshots/tfxmL.png differ
diff --git a/website-export/screenshots/upO5i.png b/website-export/screenshots/upO5i.png
index 58021f8..c0ac39b 100644
Binary files a/website-export/screenshots/upO5i.png and b/website-export/screenshots/upO5i.png differ
diff --git a/website-export/screenshots/vAYOC.png b/website-export/screenshots/vAYOC.png
index 7796fc3..6b74bf1 100644
Binary files a/website-export/screenshots/vAYOC.png and b/website-export/screenshots/vAYOC.png differ
diff --git a/website-export/screenshots/vh8hz.png b/website-export/screenshots/vh8hz.png
index fa4d0f7..1c96c52 100644
Binary files a/website-export/screenshots/vh8hz.png and b/website-export/screenshots/vh8hz.png differ
diff --git a/website-export/screenshots/vqKLi.png b/website-export/screenshots/vqKLi.png
index 9b13c10..657513e 100644
Binary files a/website-export/screenshots/vqKLi.png and b/website-export/screenshots/vqKLi.png differ
diff --git a/website-export/screenshots/w7kbJ.png b/website-export/screenshots/w7kbJ.png
index d455644..21a00ea 100644
Binary files a/website-export/screenshots/w7kbJ.png and b/website-export/screenshots/w7kbJ.png differ
diff --git a/website-export/screenshots/wCt6V.png b/website-export/screenshots/wCt6V.png
index 958c200..e8bf44e 100644
Binary files a/website-export/screenshots/wCt6V.png and b/website-export/screenshots/wCt6V.png differ
diff --git a/website-export/screenshots/wvEgh.png b/website-export/screenshots/wvEgh.png
index 1dd42e1..1b1a218 100644
Binary files a/website-export/screenshots/wvEgh.png and b/website-export/screenshots/wvEgh.png differ
diff --git a/website-export/screenshots/xA0uh.png b/website-export/screenshots/xA0uh.png
new file mode 100644
index 0000000..e77b712
Binary files /dev/null and b/website-export/screenshots/xA0uh.png differ
diff --git a/website-export/screenshots/yUfLD.png b/website-export/screenshots/yUfLD.png
index a29fc01..9a530e3 100644
Binary files a/website-export/screenshots/yUfLD.png and b/website-export/screenshots/yUfLD.png differ
diff --git a/website-export/screenshots/ydcNa.png b/website-export/screenshots/ydcNa.png
index 47bdcef..7d01e2d 100644
Binary files a/website-export/screenshots/ydcNa.png and b/website-export/screenshots/ydcNa.png differ
diff --git a/website-export/screenshots/yuCG9.png b/website-export/screenshots/yuCG9.png
index 5f04e41..a583d96 100644
Binary files a/website-export/screenshots/yuCG9.png and b/website-export/screenshots/yuCG9.png differ
diff --git a/website-export/screenshots/z6p3NP.png b/website-export/screenshots/z6p3NP.png
index 9f124d8..4305b2f 100644
Binary files a/website-export/screenshots/z6p3NP.png and b/website-export/screenshots/z6p3NP.png differ
diff --git a/website-export/screenshots/zeM79.png b/website-export/screenshots/zeM79.png
index a598543..eea8b9f 100644
Binary files a/website-export/screenshots/zeM79.png and b/website-export/screenshots/zeM79.png differ
diff --git a/website.pen b/website.pen
index bb1bc20..d0e77a2 100644
--- a/website.pen
+++ b/website.pen
@@ -1,5 +1,5 @@
{
- "version": "2.20",
+ "version": "2.21",
"children": [
{
"type": "frame",
@@ -89,7 +89,7 @@
"ref": "X4Xyl",
"descendants": {
"W2qoN": {
- "content": "v0.2.0-beta.8 — actively developed"
+ "content": "v0.4.0 — actively developed"
}
}
},
@@ -182,7 +182,7 @@
"id": "Or7du",
"name": "Helper",
"fill": "$muted",
- "content": "Issues and PRs welcome — beta software, expect rough edges.",
+ "content": "Issues and PRs welcome — pre-v1 software, expect rough edges.",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
@@ -428,7 +428,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Eight purpose-built CRDs — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, and ModuleSource — reconciled by one operator. kubectl apply and the dashboard always agree.",
+ "content": "Nine purpose-built CRDs — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, ModuleSource, and NetworkCapture — reconciled by one operator. kubectl apply and the dashboard always agree.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -732,7 +732,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Versioned templates distributed as OCI bundles. Sixteen games ship out of the box — bring your own game via the template format.",
+ "content": "Versioned templates distributed as OCI bundles. Twenty-nine games ship out of the box — bring your own game via the template format.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -791,7 +791,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Local accounts or OIDC (Keycloak, Google, GitHub), three built-in roles, namespace-scoped authorization.",
+ "content": "Local accounts or OIDC (Keycloak, Authentik, Google, Okta, Entra ID), three built-in roles, namespace-scoped authorization.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -1029,7 +1029,7 @@
"type": "text",
"id": "ozONO",
"fill": "$foreground/foreground",
- "content": " oci://ghcr.io/valgulnecron/charts/gameplane \\",
+ "content": " oci://ghcr.io/gameplanepanel/charts/gameplane \\",
"fontFamily": "$typography/font-mono",
"fontSize": 14,
"fontWeight": "normal"
@@ -1038,7 +1038,7 @@
"type": "text",
"id": "qAKmm",
"fill": "$muted",
- "content": " --version 0.2.0-beta.8 \\",
+ "content": " --version 0.4.0 \\",
"fontFamily": "$typography/font-mono",
"fontSize": 14,
"fontWeight": "normal"
@@ -2160,7 +2160,7 @@
"type": "frame",
"id": "iif2F",
"x": 0,
- "y": 3719,
+ "y": 3550,
"name": "Screen/Docs — Getting Started",
"theme": {
"semantic": "dark"
@@ -2347,7 +2347,7 @@
"type": "text",
"id": "rlUsL",
"fill": "$foreground/foreground",
- "content": " oci://ghcr.io/valgulnecron/charts/gameplane \\",
+ "content": " oci://ghcr.io/gameplanepanel/charts/gameplane \\",
"fontFamily": "$typography/font-mono",
"fontSize": 13,
"fontWeight": "normal"
@@ -2356,7 +2356,7 @@
"type": "text",
"id": "GXUF4",
"fill": "$foreground/foreground",
- "content": " --version 0.2.0-beta.8 \\",
+ "content": " --version 0.4.0 \\",
"fontFamily": "$typography/font-mono",
"fontSize": 13,
"fontWeight": "normal"
@@ -2487,7 +2487,7 @@
"type": "frame",
"id": "eSsXv",
"x": 0,
- "y": 4859,
+ "y": 4530,
"name": "Screen/Docs — Home",
"theme": {
"semantic": "dark"
@@ -4205,7 +4205,7 @@
"type": "frame",
"id": "OIN7m",
"x": 0,
- "y": 5999,
+ "y": 5510,
"name": "Screen/Docs — Architecture",
"theme": {
"semantic": "dark"
@@ -4773,7 +4773,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "ModuleSource CRs declare where templates come from — OCI registry, git, HTTP, local, or dashboard upload.",
+ "content": "ModuleSource CRs declare where templates come from — OCI registry, git, HTTP, local, or dashboard upload. Standalone panels need a registered cluster for module operations.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -4804,7 +4804,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "One central API and dashboard can manage independent clusters registered as Cluster resources. Each target cluster runs its own operator, and optionally a private gateway built from the API image. The gateway has no database, no user login and no browser or admin routes. Users authenticate only to the central API, which stays the authorization authority.",
+ "content": "One central API and dashboard can manage independent clusters, registered as Cluster resources or, in a standalone panel, in its database. Each target cluster runs its own operator, and optionally a private gateway built from the API image. The gateway has no database, no user login and no browser or admin routes. Users authenticate only to the central API, which stays the authorization authority.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -4929,7 +4929,7 @@
"type": "frame",
"id": "KFLCi",
"x": 0,
- "y": 7139,
+ "y": 6590,
"name": "Screen/Docs — Security",
"theme": {
"semantic": "dark"
@@ -5096,7 +5096,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Permission-based RBAC with admin/operator/viewer roles, scoped per namespace or cluster-wide. Registering a cluster grants no user access by itself: remote access uses supplemental per-cluster grants, and a global union of permission names never authorizes a row in another cluster.",
+ "content": "Permission-based RBAC with admin/operator/viewer roles, scoped per namespace or cluster-wide. Registering a cluster grants no user access by itself, and a global permission union never authorizes another cluster's rows. Admin permissions can be granted only by a `*` holder (v0.4.0).",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -5304,7 +5304,7 @@
"type": "frame",
"id": "vAYOC",
"x": 0,
- "y": 8279,
+ "y": 7570,
"name": "Screen/Docs — Module Authoring",
"theme": {
"semantic": "dark"
@@ -5409,7 +5409,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "A module directory holds template.yaml, module.yaml, an optional README, and an optional icon.",
+ "content": "A module directory holds template.yaml, module.yaml, an optional README, icon, and locales (v0.4.0).",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -5500,7 +5500,7 @@
"type": "text",
"id": "klpAX",
"fill": "$foreground/foreground",
- "content": " ghcr.io/valgulnecron/gameplane-modules/minecraft-java:1.0.0 \\",
+ "content": " ghcr.io/gameplanepanel/gameplane-modules/minecraft-java:1.0.0 \\",
"fontFamily": "$typography/font-mono",
"fontSize": 13,
"fontWeight": "normal"
@@ -5541,7 +5541,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "An OCI artifact with named layers, tagged application/vnd.gameplane.module.v1+json.",
+ "content": "An OCI artifact with named layers, including optional locales (v0.4.0), tagged application/vnd.gameplane.module.v1+json.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -5666,7 +5666,7 @@
"type": "frame",
"id": "N4TBV",
"x": 0,
- "y": 9419,
+ "y": 8550,
"name": "Screen/Docs — Contributing",
"theme": {
"semantic": "dark"
@@ -5924,6 +5924,37 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "SQjeX",
+ "name": "Translations section",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "xsjAd",
+ "fill": "$foreground/foreground",
+ "content": "Translations",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 18,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "HaW1z",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Language packs live in i18n/locales// and need no code changes. A language appears in the picker once 80% of its messages are translated.",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 14,
+ "fontWeight": "normal"
+ }
+ ]
+ },
{
"type": "frame",
"id": "ceKhm",
@@ -6072,7 +6103,7 @@
"type": "frame",
"id": "HpLFh",
"x": 0,
- "y": 10559,
+ "y": 9590,
"name": "Screen/Docs — Comparison",
"theme": {
"semantic": "dark"
@@ -6205,7 +6236,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "AMP",
+ "content": "PTERODACTYL",
"fontFamily": "$typography/font-mono",
"fontSize": 10,
"fontWeight": "600",
@@ -6217,7 +6248,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "PTERODACTYL",
+ "content": "CUBECODERS AMP",
"fontFamily": "$typography/font-mono",
"fontSize": 10,
"fontWeight": "600",
@@ -6229,7 +6260,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "PUFFERPANEL",
+ "content": "AGONES",
"fontFamily": "$typography/font-mono",
"fontSize": 10,
"fontWeight": "600",
@@ -6272,7 +6303,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Kubernetes-native CRDs and controller-runtime operator; scales from k3s homelab to multi-node clusters. [BETA]",
+ "content": "Kubernetes-native CRDs and controller-runtime operator; scales from k3s homelab to multi-node clusters.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -6667,7 +6698,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 30 ready-to-use templates on master (16 in v0.2.0-beta.8; the other 14 arrive in v0.3.0).",
+ "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 29 ready-to-use templates in v0.4.0 (16 in v0.2.0-beta.8; 14 added in v0.3.0; Hell Let Loose withdrawn in v0.4.0).",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -6746,7 +6777,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Cluster CRD for remote registration and health checks; in v0.2.0-beta.8 console/log streaming is local-cluster only. From v0.3.0: remote Pod logs/PTY, optional private gateway, and unified dashboard with location filters.",
+ "content": "Cluster CRD for remote registration and health checks; local-only streaming in v0.2.0-beta.8, then remote Pod logs/PTY, private gateway and unified dashboard from v0.3.0. From v0.4.0: a central panel runs without a local cluster; a Nodes page lists all clusters.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -7079,7 +7110,7 @@
"type": "frame",
"id": "b5srx",
"x": 0,
- "y": 11699,
+ "y": 10950,
"name": "Screen/Docs — Roadmap",
"theme": {
"semantic": "dark"
@@ -7172,7 +7203,7 @@
"type": "text",
"id": "Cd5C8",
"fill": "$foreground/foreground",
- "content": "Beta status — v0.2.0-beta.8",
+ "content": "Pre-v1 status — v0.4.0",
"fontFamily": "$typography/font-mono",
"fontSize": 16,
"fontWeight": "600"
@@ -7234,7 +7265,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "WebSocket console/log/file streams are local-cluster-scoped in v0.2.0-beta.8 — remote clusters are registered and health-checked but not yet streamed. v0.3.0 adds remote access through an optional agent gateway.",
+ "content": "Users page: Service accounts and Identity providers tabs are placeholders, planned for v1.1 (OIDC is managed under Admin Settings → Authentication).",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -7266,7 +7297,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The PostgreSQL driver is experimental (build-tag-gated); SQLite is the production-tested database. v0.3.0 makes the driver work end to end, but it stays experimental: keep a single API replica, and it is not yet covered by e2e or upgrade tests.",
+ "content": "The PostgreSQL driver is experimental (build-tag-gated); SQLite is the production-tested database. v0.4.0 runs the auth, RBAC and upgrade e2e buckets on Postgres in CI, but it stays experimental: keep a single API replica, and handler and audit suites are not yet run against it.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -7529,7 +7560,7 @@
"type": "frame",
"id": "Znh8i",
"x": 0,
- "y": 12839,
+ "y": 11930,
"name": "Screen/Docs — FAQ",
"theme": {
"semantic": "dark"
@@ -7656,7 +7687,7 @@
"content": "Is Gameplane production-ready?"
},
"tne6e": {
- "content": "It's in beta (v0.2.0-beta.8). Core workflows are feature-complete and tested, but not yet recommended for unattended production — see the Roadmap."
+ "content": "It's a pre-v1 release (v0.4.0). Core workflows are feature-complete and tested, but not yet recommended for unattended production — see the Roadmap."
}
}
},
@@ -7719,7 +7750,7 @@
"content": "What database does it use?"
},
"tne6e": {
- "content": "SQLite by default and is the production-tested driver. A PostgreSQL driver exists but is experimental (build-tag-gated, work in progress)."
+ "content": "SQLite by default and is the production-tested driver. The PostgreSQL driver works end to end but is experimental: it needs an API image built with the `postgres` build tag, and the API must stay a single replica."
}
}
},
@@ -7740,6 +7771,24 @@
"content": "Yes. Advanced users can bypass the API entirely and manage everything with kubectl apply — the operator is authoritative, so both stay in sync."
}
}
+ },
+ {
+ "id": "tLPlD",
+ "type": "ref",
+ "ref": "v9zjax",
+ "name": "FAQ Item Dashboard Cluster",
+ "width": "fill_container",
+ "descendants": {
+ "C2FCOL": {
+ "icon": "circle-help"
+ },
+ "XvFxz": {
+ "content": "Do I need a Kubernetes cluster to run the dashboard?"
+ },
+ "tne6e": {
+ "content": "Not for the panel itself since v0.4.0. Docker Compose or a standalone Helm profile runs the API and dashboard without Kubernetes; games still run on registered clusters, each with its own operator and agents."
+ }
+ }
}
]
}
@@ -7862,21 +7911,21 @@
"type": "frame",
"id": "P5qsD",
"x": 0,
- "y": 13979,
+ "y": 12910,
"name": "Screen/Docs — Changelog",
"theme": {
"semantic": "dark"
},
"clip": true,
"width": 1440,
- "height": 1085,
+ "height": 1189,
"fill": "$background/background",
"children": [
{
"id": "sPZ1k",
"type": "ref",
"ref": "K2Rt4H",
- "height": "fill_container",
+ "height": 1189,
"name": "DocsSidebar/Expanded",
"width": 280
},
@@ -7978,7 +8027,7 @@
"type": "text",
"id": "qM6nJ",
"fill": "$accent/accent",
- "content": "Unreleased",
+ "content": "v0.4.0",
"fontFamily": "$typography/font-mono",
"fontSize": 15,
"fontWeight": "700"
@@ -7987,7 +8036,7 @@
"type": "text",
"id": "uWOXK",
"fill": "$muted",
- "content": "in development",
+ "content": "2026-11-10",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
@@ -8000,7 +8049,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Multicluster gateways, theme customization, PostgreSQL support, network capture, module authoring, 14 new game modules.",
+ "content": "Standalone central panel, French translations, extended telemetry tier, credential maintenance, fleet-wide node inventory, Steam display names, security hardening, and upgrade notes.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -8008,6 +8057,100 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "y3i1S",
+ "name": "v0.3.0",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "bottom": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "gap": 24,
+ "padding": [
+ 16,
+ 0
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "nkHDr",
+ "width": 150,
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "hHFHv",
+ "fill": "$foreground/foreground",
+ "content": "v0.3.0",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 15,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "x79yu",
+ "fill": "$muted",
+ "content": "2026-10-05",
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "fkA3g",
+ "name": "Bullets",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "kMyyz",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Multicluster gateways: an optional private mTLS gateway manages game servers across independent clusters.",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "lLha3",
+ "name": "Bullet",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Network capture, the gp-module authoring toolkit, PostgreSQL end-to-end support and user theme customization.",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "I4g7Xd",
+ "name": "Bullet",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "REST and CLI console protocols, Helm-seeded OIDC role mappings and 14 new game modules (30 at v0.3.0; Hell Let Loose was withdrawn in v0.4.0).",
+ "lineHeight": 1.5,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
{
"type": "frame",
"id": "d4v1q0",
@@ -8745,7 +8888,7 @@
"type": "frame",
"id": "AKe02",
"x": 0,
- "y": 15119,
+ "y": 14179,
"name": "Screen/Docs — Get Involved",
"theme": {
"semantic": "dark"
@@ -9271,7 +9414,7 @@
"type": "frame",
"id": "IGuE6",
"x": 0,
- "y": 16259,
+ "y": 15159,
"name": "Screen/Features",
"theme": {
"semantic": "dark"
@@ -9408,7 +9551,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Eight purpose-built Custom Resource Definitions — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, and ModuleSource — are reconciled by a single controller-runtime operator. Whether you create a server through the dashboard or with kubectl apply, the outcome is identical: the operator is the single source of truth.",
+ "content": "Nine purpose-built Custom Resource Definitions — GameServer, GameTemplate, Cluster, Backup, BackupSchedule, Restore, Module, ModuleSource, and NetworkCapture — are reconciled by a single controller-runtime operator. Whether you create a server through the dashboard or with kubectl apply, the outcome is identical: the operator is the single source of truth.",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -9469,7 +9612,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The exact same CRDs, controllers, and Helm chart that run on a single-node k3s homelab also run on a multi-node production cluster. There's no separate 'production mode' to migrate to — StatefulSets, PVCs, and rolling upgrades from day one.",
+ "content": "The exact same CRDs, controllers, and Helm chart that run on a single-node k3s homelab also run on a multi-node production cluster. There's no separate 'production mode' to migrate to — StatefulSets, PVCs, and rolling upgrades from day one. The dashboard and API can also run standalone on Docker Compose; games still need a registered cluster. (v0.4.0)",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -9652,7 +9795,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Scheduled or on-demand snapshots are pushed to any S3-compatible storage backend using restic, giving you deduplicated, encrypted, incremental backups. Restoring is a single click from the dashboard's Backups tab.",
+ "content": "Scheduled or on-demand snapshots are pushed to any S3-compatible storage backend using restic, giving you deduplicated, encrypted, incremental backups. Restoring is a single click from the dashboard's Backups tab. A stopped server with several data volumes can be recovered from its restic backups. (v0.4.0)",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -9713,7 +9856,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Sixteen games ship out of the box, and the open template format supports any game with a config file and a start command.",
+ "content": "Twenty-nine games ship out of the box, and the open template format supports any game with a config file and a start command.",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -9774,7 +9917,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Authenticate with local accounts or federate through OIDC — Keycloak, Google, or GitHub. Three built-in roles (admin, operator, viewer) scope access per namespace, so a shared cluster can host multiple teams safely.",
+ "content": "Authenticate with local accounts or federate through OIDC — Keycloak, Authentik, Google, Okta, or Entra ID. Three built-in roles (admin, operator, viewer) scope access per namespace, so a shared cluster can host multiple teams safely. Only full administrators can grant admin-level permissions. (v0.4.0)",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -9943,7 +10086,7 @@
"type": "frame",
"id": "B39hL",
"x": 0,
- "y": 18414,
+ "y": 17234,
"name": "Screen/Games",
"theme": {
"semantic": "dark"
@@ -10013,7 +10156,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": 640,
- "content": "Sixteen game servers ship out of the box — and the module format is open, so more are just a template away. Fourteen more arrive in v0.3.0.",
+ "content": "Twenty-nine game servers ship out of the box — and the module format is open, so more are just a template away.",
"textAlign": "center",
"fontFamily": "$typography/font-sans",
"fontSize": 16,
@@ -10031,7 +10174,7 @@
"children": [
{
"type": "frame",
- "id": "kRvv9",
+ "id": "CZusV",
"name": "gameRow1",
"width": "fill_container",
"gap": 24,
@@ -10088,7 +10231,7 @@
"name": "versionBadge",
"descendants": {
"W2qoN": {
- "content": "2.8.1"
+ "content": "2.9.1"
}
}
}
@@ -10254,7 +10397,7 @@
"name": "versionBadge",
"descendants": {
"W2qoN": {
- "content": "2.2.0"
+ "content": "2.2.3"
}
}
}
@@ -10284,7 +10427,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "dyqcT",
+ "name": "gameRow2",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "j9nolC",
@@ -10367,16 +10519,7 @@
"fontWeight": "normal"
}
]
- }
- ]
- },
- {
- "type": "frame",
- "id": "tZsqv",
- "name": "gameRow2",
- "width": "fill_container",
- "gap": 24,
- "children": [
+ },
{
"type": "frame",
"id": "oCRo6",
@@ -10542,7 +10685,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "SXyxX",
+ "name": "gameRow3",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "H1C3g",
@@ -10708,16 +10860,7 @@
"fontWeight": "normal"
}
]
- }
- ]
- },
- {
- "type": "frame",
- "id": "PIPxb",
- "name": "gameRow3",
- "width": "fill_container",
- "gap": 24,
- "children": [
+ },
{
"type": "frame",
"id": "b5Lvoi",
@@ -10800,7 +10943,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "KHPEf",
+ "name": "gameRow4",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "fexJ5",
@@ -11054,8 +11206,8 @@
},
{
"type": "frame",
- "id": "O0g36",
- "name": "gameRow4",
+ "id": "K4XGUq",
+ "name": "gameRow5",
"width": "fill_container",
"gap": 24,
"children": [
@@ -11307,7 +11459,16 @@
"fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "U39WPp",
+ "name": "gameRow6",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
"id": "oL1wB",
@@ -11390,1209 +11551,1119 @@
"fontWeight": "normal"
}
]
- }
- ]
- }
- ]
- },
- {
- "type": "frame",
- "id": "PRgEx",
- "name": "v030Section",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 24,
- "children": [
- {
- "type": "frame",
- "id": "dqa8W",
- "name": "v030Header",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 12,
- "alignItems": "center",
- "children": [
- {
- "type": "text",
- "id": "W91H8O",
- "name": "eyebrow",
- "fill": "$accent/accent",
- "content": "COMING IN V0.3.0",
- "textAlign": "center",
- "fontFamily": "$typography/font-mono",
- "fontSize": 12,
- "fontWeight": "600",
- "letterSpacing": 1
},
- {
- "type": "text",
- "id": "gnAdU",
- "name": "subhead",
- "fill": "$foreground/foreground",
- "textGrowth": "fixed-width",
- "width": 700,
- "content": "Fourteen more modules land in the next release",
- "textAlign": "center",
- "fontFamily": "$typography/font-mono",
- "fontSize": 22,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "Zsyvv",
- "name": "subtext",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": 640,
- "content": "Not yet shipped in v0.2.0-beta.8 — these templates are staged for the v0.3.0 release.",
- "textAlign": "center",
- "fontFamily": "$typography/font-sans",
- "fontSize": 16,
- "fontWeight": "normal"
- }
- ]
- },
- {
- "type": "frame",
- "id": "kdiA9",
- "name": "v030Rows",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 24,
- "children": [
{
"type": "frame",
- "id": "JT5kD",
- "name": "v030Row1",
+ "id": "mFQCA",
+ "name": "FiveM",
"width": "fill_container",
- "gap": 24,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "V4NE54",
- "name": "FiveM",
+ "id": "fZ1iv",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "O6t4QU",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "oBwLH",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "g28Ud",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "y8X9m",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "car",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "RA7iC",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "LU7R2",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "car",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "IR3An",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "FiveM",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "pK0We",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Bundled txAdmin with embedded MariaDB supervision and REST controls.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "ZcyU4",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "PzlIu",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "FiveM",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "H4OLUO",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Bundled txAdmin with embedded MariaDB supervision and REST controls.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "M9a8Wr",
+ "name": "Farming Simulator 25",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "dUBg4",
- "name": "Farming Simulator 25",
+ "id": "q1KwT2",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "n5QX9",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "jhgnr",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "aDi89",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "Dpn3g",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "leaf",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "FR3x9",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "kV6cA",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "leaf",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "t38Ovm",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Farming Simulator 25",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "D85A4I",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Headless Wine runtime with a supervised web management portal and REST admin.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "Cj2Fw",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "SvIuL",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Farming Simulator 25",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "Bjt1G",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Headless Wine runtime with a supervised web management portal and REST admin.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "TEX05",
+ "name": "gameRow7",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "e8qomB",
+ "name": "Euro Truck Simulator 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "mL1tL",
- "name": "Euro Truck Simulator 2",
+ "id": "rfVmn",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "OJiha",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "g3oKz7",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "r2ZUP",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "g2Qwh",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "truck",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "cUyE7",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "sm9NE",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "truck",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "HhkiG",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Euro Truck Simulator 2",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "ZLufY",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with diagnostic idle when the server logon token is missing.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "zkOWY",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
},
{
- "type": "frame",
- "id": "V1sU3b",
- "name": "Mount & Blade II: Bannerlord",
+ "type": "text",
+ "id": "CZ9Vq",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Euro Truck Simulator 2",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "K561y",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
- "children": [
- {
- "type": "frame",
- "id": "WSDQM",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
- "alignItems": "center",
- "children": [
- {
- "type": "frame",
- "id": "vIR2r",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "BQ7ah",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "shield",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "T5dnz",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
- }
- ]
- },
- {
- "type": "text",
- "id": "HKhBv",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Mount & Blade II: Bannerlord",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "GhW0r",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with skirmish, captain, and siege match hosting.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
+ "content": "PTY console with diagnostic idle when the server logon token is missing.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "vy09A",
- "name": "v030Row2",
+ "id": "YVlRr",
+ "name": "Mount & Blade II: Bannerlord",
"width": "fill_container",
- "gap": 24,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "Hegww",
- "name": "tModLoader",
+ "id": "ORcZx",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "x7RiZ8",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "Wt6rQ",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "udDeV",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "ymSdG",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "blocks",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "q81ho",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "N3b4Q",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "shield",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "ri3n6",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "tModLoader",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "xem9r",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Modded Terraria with a .tmod mod manager and interactive PTY console.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "zpDaw",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "TXEzL",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Mount & Blade II: Bannerlord",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "vXUj8",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with skirmish, captain, and siege match hosting.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "SrEDO",
+ "name": "tModLoader",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "kcuAa",
- "name": "Team Fortress 2",
+ "id": "VjAWQ",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "E4ssiU",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "L4f66",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "qcRY5",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "rQhq0",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "target",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "U0NJdQ",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "AyPwC",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "blocks",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "TW9Oz",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Team Fortress 2",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "y0O5r4",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON console with SourceMod/MetaMod addon support.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "tr1i6",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.2"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "r6JJ8",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "tModLoader",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "rXVHf",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Modded Terraria with a .tmod mod manager and interactive PTY console.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "LFIgR",
+ "name": "gameRow8",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "dDAR2",
+ "name": "Team Fortress 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "m9Vqb",
- "name": "BeamMP",
+ "id": "F8fWY3",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "UhIkk",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "w1yXJ",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "zydkG",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "abnaE",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "gauge",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "J8cXVt",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "kIxIC",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "target",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "OIv85",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "BeamMP",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "Shw9W",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with custom vehicle/map mods and diagnostic idle.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "Y17HQc",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "Gm5qX",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Team Fortress 2",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "JfaHG",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON console with SourceMod/MetaMod addon support.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Ww2SH",
+ "name": "BeamMP",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "ZbpFL",
- "name": "Left 4 Dead 2",
+ "id": "PtwZm",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "AKNlO",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "hElNU",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "uomeu",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "jZzKB",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "skull",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "xCO1C",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "HEFn9",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "gauge",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "J9QDM3",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Left 4 Dead 2",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "K5OYy",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON console with SourceMod/MetaMod addon support.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "kO5Mq",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
+ },
+ {
+ "type": "text",
+ "id": "HmzI2",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "BeamMP",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "NJQvC",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with custom vehicle/map mods and diagnostic idle.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "yBtgS",
- "name": "v030Row3",
+ "id": "yFELP",
+ "name": "Left 4 Dead 2",
"width": "fill_container",
- "gap": 24,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "xJ0sk",
- "name": "The Isle",
+ "id": "natek",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "LqdyK",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "QYmmj",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "KTI0D",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "M3dUu9",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "paw-print",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "asryi",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "RYWie",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "skull",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "d5JFLh",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "The Isle",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "qG4W6",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON administration with persistent world save management.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "m39H7",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.0.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "A7B1T",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Left 4 Dead 2",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "XM1bV",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON console with SourceMod/MetaMod addon support.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Scf1I",
+ "name": "gameRow9",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
+ {
+ "type": "frame",
+ "id": "KRLXE",
+ "name": "The Isle",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "BXObb",
- "name": "ARK: Survival Evolved",
+ "id": "z9VuBg",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "RdPHm",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "AG8jt",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "ctcbu",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "U9U8cu",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "bone",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "g4lw1",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "V9jgC",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "paw-print",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "e41J3",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "ARK: Survival Evolved",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "POAGI",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source RCON console with cluster travel support and persistent world state.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "W25r5",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "S2spZ",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "The Isle",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "iwZ5P",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON administration with persistent world save management.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "u7m1wv",
+ "name": "ARK: Survival Evolved",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "vJMyg",
- "name": "Arma Reforger",
+ "id": "Z4FCkx",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "iAeN2",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "PhPcP",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "SqIQx",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "z4B0Vk",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "crosshair",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "NXPJa",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "g9O5O",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "bone",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "nsh00",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Arma Reforger",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "t3Qll",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "PTY console with persistent saves and Steam Workshop mod support.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "fg4mz",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
+ {
+ "type": "text",
+ "id": "BXeRH",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "ARK: Survival Evolved",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "ApFOV",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source RCON console with cluster travel support and persistent world state.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "mKvV3",
+ "name": "Arma Reforger",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "JPwYU",
- "name": "Squad",
+ "id": "DnB0c",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "hs13Z",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "FfdyT",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "u8f7W",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "MzQS9",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "users",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "cyWHY",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "acEnp",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "crosshair",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "AARvn",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Squad",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "LzSlK",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Source-family RCON with match rotation and Steam Workshop modding.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "mNniY",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
+ },
+ {
+ "type": "text",
+ "id": "TWiBo",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Arma Reforger",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "ViAxD",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "PTY console with persistent saves and Steam Workshop mod support.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
- },
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "d1CWz3",
+ "name": "gameRow10",
+ "width": "fill_container",
+ "gap": 24,
+ "children": [
{
"type": "frame",
- "id": "v1Cozl",
- "name": "v030Row4",
- "width": "fill_container",
- "gap": 24,
+ "id": "UowmZ",
+ "name": "Squad",
+ "width": 410,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
"children": [
{
"type": "frame",
- "id": "F0d3e",
- "name": "Nuclear Option",
+ "id": "kYUKw",
+ "name": "headerRow",
"width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 12,
- "padding": 20,
+ "justifyContent": "space_between",
+ "alignItems": "center",
"children": [
{
"type": "frame",
- "id": "RMtm2",
- "name": "headerRow",
- "width": "fill_container",
- "justifyContent": "space_between",
+ "id": "XJY4C",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
"alignItems": "center",
"children": [
{
- "type": "frame",
- "id": "WqQ1A",
- "name": "iconTile",
- "width": 44,
- "height": 44,
- "fill": "$default/default",
- "cornerRadius": "$radius/xl",
- "justifyContent": "center",
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "UAndT",
- "name": "icon",
- "width": 22,
- "height": 22,
- "icon": "radiation",
- "library": "lucide",
- "fill": "$accent/accent"
- }
- ]
- },
- {
- "id": "JCnUW",
- "type": "ref",
- "ref": "NZPtq",
- "name": "comingSoonBadge",
- "descendants": {
- "NLG8t": {
- "content": "v0.3.0"
- }
- }
+ "type": "icon",
+ "id": "t1DMWr",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "users",
+ "library": "lucide",
+ "fill": "$accent/accent"
}
]
},
{
- "type": "text",
- "id": "qEz4v",
- "name": "gameName",
- "fill": "$foreground/foreground",
- "content": "Nuclear Option",
- "fontFamily": "$typography/font-mono",
- "fontSize": 16,
- "fontWeight": "700"
- },
- {
- "type": "text",
- "id": "ovP9X",
- "name": "summary",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Remote-command console, runtime-installed via SteamCMD on first boot.",
- "lineHeight": 1.4,
- "fontFamily": "$typography/font-sans",
- "fontSize": 13,
- "fontWeight": "normal"
+ "id": "Idds8",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
}
]
},
{
- "type": "frame",
- "id": "qlQu0",
- "name": "spacer",
- "width": "fill_container",
- "height": 1
+ "type": "text",
+ "id": "wmUYy",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Squad",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
},
+ {
+ "type": "text",
+ "id": "mpt5b",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Source-family RCON with match rotation and Steam Workshop modding.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "mOaY3",
+ "name": "Nuclear Option",
+ "width": 410,
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 12,
+ "padding": 20,
+ "children": [
{
"type": "frame",
- "id": "J6H0pJ",
- "name": "spacer",
+ "id": "oagjO",
+ "name": "headerRow",
"width": "fill_container",
- "height": 1
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "lpHcm",
+ "name": "iconTile",
+ "width": 44,
+ "height": 44,
+ "fill": "$default/default",
+ "cornerRadius": "$radius/xl",
+ "justifyContent": "center",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "TWGFw",
+ "name": "icon",
+ "width": 22,
+ "height": 22,
+ "icon": "radiation",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ },
+ {
+ "id": "rUIzB",
+ "type": "ref",
+ "ref": "X4Xyl",
+ "name": "versionBadge",
+ "descendants": {
+ "W2qoN": {
+ "content": "1.1.0"
+ }
+ }
+ }
+ ]
},
{
- "type": "frame",
- "id": "Li4wj",
- "name": "spacer",
+ "type": "text",
+ "id": "VEa20",
+ "name": "gameName",
+ "fill": "$foreground/foreground",
+ "content": "Nuclear Option",
+ "fontFamily": "$typography/font-mono",
+ "fontSize": 16,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "bzLst",
+ "name": "summary",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
"width": "fill_container",
- "height": 1
+ "content": "Remote-command console, runtime-installed via SteamCMD on first boot.",
+ "lineHeight": 1.4,
+ "fontFamily": "$typography/font-sans",
+ "fontSize": 13,
+ "fontWeight": "normal"
}
]
}
@@ -12656,7 +12727,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Every module — including all sixteen above — is just an OCI bundle: a template.yaml describing the container, config schema, and capabilities, plus a module.yaml with metadata. If a game runs in a container and takes a config file, it can become a Gameplane module.",
+ "content": "Every module — including all twenty-nine above — is just an OCI bundle: a template.yaml describing the container, config schema, and capabilities, plus a module.yaml with metadata. If a game runs in a container and takes a config file, it can become a Gameplane module.",
"lineHeight": 1.6,
"fontFamily": "$typography/font-sans",
"fontSize": 14,
@@ -12788,7 +12859,7 @@
"type": "frame",
"id": "tfxmL",
"x": 0,
- "y": 20534,
+ "y": 20284,
"name": "Screen/Showcase",
"theme": {
"semantic": "dark"
@@ -13608,7 +13679,7 @@
"type": "frame",
"id": "ei1qC",
"x": 0,
- "y": 22443,
+ "y": 22025,
"name": "Screen/Compare",
"theme": {
"semantic": "dark"
@@ -13828,7 +13899,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Kubernetes-native CRDs and controller-runtime operator; scales from k3s homelab to multi-node clusters. [BETA]",
+ "content": "Combined Kubernetes install or standalone panel on Docker Compose; game workloads use Kubernetes CRDs and a controller-runtime operator, from k3s to multi-node clusters. [PRE-V1]",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -14164,7 +14235,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Local argon2id + OIDC (Keycloak/Google/GitHub); three built-in roles (admin/operator/viewer); custom roles supported.",
+ "content": "Local argon2id + OIDC (Keycloak, Authentik, Google, Okta, Entra ID); three built-in roles (admin/operator/viewer); custom roles supported.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -14248,7 +14319,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 16 ready-to-use templates shipped.",
+ "content": "OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 29 ready-to-use templates shipped.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -14332,7 +14403,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Cluster CRD for remote registration/monitoring; console/log streaming local-cluster only. [local cluster only for streaming]",
+ "content": "Remote registration via Cluster CRDs (combined) or SQL (standalone); central user grants; remote Pod logs and PTY; optional private gateway for agent operations. [gateway optional]",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -14500,7 +14571,7 @@
"fill": "$foreground/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Self-hosted only; runs on Kubernetes (k3s, kubeadm, managed services); no managed SaaS offering.",
+ "content": "Self-hosted only; panel runs on Docker Compose or Kubernetes, while games require Kubernetes (k3s, kubeadm, managed services); no managed SaaS offering.",
"lineHeight": 1.5,
"fontFamily": "$typography/font-sans",
"fontSize": 13,
@@ -14733,7 +14804,7 @@
"type": "frame",
"id": "vh8hz",
"x": 0,
- "y": 24247,
+ "y": 24752,
"name": "Screen/Not Found",
"theme": {
"semantic": "dark"
@@ -14887,7 +14958,7 @@
"type": "frame",
"id": "JjbY2",
"x": 0,
- "y": 25482,
+ "y": 26095,
"name": "Screen/Landing Page (Mobile)",
"theme": {
"semantic": "dark"
@@ -14982,7 +15053,7 @@
"ref": "X4Xyl",
"descendants": {
"W2qoN": {
- "content": "v0.2.0-beta.8 — actively developed"
+ "content": "v0.4.0"
}
}
},
@@ -15178,7 +15249,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Seven CRDs reconciled by one operator. kubectl and the dashboard always agree.",
+ "content": "Nine CRDs reconciled by one operator. kubectl and the dashboard always agree.",
"lineHeight": 1.4,
"fontFamily": "$typography/font-sans",
"fontSize": 12,
@@ -15742,7 +15813,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": " oci://ghcr.io/valgulnecron/",
+ "content": " oci://ghcr.io/gameplanepanel/",
"fontFamily": "$typography/font-mono",
"fontSize": 11,
"fontWeight": "normal"
@@ -15965,7 +16036,7 @@
"type": "text",
"id": "BAypr",
"fill": "$muted",
- "content": "v0.2.0-beta.8 · AGPL-3.0-or-later",
+ "content": "v0.4.0 · AGPL-3.0-or-later · Built on Kubernetes",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
@@ -15978,7 +16049,7 @@
"type": "frame",
"id": "Bnjed",
"x": 0,
- "y": 28460,
+ "y": 28922,
"name": "Screen/Docs — Home (Mobile)",
"theme": {
"semantic": "dark"
@@ -16834,7 +16905,7 @@
"type": "frame",
"id": "vqKLi",
"x": 0,
- "y": 29544,
+ "y": 29846,
"name": "Screen/Docs — Article (Mobile)",
"theme": {
"semantic": "dark"
@@ -17060,7 +17131,7 @@
"name": "Mobile Meta Chip 2",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
}
@@ -17308,7 +17379,7 @@
"type": "frame",
"id": "X0DeYH",
"x": 0,
- "y": 30628,
+ "y": 30770,
"name": "Screen/Docs — Dashboard Tour",
"theme": {
"semantic": "dark"
@@ -17430,7 +17501,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -17481,7 +17552,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "In v0.2.0-beta.8, a cluster selector scopes everything. From v0.3.0, the dashboard combines every authorized cluster with an optional Location filter.",
+ "content": "The dashboard, Servers, Backups and Search combine every registered cluster you can access, and an optional Location filter narrows them (since v0.3.0; v0.2.0-beta.8 used a top-bar cluster selector that scoped everything to one cluster).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -17631,6 +17702,38 @@
"fontWeight": "normal"
}
]
+ },
+ {
+ "type": "frame",
+ "id": "Gxcze",
+ "name": "Section 1 Item 3",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "UgjGo",
+ "name": "Section 1 Item Icon 3",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Q7nAm5",
+ "name": "Section 1 Item Text 3",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pick the dashboard language in Settings, saved to your account or browser (v0.4.0).",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
}
]
}
@@ -17741,7 +17844,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Cluster health shows node readiness and allocatable CPU and memory.",
+ "content": "Cluster health shows node readiness and allocatable CPU and memory; the Nodes page spans every visible cluster (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -18251,7 +18354,7 @@
"type": "frame",
"id": "Gx9Xj",
"x": 0,
- "y": 31768,
+ "y": 31750,
"name": "Screen/Docs — Create a Server",
"theme": {
"semantic": "dark"
@@ -18373,7 +18476,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -18652,7 +18755,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use equal CPU and memory requests/limits for Guaranteed QoS.",
+ "content": "Equal CPU and memory requests/limits give Guaranteed QoS; reserve less for Burstable (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -19194,7 +19297,7 @@
"type": "frame",
"id": "KvC6V",
"x": 0,
- "y": 32908,
+ "y": 32730,
"name": "Screen/Docs — Server Operations",
"theme": {
"semantic": "dark"
@@ -19316,7 +19419,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -19695,7 +19798,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Treat transfers and destructive actions as audited workflows with a recovery path.",
+ "content": "Treat transfers and destructive actions as audited workflows with a recovery path. Wipes, backups and restores of one server never overlap (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -20137,7 +20240,7 @@
"type": "frame",
"id": "VtYGz",
"x": 0,
- "y": 34048,
+ "y": 33710,
"name": "Screen/Docs — Console, Events & Logs",
"theme": {
"semantic": "dark"
@@ -20259,7 +20362,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -21080,7 +21183,7 @@
"type": "frame",
"id": "M3eBWD",
"x": 0,
- "y": 35188,
+ "y": 34690,
"name": "Screen/Docs — Files, Players & Mods",
"theme": {
"semantic": "dark"
@@ -21202,7 +21305,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -21481,7 +21584,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Confirm player identity before applying whitelist or ban changes.",
+ "content": "Confirm identity before whitelist or ban changes; Steam names show with a Steam key (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -22023,7 +22126,7 @@
"type": "frame",
"id": "ivU89",
"x": 0,
- "y": 36328,
+ "y": 35670,
"name": "Screen/Docs — Server Configuration",
"theme": {
"semantic": "dark"
@@ -22145,7 +22248,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -22308,7 +22411,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Equal requests and limits produce Guaranteed QoS for sensitive servers.",
+ "content": "Equal requests and limits produce Guaranteed QoS; Reserve less than the limit (v0.4.0) allows Burstable instead.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -22966,7 +23069,7 @@
"type": "frame",
"id": "s3NwF",
"x": 0,
- "y": 37468,
+ "y": 36650,
"name": "Screen/Docs — Network & Automation",
"theme": {
"semantic": "dark"
@@ -23088,7 +23191,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -23399,7 +23502,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Expose only required TCP or UDP ports from the selected module.",
+ "content": "Expose only required TCP or UDP ports; v0.4.0 lets kubelet probes reach only those ports.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -23941,7 +24044,7 @@
"type": "frame",
"id": "QdLzE",
"x": 0,
- "y": 38608,
+ "y": 37630,
"name": "Screen/Docs — Backups & Recovery",
"theme": {
"semantic": "dark"
@@ -24063,7 +24166,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -24374,7 +24477,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Balance keep-last, hourly, daily, weekly, monthly, and yearly retention.",
+ "content": "Trim Backup resources by retention; repository storage is not reclaimed automatically.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -24442,7 +24545,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Restore into a new server for verification, or overwrite only after stopping writes and confirming ownership.",
+ "content": "Restore into a new server for verification, or overwrite only after stopping writes. All-data captures check volume layout first.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -24884,7 +24987,7 @@
"type": "frame",
"id": "PSdPq",
"x": 0,
- "y": 39748,
+ "y": 38610,
"name": "Screen/Docs — Cluster & Storage",
"theme": {
"semantic": "dark"
@@ -25006,7 +25109,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -25169,7 +25272,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Reserve headroom for the operator, agents, ingress, and backup jobs.",
+ "content": "Reserve headroom for the operator, agents, ingress, and backup jobs; v0.4.0 adds requests for auxiliary pods.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -25385,7 +25488,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use scheduler defaults first, then add affinity, tolerations, GPU selectors, or pinning only for a clear constraint.",
+ "content": "Use scheduler defaults first; v0.4.0 adds chart placement keys for management pods. Add affinity or pinning only for a clear constraint.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -25827,7 +25930,7 @@
"type": "frame",
"id": "yuCG9",
"x": 0,
- "y": 40888,
+ "y": 39590,
"name": "Screen/Docs — Users, Auth & RBAC",
"theme": {
"semantic": "dark"
@@ -25949,7 +26052,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -26260,7 +26363,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Separate global administration from per-server collaboration.",
+ "content": "Separate global administration from per-server collaboration. Only * holders grant admin-level permissions.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -26770,7 +26873,7 @@
"type": "frame",
"id": "SKMOT",
"x": 0,
- "y": 42028,
+ "y": 40570,
"name": "Screen/Docs — Audit, Observability & Admin",
"theme": {
"semantic": "dark"
@@ -26892,7 +26995,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -27235,7 +27338,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Document telemetry settings and privacy expectations for operators.",
+ "content": "Telemetry is on by default for new installs (v0.4.0); each tier can be turned off in Admin Settings.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -27713,7 +27816,7 @@
"type": "frame",
"id": "SmOzJ",
"x": 0,
- "y": 43168,
+ "y": 41550,
"name": "Screen/Docs — Modules & Sources",
"theme": {
"semantic": "dark"
@@ -27835,7 +27938,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -28214,7 +28317,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Package metadata, templates, assets, and compatibility as versioned OCI content with a reproducible release process.",
+ "content": "Package metadata, templates, assets, and compatibility as versioned OCI content. gp-module also runs i18n extract and i18n stamp (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -28656,7 +28759,7 @@
"type": "frame",
"id": "e8fTgD",
"x": 0,
- "y": 44308,
+ "y": 42530,
"name": "Screen/Docs — API & CRDs",
"theme": {
"semantic": "dark"
@@ -28778,7 +28881,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -29599,7 +29702,7 @@
"type": "frame",
"id": "b5u3Ui",
"x": 0,
- "y": 45448,
+ "y": 43510,
"name": "Screen/Docs — Installation & Helm",
"theme": {
"semantic": "dark"
@@ -29721,7 +29824,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -29952,7 +30055,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Set external URL, ingress and TLS, storage, authentication, cluster operations, telemetry, and update policy deliberately.",
+ "content": "Set external URL, ingress and TLS, storage, authentication, cluster operations, telemetry (on by default from v0.4.0), and update policy deliberately.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -30542,14 +30645,14 @@
"type": "frame",
"id": "D4SNhN",
"x": 0,
- "y": 46588,
+ "y": 44490,
"name": "Screen/Docs — Upgrades & Migrations",
"theme": {
"semantic": "dark"
},
"clip": true,
"width": 1440,
- "height": 1000,
+ "height": 1050,
"fill": "$background/background",
"children": [
{
@@ -30664,7 +30767,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -31141,6 +31244,39 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "FKsn6",
+ "name": "Guide Section v0.4.0 notes",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "ovaZH",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Upgrade notes for v0.4.0",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "CP6zr",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Breaking: admin-level grants need `*`, and probes reach only probe ports. Telemetry is on by default for new installs. Password reset ends all sessions. Full list in the CHANGELOG.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
{
"type": "frame",
"id": "w2Xb8",
@@ -31390,6 +31526,36 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "BEmWD",
+ "name": "TOC Row v0.4.0 notes",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "s6dx7",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "SflIS",
+ "name": "TOC Text v0.4.0 notes",
+ "fill": "$muted",
+ "content": "v0.4.0 notes",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
{
"type": "frame",
"id": "dHQHZ",
@@ -31611,7 +31777,7 @@
"type": "frame",
"id": "kSyrZ",
"x": 0,
- "y": 47728,
+ "y": 45620,
"name": "Screen/Docs — Troubleshooting",
"theme": {
"semantic": "dark"
@@ -31733,7 +31899,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -31964,7 +32130,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Classify the symptom before choosing a runbook: Pending, image pull, crash loop, probe, volume, service, auth, backup, or source sync.",
+ "content": "Classify the symptom before choosing a runbook: Pending, image pull, crash loop, probe, volume, service, auth, backup, source sync, or tunnel not ready.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -32554,7 +32720,7 @@
"type": "frame",
"id": "kTRsn",
"x": 0,
- "y": 48868,
+ "y": 46600,
"name": "Screen/Docs — Helm Values Reference",
"theme": {
"semantic": "dark"
@@ -34280,7 +34446,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Hard on/off; false never sends and shows no first-login notice.",
+ "content": "Hard on/off; false never sends. From v0.4.0, new installs send by default.",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
@@ -34586,7 +34752,7 @@
"type": "frame",
"id": "gEOuV",
"x": 0,
- "y": 50008,
+ "y": 47780,
"name": "Screen/Docs — Sign-in & Account Recovery",
"theme": {
"semantic": "dark"
@@ -34708,7 +34874,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -34987,7 +35153,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Re-enter the identifier and avoid repeated guesses that trigger rate limits.",
+ "content": "Re-enter the identifier and avoid repeated guesses; a browser already signed in skips the per-username limit (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -35087,7 +35253,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use self-service recovery only when configured; otherwise perform an audited local reset and test the effective role in a private session.",
+ "content": "Use self-service recovery only when configured; otherwise an audited local reset signs out all sessions (v0.4.0). Test the effective role privately.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -35529,7 +35695,7 @@
"type": "frame",
"id": "b7zNA",
"x": 0,
- "y": 51148,
+ "y": 48760,
"name": "Screen/Docs — Template-specific Configuration",
"theme": {
"semantic": "dark"
@@ -35651,7 +35817,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -36472,7 +36638,7 @@
"type": "frame",
"id": "h0PWaP",
"x": 0,
- "y": 52288,
+ "y": 49740,
"name": "Screen/Docs — Server Overview & Connections",
"theme": {
"semantic": "dark"
@@ -36594,7 +36760,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -37415,7 +37581,7 @@
"type": "frame",
"id": "ncP9x",
"x": 0,
- "y": 53428,
+ "y": 50720,
"name": "Screen/Docs — General Server Settings",
"theme": {
"semantic": "dark"
@@ -37537,7 +37703,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -38358,7 +38524,7 @@
"type": "frame",
"id": "TESyw",
"x": 0,
- "y": 54568,
+ "y": 51700,
"name": "Screen/Docs — File Manager",
"theme": {
"semantic": "dark"
@@ -38480,7 +38646,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -38643,7 +38809,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use the editor only for supported text content.",
+ "content": "Use the editor only for supported text content; only regular files open or download (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -38791,7 +38957,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Include the correct extension and avoid accidental replacement.",
+ "content": "Include the extension; new files never overwrite an existing name (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -39333,7 +39499,7 @@
"type": "frame",
"id": "cUrQn",
"x": 0,
- "y": 55708,
+ "y": 52680,
"name": "Screen/Docs — Player Administration",
"theme": {
"semantic": "dark"
@@ -39455,7 +39621,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -39650,7 +39816,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Resolve the exact identity before applying an access change.",
+ "content": "Resolve exact identity; Steam names need a Web API key (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -40276,7 +40442,7 @@
"type": "frame",
"id": "Nnd3Y",
"x": 0,
- "y": 56848,
+ "y": 53660,
"name": "Screen/Docs — Production Installation",
"theme": {
"semantic": "dark"
@@ -40398,7 +40564,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -41219,7 +41385,7 @@
"type": "frame",
"id": "Yog9e",
"x": 0,
- "y": 57988,
+ "y": 54640,
"name": "Screen/Docs — Ingress, TLS & External Access",
"theme": {
"semantic": "dark"
@@ -41341,7 +41507,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -41472,7 +41638,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Separate dashboard/API traffic from game Services.",
+ "content": "Separate dashboard/API, /share, and game traffic from game Services.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -41652,7 +41818,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Configure proxy hops, forwarded headers, timeouts, and upload limits.",
+ "content": "Configure proxy hops, forwarded headers, timeouts, and upload limits (512m default).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -41684,7 +41850,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Keep agent, database, and management Services private behind the edge.",
+ "content": "Keep agent and database paths private; the API mounts only the CA cert.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -42162,7 +42328,7 @@
"type": "frame",
"id": "p5Gci",
"x": 0,
- "y": 59128,
+ "y": 55620,
"name": "Screen/Docs — Database Configuration & Lifecycle",
"theme": {
"semantic": "dark"
@@ -42284,7 +42450,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -42563,7 +42729,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "State whether migrations run automatically or as an explicit job.",
+ "content": "Migrations run on API startup; v0.4.0 applies 019 and ends a user's sessions on password reset.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -43105,7 +43271,7 @@
"type": "frame",
"id": "CuW6O",
"x": 0,
- "y": 60268,
+ "y": 56600,
"name": "Screen/Docs — Multi-cluster Topology",
"theme": {
"semantic": "dark"
@@ -43227,7 +43393,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -43358,7 +43524,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "One control plane and database form one operational boundary.",
+ "content": "Combined installs share one control plane and database; standalone panels run them without Kubernetes.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -43606,7 +43772,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Promote manifests and modules through GitOps; move worlds only through verified backup and restore.",
+ "content": "Combined installs promote Cluster CRs and modules through GitOps; standalone panels keep registrations in their database. Move worlds only through verified backup and restore.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -43705,7 +43871,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The optional agent gateway and the unified cross-cluster dashboard described below arrive in v0.3.0. In v0.2.0-beta.8 you can register clusters and manage their resources from one dashboard, but console and log streaming is scoped to the local control-plane cluster.",
+ "content": "The optional agent gateway and the unified cross-cluster dashboard described below are available since v0.3.0.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -43737,7 +43903,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "One central API and login manages independent registered clusters.",
+ "content": "One central API and login manages independent clusters, combined or standalone (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -43817,7 +43983,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Dashboard combines resources across clusters with optional Location filter (v0.3.0)",
+ "content": "Dashboard combines resources across clusters with optional Cluster filter (v0.3.0)",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -43902,7 +44068,7 @@
"id": "lJ4Me",
"name": "Next Link Title",
"fill": "$foreground/foreground",
- "content": "High availability and failure domains",
+ "content": "Standalone panel",
"fontFamily": "JetBrains Mono",
"fontSize": 13,
"fontWeight": "500"
@@ -44267,7 +44433,7 @@
"type": "frame",
"id": "zeM79",
"x": 0,
- "y": 61408,
+ "y": 57800,
"name": "Screen/Docs — Air-gapped Installation",
"theme": {
"semantic": "dark"
@@ -44389,7 +44555,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -44768,7 +44934,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "New installs report to telemetry.gameplane.net; turn it off at install time so an offline cluster never retries.",
+ "content": "New installs report to telemetry.gameplane.net; an empty endpoint uses it too. Turn it off at install so offline clusters never retry.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -45358,7 +45524,7 @@
"type": "frame",
"id": "BEcZK",
"x": 0,
- "y": 62548,
+ "y": 58940,
"name": "Screen/Docs — High Availability",
"theme": {
"semantic": "dark"
@@ -45480,7 +45646,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -46302,7 +46468,7 @@
"type": "frame",
"id": "U8xlE8",
"x": 0,
- "y": 63688,
+ "y": 60020,
"name": "Screen/Docs — Executable Upgrades & Rollback",
"theme": {
"semantic": "dark"
@@ -46424,7 +46590,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -47245,7 +47411,7 @@
"type": "frame",
"id": "FUcVx",
"x": 0,
- "y": 64828,
+ "y": 61000,
"name": "Screen/Docs — Uninstall & Decommission",
"theme": {
"semantic": "dark"
@@ -47367,7 +47533,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -48188,7 +48354,7 @@
"type": "frame",
"id": "W3y92",
"x": 0,
- "y": 65968,
+ "y": 61980,
"name": "Screen/Docs — Platform Disaster Recovery",
"theme": {
"semantic": "dark"
@@ -48310,7 +48476,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -48441,7 +48607,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Include release, values, CRDs/specs, DB, Secrets/keys, and sources.",
+ "content": "Include release, values, CRDs/specs, DB, Secrets/keys, sources, and panel DB + key.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -49131,7 +49297,7 @@
"type": "frame",
"id": "BlviB",
"x": 0,
- "y": 67108,
+ "y": 62960,
"name": "Screen/Docs — Credential Rotation",
"theme": {
"semantic": "dark"
@@ -49253,7 +49419,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -49384,7 +49550,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Include OIDC, recovery users, service tokens, DB, registry, and backup.",
+ "content": "Include OIDC, recovery users, service tokens, DB, registry, backup, and standalone panel keys.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -49632,7 +49798,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Revoke compromised material, invalidate sessions, preserve evidence, and test that recovery remains readable.",
+ "content": "Revoke compromised material, invalidate sessions (a local password reset ends an account's sessions, v0.4.0), preserve evidence, and test that recovery remains readable.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -49739,7 +49905,7 @@
"id": "WZi2U",
"name": "Next Link Title",
"fill": "$foreground/foreground",
- "content": "Kubernetes maintenance",
+ "content": "Languages & Translations",
"fontFamily": "JetBrains Mono",
"fontSize": 13,
"fontWeight": "500"
@@ -50074,7 +50240,7 @@
"type": "frame",
"id": "F7wFpj",
"x": 0,
- "y": 68248,
+ "y": 63940,
"name": "Screen/Docs — Kubernetes Maintenance",
"theme": {
"semantic": "dark"
@@ -50196,7 +50362,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -51017,7 +51183,7 @@
"type": "frame",
"id": "a33qlt",
"x": 0,
- "y": 69388,
+ "y": 64920,
"name": "Screen/Docs — Backup Repository Operations",
"theme": {
"semantic": "dark"
@@ -51139,7 +51305,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -51370,7 +51536,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Define initialization, locks, checks, prune, retention, concurrency, bandwidth, and credential rotation.",
+ "content": "Define initialization, locks, checks, prune, retention, and rotation; live multi-volume copies are not consistent (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -51960,7 +52126,7 @@
"type": "frame",
"id": "oi58h",
"x": 0,
- "y": 70528,
+ "y": 65900,
"name": "Screen/Docs — Production Observability",
"theme": {
"semantic": "dark"
@@ -52082,7 +52248,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -52213,7 +52379,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Scrape documented API, operator, and agent metric endpoints.",
+ "content": "Scrape documented API, operator, agent, and relay tunnel metric endpoints.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -52393,7 +52559,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Alert on stuck/failed work, capacity, DB, certs, backups, and sources.",
+ "content": "Alert on stuck/failed work, capacity, DB, certs, backups, sources, relay health, and performance (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -52903,7 +53069,7 @@
"type": "frame",
"id": "Yemnl",
"x": 0,
- "y": 71668,
+ "y": 66880,
"name": "Screen/Docs — Mods & Modpacks",
"theme": {
"semantic": "dark"
@@ -53025,7 +53191,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -53404,7 +53570,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Back up first, confirm the manifest, allow the required restart, and validate events, logs, and player joins.",
+ "content": "Back up first, confirm the manifest, allow the required restart, and validate events, logs, and player joins. Installs stay inside the server's mods root (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -53846,7 +54012,7 @@
"type": "frame",
"id": "o7PQv",
"x": 0,
- "y": 72808,
+ "y": 67860,
"name": "Screen/Docs — Lifecycle & Health Probes",
"theme": {
"semantic": "dark"
@@ -53968,7 +54134,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -54789,7 +54955,7 @@
"type": "frame",
"id": "ydcNa",
"x": 0,
- "y": 73948,
+ "y": 68840,
"name": "Screen/Docs — Ownership & Danger Zone",
"theme": {
"semantic": "dark"
@@ -54911,7 +55077,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -54962,7 +55128,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Ownership, collaborators, transfer, wipe, and delete are available in v0.2.0-beta.8, where operator-role users can also run them on servers they don't own. From v0.3.0, transferring ownership, editing collaborators, wiping data and deleting a server need the server's owner or an admin. Servers with no recorded owner (for example created with kubectl or GitOps) can then be transferred, wiped or deleted only by an admin.",
+ "content": "Transferring ownership, editing collaborators, wiping data and deleting a server need the server's owner or an admin. Servers with no recorded owner (for example created with kubectl or GitOps) can be transferred, wiped or deleted only by an admin. In v0.2.0-beta.8 and earlier, operator-role users could also run these on servers they don't own.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -55290,7 +55456,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Wipe keeps configuration and resets world data; Delete removes the GameServer, workload, and data volume.",
+ "content": "Wipe keeps configuration and resets world data; Delete removes the GameServer, workload, and data volume. A wipe and a backup or restore of one server never overlap (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -55732,7 +55898,7 @@
"type": "frame",
"id": "FclAt",
"x": 0,
- "y": 75088,
+ "y": 69820,
"name": "Screen/Docs — Backup Destinations",
"theme": {
"semantic": "dark"
@@ -55854,7 +56020,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -56675,7 +56841,7 @@
"type": "frame",
"id": "qXFiI",
"x": 0,
- "y": 76228,
+ "y": 70800,
"name": "Screen/Docs — Upload a Module",
"theme": {
"semantic": "dark"
@@ -56797,7 +56963,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -56992,7 +57158,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Validate identity, semver, capabilities, images, and supported versions.",
+ "content": "Validate identity, semver, capabilities, images, supported versions, and locales (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -57618,7 +57784,7 @@
"type": "frame",
"id": "BBcwU",
"x": 0,
- "y": 77368,
+ "y": 71780,
"name": "Screen/Docs — Mod Registry Credentials",
"theme": {
"semantic": "dark"
@@ -57740,7 +57906,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -58561,7 +58727,7 @@
"type": "frame",
"id": "n8pnD",
"x": 0,
- "y": 78508,
+ "y": 72760,
"name": "Screen/Docs — Cluster Nodes & Kubeconfig",
"theme": {
"semantic": "dark"
@@ -58683,7 +58849,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -58766,7 +58932,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Confirm distribution, version, ready count, roles, pressure, uptime, pod capacity, CPU, and memory before changing infrastructure.",
+ "content": "Confirm distribution, version, ready count, roles, pressure, uptime, pod capacity, CPU, and memory on the Nodes page (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -58914,7 +59080,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The action requires clusterOps.enabled and an authorized role, and the file must be handled as a secret.",
+ "content": "The action requires clusterOps.enabled and an authorized role. Replace a standalone registration by PUT, never by delete and re-register (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -59504,7 +59670,7 @@
"type": "frame",
"id": "mYDXb",
"x": 0,
- "y": 79648,
+ "y": 73740,
"name": "Screen/Docs — User Administration",
"theme": {
"semantic": "dark"
@@ -59626,7 +59792,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -59905,7 +60071,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Edit display name, email, and primary role deliberately.",
+ "content": "Edit display name, email, and primary role deliberately; only a full administrator can grant admin-level roles (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -59937,7 +60103,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Reset only local passwords in Gameplane with a new 12+ character value.",
+ "content": "Reset only local passwords in Gameplane with a new 12+ character value; this ends all of the user's sessions (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -60447,7 +60613,7 @@
"type": "frame",
"id": "w7kbJ",
"x": 0,
- "y": 80788,
+ "y": 74720,
"name": "Screen/Docs — System Log Viewer",
"theme": {
"semantic": "dark"
@@ -60569,7 +60735,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -61390,14 +61556,14 @@
"type": "frame",
"id": "yUfLD",
"x": 0,
- "y": 81928,
+ "y": 75700,
"name": "Screen/Docs — Notification Sinks",
"theme": {
"semantic": "dark"
},
"clip": true,
"width": 1440,
- "height": 900,
+ "height": 1000,
"fill": "$background/background",
"children": [
{
@@ -61512,7 +61678,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -61718,6 +61884,154 @@
}
]
},
+ {
+ "type": "frame",
+ "id": "iFA89",
+ "name": "Guide Section 1b Language",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "MYCYJ",
+ "name": "Section Title Language",
+ "fill": "$foreground/foreground",
+ "content": "Set the language per destination (v0.4.0)",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "S5glg1",
+ "name": "Section Body Language",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Each sink can have its own language. Its messages and test sends use it; sinks without one use the instance default, which falls back to English.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "jyeyF",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "M9gdl",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "vLR4T",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "UbvjT",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Discord, email and webhook messages follow the sink's language.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "s6Dp9",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "z07t6",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "GRzec",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Unsupported language tags are rejected with 400.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "KBC7p",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "E8rmHM",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "p2f0GY",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Kubernetes reason and message stay in English.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
{
"type": "frame",
"id": "H3Nk1",
@@ -62333,7 +62647,7 @@
"type": "frame",
"id": "cpCjN",
"x": 0,
- "y": 83068,
+ "y": 76780,
"name": "Screen/Docs — Platform Settings & Telemetry",
"theme": {
"semantic": "dark"
@@ -62455,7 +62769,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -62766,7 +63080,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Set api.telemetry.enabled=false for a hard off; api.telemetry.endpoint redirects reports.",
+ "content": "Set api.telemetry.enabled=false for a hard off; a custom api.telemetry.endpoint replaces the default destination.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -62798,7 +63112,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Installs that never saved a choice stay off after an upgrade; recheck the setting.",
+ "content": "Basic-saved installs with no destination start sending after v0.4.0; set api.telemetry.enabled=false before upgrading.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -63276,7 +63590,7 @@
"type": "frame",
"id": "eQ4ES",
"x": 0,
- "y": 84208,
+ "y": 77760,
"name": "Screen/Docs — Using the Mobile Dashboard",
"theme": {
"semantic": "dark"
@@ -63398,7 +63712,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -64219,7 +64533,7 @@
"type": "frame",
"id": "Dnjfp",
"x": 0,
- "y": 85348,
+ "y": 78740,
"name": "Screen/Docs — Local Development Setup",
"theme": {
"semantic": "dark"
@@ -64341,7 +64655,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -65162,7 +65476,7 @@
"type": "frame",
"id": "rqx1v",
"x": 0,
- "y": 86488,
+ "y": 79720,
"name": "Screen/Docs — Repository & Components",
"theme": {
"semantic": "dark"
@@ -65284,7 +65598,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -66105,7 +66419,7 @@
"type": "frame",
"id": "ZwM1N",
"x": 0,
- "y": 87628,
+ "y": 80700,
"name": "Screen/Docs — Web Dashboard Development",
"theme": {
"semantic": "dark"
@@ -66227,7 +66541,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -66310,7 +66624,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "React and Vite use explicit routing, query caches, reusable components, Monaco, and terminal primitives.",
+ "content": "React and Vite use explicit routing, query caches, reusable components, bundled Monaco, and terminal primitives under a CSP (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -66506,7 +66820,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "api injects credentials, CSRF on mutations, and uniform APIError.",
+ "content": "api injects credentials, CSRF, and localized problem+json errors (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -66606,7 +66920,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Use strict build, lint, Vitest/MSW, and the appropriate Playwright mode; UI changes cite Pencil node IDs.",
+ "content": "Use strict build, lint, Vitest/MSW, and Playwright; wrap UI text with intl and run i18n:extract (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -67048,7 +67362,7 @@
"type": "frame",
"id": "A2sAtw",
"x": 0,
- "y": 88768,
+ "y": 81680,
"name": "Screen/Docs — API & Realtime Development",
"theme": {
"semantic": "dark"
@@ -67170,7 +67484,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -67991,7 +68305,7 @@
"type": "frame",
"id": "l1vmU",
"x": 0,
- "y": 89908,
+ "y": 82660,
"name": "Screen/Docs — Operator & CRD Development",
"theme": {
"semantic": "dark"
@@ -68113,7 +68427,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -68164,7 +68478,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Helm does not upgrade existing CRDs automatically; generated chart CRDs and explicit upgrade instructions must stay synchronized.",
+ "content": "Helm does not upgrade existing CRDs automatically; keep generated chart CRDs and upgrade instructions in sync. The standalone profile (operator.enabled=false) omits bundled CRDs (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -68456,7 +68770,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Review operator/config/crd and charts/gameplane/crds together.",
+ "content": "Review operator/config/crd and charts/gameplane/charts/gameplane-crds/crds together.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -68934,7 +69248,7 @@
"type": "frame",
"id": "o5zdzd",
"x": 0,
- "y": 91048,
+ "y": 83640,
"name": "Screen/Docs — Agent & Game Protocols",
"theme": {
"semantic": "dark"
@@ -69056,7 +69370,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -69367,7 +69681,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Model console mode and credentials without hard-coding secrets.",
+ "content": "Model console mode and credentials without hard-coding secrets; a console with no password sets spec.rcon.authentication: false (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -69877,7 +70191,7 @@
"type": "frame",
"id": "z6p3NP",
"x": 0,
- "y": 92188,
+ "y": 84620,
"name": "Screen/Docs — Database Migrations",
"theme": {
"semantic": "dark"
@@ -69999,7 +70313,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -70194,7 +70508,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Embedded migration SQL runs in filename order at startup.",
+ "content": "Shared SQL in migrations/common/ runs in filename order after the per-driver sets.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -70414,7 +70728,7 @@
"id": "p2LgJ",
"name": "Quick Reference Line 1",
"fill": "$foreground/foreground",
- "content": "01 api/internal/db/migrations/006_.sql",
+ "content": "01 api/internal/db/migrations/common/020_.sql",
"fontFamily": "JetBrains Mono",
"fontSize": 11.5,
"fontWeight": "normal"
@@ -70820,7 +71134,7 @@
"type": "frame",
"id": "ac8lF",
"x": 0,
- "y": 93328,
+ "y": 85600,
"name": "Screen/Docs — Testing, Coverage & E2E",
"theme": {
"semantic": "dark"
@@ -70942,7 +71256,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -71763,7 +72077,7 @@
"type": "frame",
"id": "W5p4Z1",
"x": 0,
- "y": 94468,
+ "y": 86580,
"name": "Screen/Docs — Contribution & Design Workflow",
"theme": {
"semantic": "dark"
@@ -71885,7 +72199,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -72706,7 +73020,7 @@
"type": "frame",
"id": "rW1Ux",
"x": 0,
- "y": 95608,
+ "y": 87560,
"name": "Screen/Docs — CI, Releases & Signing",
"theme": {
"semantic": "dark"
@@ -72828,7 +73142,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -73059,7 +73373,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Changes on main publish rolling edge and immutable sha tags for all released components.",
+ "content": "Changes on master publish rolling edge and immutable sha tags for all released components.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -73263,7 +73577,7 @@
"id": "paKl1",
"name": "Quick Reference Line 3",
"fill": "$foreground/foreground",
- "content": "03 cosign verify --key cosign.pub --insecure-ignore-tlog=true ",
+ "content": "03 cosign verify --key signing/cosign.pub ",
"fontFamily": "JetBrains Mono",
"fontSize": 11.5,
"fontWeight": "normal"
@@ -73649,7 +73963,7 @@
"type": "frame",
"id": "IwY6K",
"x": 0,
- "y": 96748,
+ "y": 88540,
"name": "Screen/Docs — Extension Services",
"theme": {
"semantic": "dark"
@@ -73771,7 +74085,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -73934,7 +74248,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "telemetry-receiver accepts the opt-in product telemetry path.",
+ "content": "telemetry-receiver accepts anonymous daily usage reports in a basic and an extended tier.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -74592,7 +74906,7 @@
"type": "frame",
"id": "opatX",
"x": 0,
- "y": 97888,
+ "y": 89520,
"name": "Screen/Docs — Public Website Development",
"theme": {
"semantic": "dark"
@@ -74714,7 +75028,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -74877,7 +75191,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Docs MDX lives in website/src/content/docs with a shared DocsLayout.",
+ "content": "Docs MDX lives in website/src/content/docs with a shared DocsLayout. Sidebar order comes from src/lib/docs-nav.ts.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -75535,7 +75849,7 @@
"type": "frame",
"id": "wvEgh",
"x": 0,
- "y": 99028,
+ "y": 90500,
"name": "Screen/Docs — Module Authoring Quickstart",
"theme": {
"semantic": "dark"
@@ -75657,7 +75971,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -75788,7 +76102,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Create module.yaml, template.yaml, and README.md.",
+ "content": "Create module.yaml, template.yaml, and README.md, plus optional locales/ translations (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -76036,7 +76350,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Validate, push to the local registry, wait for source synchronization, install, and prove Module and generated template readiness.",
+ "content": "Validate (checks translations, v0.4.0), push to the local registry, wait for source synchronization, install, and prove Module and generated template readiness.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -76478,7 +76792,7 @@
"type": "frame",
"id": "r4WPE",
"x": 0,
- "y": 100168,
+ "y": 91480,
"name": "Screen/Docs — GameTemplate Schema",
"theme": {
"semantic": "dark"
@@ -76600,7 +76914,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -76831,7 +77145,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Map typed inputs to environment, args, or rendered files without exposing secrets in status.",
+ "content": "Map typed inputs to env, args, or files without exposing secrets. Ship locales/.json translations (v0.4.0).",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -77421,7 +77735,7 @@
"type": "frame",
"id": "aZAEs",
"x": 0,
- "y": 101308,
+ "y": 92460,
"name": "Screen/Docs — Runtime Capabilities & Actions",
"theme": {
"semantic": "dark"
@@ -77543,7 +77857,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -77674,7 +77988,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Never hard-code an RCON or console password.",
+ "content": "Never hard-code a console password; authentication: false only for no-password consoles (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -78364,7 +78678,7 @@
"type": "frame",
"id": "g8vHa",
"x": 0,
- "y": 102448,
+ "y": 93440,
"name": "Screen/Docs — Test, Publish & Sign Modules",
"theme": {
"semantic": "dark"
@@ -78486,7 +78800,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -78617,7 +78931,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Validate metadata/schema and wait for ModuleSource synchronization.",
+ "content": "Validate metadata/schema, wait for sync, and check LocalesValid=Valid when translated (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -79307,7 +79621,7 @@
"type": "frame",
"id": "deVW7",
"x": 0,
- "y": 103588,
+ "y": 94420,
"name": "Screen/Docs — Supported Versions Matrix",
"theme": {
"semantic": "dark"
@@ -80352,7 +80666,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "1.25+",
+ "content": "1.27+",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -80831,7 +81145,7 @@
"type": "frame",
"id": "upO5i",
"x": 0,
- "y": 104728,
+ "y": 95400,
"name": "Screen/Docs — REST API Reference",
"theme": {
"semantic": "dark"
@@ -81677,25 +81991,25 @@
},
{
"type": "frame",
- "id": "R45w3",
- "name": "Reference Block 2",
+ "id": "NmHVl",
+ "name": "Reference Block Clusters",
"width": "fill_container",
"layout": "vertical",
"gap": 7,
"children": [
{
"type": "text",
- "id": "SWnUL",
+ "id": "N3paj",
"name": "Reference Block Title 2",
"fill": "$foreground/foreground",
- "content": "Actions and administration",
+ "content": "Clusters and nodes",
"fontFamily": "JetBrains Mono",
"fontSize": 14,
"fontWeight": "600"
},
{
"type": "frame",
- "id": "UNRt0",
+ "id": "tmbED",
"name": "Reference Table 2",
"clip": true,
"width": "fill_container",
@@ -81707,7 +82021,7 @@
"children": [
{
"type": "frame",
- "id": "Q7CjJn",
+ "id": "XPgN8",
"name": "Reference Table Header 2",
"width": "fill_container",
"height": 32,
@@ -81716,7 +82030,7 @@
"children": [
{
"type": "frame",
- "id": "c0TIu",
+ "id": "wSbOK",
"name": "Header 2 Cell 0",
"width": 270,
"height": "fill_container",
@@ -81728,7 +82042,7 @@
"children": [
{
"type": "text",
- "id": "VNmHE",
+ "id": "Ninxs",
"name": "Header 2 Text 0",
"fill": "$field/placeholder",
"content": "ROUTE",
@@ -81741,7 +82055,7 @@
},
{
"type": "frame",
- "id": "qL4r3",
+ "id": "YUpDB",
"name": "Header 2 Cell 1",
"width": 130,
"height": "fill_container",
@@ -81753,7 +82067,7 @@
"children": [
{
"type": "text",
- "id": "GkM2n",
+ "id": "PZHDh",
"name": "Header 2 Text 1",
"fill": "$field/placeholder",
"content": "METHOD",
@@ -81766,7 +82080,7 @@
},
{
"type": "frame",
- "id": "BeOs5",
+ "id": "ve2cO",
"name": "Header 2 Cell 2",
"width": 150,
"height": "fill_container",
@@ -81778,7 +82092,7 @@
"children": [
{
"type": "text",
- "id": "A1YRg",
+ "id": "xFNnL",
"name": "Header 2 Text 2",
"fill": "$field/placeholder",
"content": "PERMISSION",
@@ -81791,7 +82105,7 @@
},
{
"type": "frame",
- "id": "MGcrP",
+ "id": "LPCKL",
"name": "Header 2 Cell 3",
"width": "fill_container",
"height": "fill_container",
@@ -81803,7 +82117,7 @@
"children": [
{
"type": "text",
- "id": "Ofab6",
+ "id": "ddLLQ",
"name": "Header 2 Text 3",
"fill": "$field/placeholder",
"content": "DESCRIPTION",
@@ -81818,7 +82132,7 @@
},
{
"type": "frame",
- "id": "m0ROSX",
+ "id": "xChTe",
"name": "Reference 2 Row 0",
"width": "fill_container",
"height": 38,
@@ -81833,7 +82147,7 @@
"children": [
{
"type": "frame",
- "id": "N9mQG",
+ "id": "ULZhG",
"name": "Reference 2 Row 0 Cell 0",
"width": 270,
"height": "fill_container",
@@ -81845,12 +82159,12 @@
"children": [
{
"type": "text",
- "id": "e5r2p7",
+ "id": "vxUMV",
"name": "Reference 2 Row 0 Text 0",
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "/servers/{name}:restart",
+ "content": "/clusters",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "500"
@@ -81859,7 +82173,7 @@
},
{
"type": "frame",
- "id": "C4RuS5",
+ "id": "Z83vzn",
"name": "Reference 2 Row 0 Cell 1",
"width": 130,
"height": "fill_container",
@@ -81871,12 +82185,12 @@
"children": [
{
"type": "text",
- "id": "WBRyZ",
+ "id": "Ar6n7",
"name": "Reference 2 Row 0 Text 1",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "POST",
+ "content": "GET · POST",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -81885,7 +82199,7 @@
},
{
"type": "frame",
- "id": "m2naY",
+ "id": "l72phB",
"name": "Reference 2 Row 0 Cell 2",
"width": 150,
"height": "fill_container",
@@ -81897,12 +82211,12 @@
"children": [
{
"type": "text",
- "id": "PE5cn",
+ "id": "r5MRuz",
"name": "Reference 2 Row 0 Text 2",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "servers:write",
+ "content": "cluster:manage (POST)",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -81911,7 +82225,7 @@
},
{
"type": "frame",
- "id": "k06kw",
+ "id": "OcZrJ",
"name": "Reference 2 Row 0 Cell 3",
"width": "fill_container",
"height": "fill_container",
@@ -81923,12 +82237,12 @@
"children": [
{
"type": "text",
- "id": "E5cUQ",
+ "id": "bxAnk",
"name": "Reference 2 Row 0 Text 3",
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Request an audited graceful restart.",
+ "content": "List visible clusters; register one with POST.",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
@@ -81939,7 +82253,7 @@
},
{
"type": "frame",
- "id": "M3Ppan",
+ "id": "bY9gs",
"name": "Reference 2 Row 1",
"width": "fill_container",
"height": 38,
@@ -81954,7 +82268,7 @@
"children": [
{
"type": "frame",
- "id": "AasKK",
+ "id": "iRKlY",
"name": "Reference 2 Row 1 Cell 0",
"width": 270,
"height": "fill_container",
@@ -81966,12 +82280,12 @@
"children": [
{
"type": "text",
- "id": "sa4NX",
+ "id": "K9cgrT",
"name": "Reference 2 Row 1 Text 0",
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "/servers/{name}/files",
+ "content": "/fleet/inventory",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "500"
@@ -81980,7 +82294,7 @@
},
{
"type": "frame",
- "id": "Q5sJx",
+ "id": "CqVs1",
"name": "Reference 2 Row 1 Cell 1",
"width": 130,
"height": "fill_container",
@@ -81992,12 +82306,12 @@
"children": [
{
"type": "text",
- "id": "Y0LZEg",
+ "id": "C6hAl",
"name": "Reference 2 Row 1 Text 1",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "GET · PUT",
+ "content": "GET",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -82006,7 +82320,7 @@
},
{
"type": "frame",
- "id": "jN9qp",
+ "id": "ZyOMk",
"name": "Reference 2 Row 1 Cell 2",
"width": 150,
"height": "fill_container",
@@ -82018,12 +82332,12 @@
"children": [
{
"type": "text",
- "id": "J6sLn",
+ "id": "GcJll",
"name": "Reference 2 Row 1 Text 2",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "servers:write",
+ "content": "inventory grant",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -82032,7 +82346,7 @@
},
{
"type": "frame",
- "id": "H9CbZl",
+ "id": "SJ21J",
"name": "Reference 2 Row 1 Cell 3",
"width": "fill_container",
"height": "fill_container",
@@ -82044,12 +82358,12 @@
"children": [
{
"type": "text",
- "id": "PQZri",
+ "id": "xVRGv",
"name": "Reference 2 Row 1 Text 3",
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Agent-backed file browse and mutation proxy.",
+ "content": "Nodes of every cluster you can see (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
@@ -82057,11 +82371,156 @@
]
}
]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "R45w3",
+ "name": "Reference Block 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 7,
+ "children": [
+ {
+ "type": "text",
+ "id": "SWnUL",
+ "name": "Reference Block Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Actions and administration",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 14,
+ "fontWeight": "600"
+ },
+ {
+ "type": "frame",
+ "id": "UNRt0",
+ "name": "Reference Table 2",
+ "clip": true,
+ "width": "fill_container",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "children": [
+ {
+ "type": "frame",
+ "id": "Q7CjJn",
+ "name": "Reference Table Header 2",
+ "width": "fill_container",
+ "height": 32,
+ "fill": "$surface/surface",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "c0TIu",
+ "name": "Header 2 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "VNmHE",
+ "name": "Header 2 Text 0",
+ "fill": "$field/placeholder",
+ "content": "ROUTE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "qL4r3",
+ "name": "Header 2 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "GkM2n",
+ "name": "Header 2 Text 1",
+ "fill": "$field/placeholder",
+ "content": "METHOD",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "BeOs5",
+ "name": "Header 2 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "A1YRg",
+ "name": "Header 2 Text 2",
+ "fill": "$field/placeholder",
+ "content": "PERMISSION",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "MGcrP",
+ "name": "Header 2 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "Ofab6",
+ "name": "Header 2 Text 3",
+ "fill": "$field/placeholder",
+ "content": "DESCRIPTION",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.5
+ }
+ ]
+ }
+ ]
},
{
"type": "frame",
- "id": "bsVd8",
- "name": "Reference 2 Row 2",
+ "id": "m0ROSX",
+ "name": "Reference 2 Row 0",
"width": "fill_container",
"height": 38,
"fill": "$background/background",
@@ -82075,8 +82534,8 @@
"children": [
{
"type": "frame",
- "id": "ZP6QG",
- "name": "Reference 2 Row 2 Cell 0",
+ "id": "N9mQG",
+ "name": "Reference 2 Row 0 Cell 0",
"width": 270,
"height": "fill_container",
"padding": [
@@ -82087,12 +82546,12 @@
"children": [
{
"type": "text",
- "id": "qCAST",
- "name": "Reference 2 Row 2 Text 0",
+ "id": "e5r2p7",
+ "name": "Reference 2 Row 0 Text 0",
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "/admin/config",
+ "content": "/servers/{name}:restart",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "500"
@@ -82101,8 +82560,8 @@
},
{
"type": "frame",
- "id": "NJptD",
- "name": "Reference 2 Row 2 Cell 1",
+ "id": "C4RuS5",
+ "name": "Reference 2 Row 0 Cell 1",
"width": 130,
"height": "fill_container",
"padding": [
@@ -82113,12 +82572,12 @@
"children": [
{
"type": "text",
- "id": "BNu3k",
- "name": "Reference 2 Row 2 Text 1",
+ "id": "WBRyZ",
+ "name": "Reference 2 Row 0 Text 1",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "GET · PATCH",
+ "content": "POST",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -82127,8 +82586,8 @@
},
{
"type": "frame",
- "id": "lJfSj",
- "name": "Reference 2 Row 2 Cell 2",
+ "id": "m2naY",
+ "name": "Reference 2 Row 0 Cell 2",
"width": 150,
"height": "fill_container",
"padding": [
@@ -82139,12 +82598,12 @@
"children": [
{
"type": "text",
- "id": "ezUl9",
- "name": "Reference 2 Row 2 Text 2",
+ "id": "PE5cn",
+ "name": "Reference 2 Row 0 Text 2",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "config:read/manage",
+ "content": "servers:write",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -82153,8 +82612,8 @@
},
{
"type": "frame",
- "id": "ydwWu",
- "name": "Reference 2 Row 2 Cell 3",
+ "id": "k06kw",
+ "name": "Reference 2 Row 0 Cell 3",
"width": "fill_container",
"height": "fill_container",
"padding": [
@@ -82165,12 +82624,12 @@
"children": [
{
"type": "text",
- "id": "m3Jbvi",
- "name": "Reference 2 Row 2 Text 3",
+ "id": "E5cUQ",
+ "name": "Reference 2 Row 0 Text 3",
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Read or update platform configuration.",
+ "content": "Request an audited graceful restart.",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
@@ -82181,8 +82640,8 @@
},
{
"type": "frame",
- "id": "h0LTD",
- "name": "Reference 2 Row 3",
+ "id": "M3Ppan",
+ "name": "Reference 2 Row 1",
"width": "fill_container",
"height": 38,
"fill": "$surface/secondary",
@@ -82196,8 +82655,8 @@
"children": [
{
"type": "frame",
- "id": "Hk9lU",
- "name": "Reference 2 Row 3 Cell 0",
+ "id": "AasKK",
+ "name": "Reference 2 Row 1 Cell 0",
"width": 270,
"height": "fill_container",
"padding": [
@@ -82208,12 +82667,12 @@
"children": [
{
"type": "text",
- "id": "Os0Yd",
- "name": "Reference 2 Row 3 Text 0",
+ "id": "sa4NX",
+ "name": "Reference 2 Row 1 Text 0",
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "/admin/audit/export",
+ "content": "/servers/{name}/files",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "500"
@@ -82222,8 +82681,8 @@
},
{
"type": "frame",
- "id": "M7fpG1",
- "name": "Reference 2 Row 3 Cell 1",
+ "id": "Q5sJx",
+ "name": "Reference 2 Row 1 Cell 1",
"width": 130,
"height": "fill_container",
"padding": [
@@ -82234,12 +82693,12 @@
"children": [
{
"type": "text",
- "id": "n3oHy4",
- "name": "Reference 2 Row 3 Text 1",
+ "id": "Y0LZEg",
+ "name": "Reference 2 Row 1 Text 1",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "GET",
+ "content": "GET · PUT",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -82248,8 +82707,8 @@
},
{
"type": "frame",
- "id": "S3dMz",
- "name": "Reference 2 Row 3 Cell 2",
+ "id": "jN9qp",
+ "name": "Reference 2 Row 1 Cell 2",
"width": 150,
"height": "fill_container",
"padding": [
@@ -82260,12 +82719,12 @@
"children": [
{
"type": "text",
- "id": "cLZjL",
- "name": "Reference 2 Row 3 Text 2",
+ "id": "J6sLn",
+ "name": "Reference 2 Row 1 Text 2",
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "audit:read",
+ "content": "servers:write",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -82274,8 +82733,8 @@
},
{
"type": "frame",
- "id": "R2Ecn",
- "name": "Reference 2 Row 3 Cell 3",
+ "id": "H9CbZl",
+ "name": "Reference 2 Row 1 Cell 3",
"width": "fill_container",
"height": "fill_container",
"padding": [
@@ -82286,12 +82745,12 @@
"children": [
{
"type": "text",
- "id": "DUQE4",
- "name": "Reference 2 Row 3 Text 3",
+ "id": "PQZri",
+ "name": "Reference 2 Row 1 Text 3",
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Export a filtered audit evidence set.",
+ "content": "Agent-backed file browse and mutation proxy.",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
@@ -82299,34 +82758,276 @@
]
}
]
- }
- ]
- }
- ]
- },
- {
- "type": "frame",
- "id": "S5XWL",
- "name": "Reference Note",
- "width": "fill_container",
- "fill": "#FF4FA30F",
- "cornerRadius": "$radius/xl",
- "stroke": "#FF4FA34D",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "gap": 9,
- "padding": [
- 10,
- 12
- ],
- "alignItems": "center",
- "children": [
- {
- "type": "icon",
- "id": "WN1aJ",
- "name": "Reference Note Icon",
- "width": 15,
- "height": 15,
+ },
+ {
+ "type": "frame",
+ "id": "bsVd8",
+ "name": "Reference 2 Row 2",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$background/background",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "ZP6QG",
+ "name": "Reference 2 Row 2 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "qCAST",
+ "name": "Reference 2 Row 2 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "/admin/config",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "NJptD",
+ "name": "Reference 2 Row 2 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "BNu3k",
+ "name": "Reference 2 Row 2 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GET · PATCH",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "lJfSj",
+ "name": "Reference 2 Row 2 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "ezUl9",
+ "name": "Reference 2 Row 2 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "config:read/manage",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "ydwWu",
+ "name": "Reference 2 Row 2 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "m3Jbvi",
+ "name": "Reference 2 Row 2 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Read or update platform configuration.",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "h0LTD",
+ "name": "Reference 2 Row 3",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$surface/secondary",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "Hk9lU",
+ "name": "Reference 2 Row 3 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "Os0Yd",
+ "name": "Reference 2 Row 3 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "/admin/audit/export",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "M7fpG1",
+ "name": "Reference 2 Row 3 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "n3oHy4",
+ "name": "Reference 2 Row 3 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GET",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "S3dMz",
+ "name": "Reference 2 Row 3 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "cLZjL",
+ "name": "Reference 2 Row 3 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "audit:read",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "R2Ecn",
+ "name": "Reference 2 Row 3 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "DUQE4",
+ "name": "Reference 2 Row 3 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Export a filtered audit evidence set.",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "S5XWL",
+ "name": "Reference Note",
+ "width": "fill_container",
+ "fill": "#FF4FA30F",
+ "cornerRadius": "$radius/xl",
+ "stroke": "#FF4FA34D",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 9,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "WN1aJ",
+ "name": "Reference Note Icon",
+ "width": 15,
+ "height": 15,
"icon": "info",
"library": "lucide",
"fill": "$accent/accent"
@@ -82355,7 +83056,7 @@
"type": "frame",
"id": "VgF1s",
"x": 0,
- "y": 105868,
+ "y": 96380,
"name": "Screen/Docs — WebSocket & Event Streams",
"theme": {
"semantic": "dark"
@@ -83879,7 +84580,7 @@
"type": "frame",
"id": "IEkUB",
"x": 0,
- "y": 107008,
+ "y": 97460,
"name": "Screen/Docs — CRD Catalog",
"theme": {
"semantic": "dark"
@@ -84718,6 +85419,127 @@
]
}
]
+ },
+ {
+ "type": "frame",
+ "id": "J4pkIA",
+ "name": "Reference 1 Row 4 NetworkCapture",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$background/background",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "bG5mL",
+ "name": "Reference 1 Row 4 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "RF0am",
+ "name": "Reference 1 Row 4 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "NetworkCapture",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YoNvz",
+ "name": "Reference 1 Row 4 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "zbCJv",
+ "name": "Reference 1 Row 4 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Namespaced",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "X94Vm",
+ "name": "Reference 1 Row 4 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "ahBE9",
+ "name": "Reference 1 Row 4 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "cap",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "xn2Xt",
+ "name": "Reference 1 Row 4 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "O5CZ1f",
+ "name": "Reference 1 Row 4 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Packet-capture record for a server (v0.3.0).",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
}
]
}
@@ -85403,7 +86225,7 @@
"type": "frame",
"id": "oX22m",
"x": 0,
- "y": 108148,
+ "y": 98440,
"name": "Screen/Docs — GameServer & Template Schema",
"theme": {
"semantic": "dark"
@@ -86113,7 +86935,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "CPU and memory requests and limits.",
+ "content": "CPU and memory requests and limits; requests may sit below limits (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 11,
"fontWeight": "normal"
@@ -86927,7 +87749,7 @@
"type": "frame",
"id": "lRCKI",
"x": 0,
- "y": 109288,
+ "y": 99420,
"name": "Screen/Docs — Backup & Restore CRDs",
"theme": {
"semantic": "dark"
@@ -88451,7 +89273,7 @@
"type": "frame",
"id": "ZTnNa",
"x": 0,
- "y": 110428,
+ "y": 100400,
"name": "Screen/Docs — Module & Cluster CRDs",
"theme": {
"semantic": "dark"
@@ -89975,7 +90797,7 @@
"type": "frame",
"id": "eDaA6",
"x": 0,
- "y": 111568,
+ "y": 101380,
"name": "Screen/Docs — Status, Phases & Conditions",
"theme": {
"semantic": "dark"
@@ -91167,7 +91989,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Ready",
+ "content": "Ready · Consistency",
"fontFamily": "JetBrains Mono",
"fontSize": 10.5,
"fontWeight": "normal"
@@ -91443,6 +92265,127 @@
]
}
]
+ },
+ {
+ "type": "frame",
+ "id": "Qzd2s",
+ "name": "Reference 2 Row 4",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$surface/secondary",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "GMUHG",
+ "name": "Reference 2 Row 3 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "WR9O4",
+ "name": "Reference 2 Row 3 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GameTemplate",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "NKQya",
+ "name": "Reference 2 Row 3 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "CIoRH",
+ "name": "Reference 2 Row 3 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Valid · Invalid",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "B0oHW9",
+ "name": "Reference 2 Row 3 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "KMRU6",
+ "name": "Reference 2 Row 3 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "LocalesValid (v0.4.0)",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YWbjE",
+ "name": "Reference 2 Row 3 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "s3DeE",
+ "name": "Reference 2 Row 3 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Never blocks install",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
}
]
}
@@ -91499,7 +92442,7 @@
"type": "frame",
"id": "mu58o",
"x": 0,
- "y": 112708,
+ "y": 102360,
"name": "Screen/Docs — Permission Catalog",
"theme": {
"semantic": "dark"
@@ -93006,7 +93949,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Unknown permission strings are rejected. Effective access is permission + resource scope + ownership.",
+ "content": "Unknown permissions are rejected. Admin-level grants need the * wildcard. Effective access is permission + scope + ownership.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -93023,7 +93966,7 @@
"type": "frame",
"id": "a0X2rT",
"x": 0,
- "y": 113848,
+ "y": 103340,
"name": "Screen/Docs — Metrics, Alerts & Dashboards",
"theme": {
"semantic": "dark"
@@ -94491,6 +95434,127 @@
]
}
]
+ },
+ {
+ "type": "frame",
+ "id": "q53ll",
+ "name": "Reference 2 Row 4",
+ "width": "fill_container",
+ "height": 38,
+ "fill": "$surface/secondary",
+ "stroke": "$separator/separator",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "VhdSJ",
+ "name": "Reference 2 Row 3 Cell 0",
+ "width": 270,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "KDGi6",
+ "name": "Reference 2 Row 3 Text 0",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GameplaneRelayUnavailable",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "tNMOL",
+ "name": "Reference 2 Row 3 Cell 1",
+ "width": 130,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "NNasz",
+ "name": "Reference 2 Row 3 Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "relay or forwards down",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "qdlhf",
+ "name": "Reference 2 Row 3 Cell 2",
+ "width": 150,
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "ver06",
+ "name": "Reference 2 Row 3 Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "2m",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 10.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "XRxbM",
+ "name": "Reference 2 Row 3 Cell 3",
+ "width": "fill_container",
+ "height": "fill_container",
+ "padding": [
+ 0,
+ 10
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "t2CKd",
+ "name": "Reference 2 Row 3 Text 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Check tunnel provider",
+ "fontFamily": "Geist",
+ "fontSize": 11,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
}
]
}
@@ -94547,7 +95611,7 @@
"type": "frame",
"id": "EWLk2",
"x": 0,
- "y": 114988,
+ "y": 104320,
"name": "Screen/Docs — Notification Events & Payloads",
"theme": {
"semantic": "dark"
@@ -96054,7 +97118,7 @@
"fill": "$default/foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Every payload includes event, occurredAt, resource identity, cluster identity, severity, and a details object.",
+ "content": "Every payload includes event, occurredAt, resource and cluster identity, severity, and details. Webhooks add language, title, text (v0.4.0).",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -96071,7 +97135,7 @@
"type": "frame",
"id": "e1SUXK",
"x": 0,
- "y": 116128,
+ "y": 105300,
"name": "Screen/Docs — Kubectl & GitOps Recipes",
"theme": {
"semantic": "dark"
@@ -96193,7 +97257,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -97073,7 +98137,7 @@
"name": "betaBadge",
"descendants": {
"W2qoN": {
- "content": "Beta"
+ "content": "Pre-v1"
}
}
}
@@ -97467,7 +98531,7 @@
"id": "ZqbcN",
"name": "versionLine",
"fill": "$muted",
- "content": "v0.2.0-beta.8 · AGPL-3.0-or-later · Built on Kubernetes",
+ "content": "v0.4.0 · AGPL-3.0-or-later · Built on Kubernetes",
"fontFamily": "$typography/font-sans",
"fontSize": 12,
"fontWeight": "normal"
@@ -97752,7 +98816,7 @@
"type": "frame",
"id": "hYJwr",
"x": -17085.200875086215,
- "y": 56735.387616398235,
+ "y": 56939.387616398235,
"name": "HeroUI: Design System Components",
"theme": {
"semantic": "light"
@@ -107963,7 +109027,7 @@
"type": "frame",
"id": "wCt6V",
"x": 0,
- "y": 117108,
+ "y": 106280,
"name": "Screen/Docs — Server Networking & Tunnels",
"theme": {
"semantic": "dark"
@@ -108085,7 +109149,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -108938,7 +110002,7 @@
"type": "frame",
"id": "QHFdH",
"x": 0,
- "y": 118088,
+ "y": 107260,
"name": "Screen/Docs — Remote Agent Gateway",
"theme": {
"semantic": "dark"
@@ -109060,7 +110124,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.2"
+ "content": "v0.4"
}
}
},
@@ -109111,7 +110175,7 @@
"fill": "$accent/soft-foreground",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "The gateway ships in v0.3.0 and is not available in v0.2.0-beta.8.",
+ "content": "The agent gateway is available since v0.3.0.",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -109480,7 +110544,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Create a credential Secret in the central API namespace, then add the gateway reference to the existing Cluster resource with URL and tlsSecretRef.",
+ "content": "Combined installs: create a labeled credential Secret in the central API namespace and add the gateway reference to the Cluster resource. Standalone panels: PUT /clusters//gateway.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -109628,7 +110692,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Confirm the gateway Pod is Ready, the Cluster resource shows Healthy, and test console, file manager and players on a test server.",
+ "content": "Confirm the gateway Pod is Ready, the cluster reports healthy, and test console, file manager and players on a test server.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -109684,7 +110748,7 @@
"id": "Rzlo6",
"name": "Quick Reference Line 3",
"fill": "$foreground/foreground",
- "content": "03 Central: labeled credential Secret + Cluster spec.agentGateway",
+ "content": "03 Central: labeled Secret + Cluster agentGateway, or panel API",
"fontFamily": "JetBrains Mono",
"fontSize": 11.5,
"fontWeight": "normal"
@@ -110140,7 +111204,7 @@
"type": "frame",
"id": "s0Q7Lf",
"x": 0,
- "y": 119308,
+ "y": 108480,
"name": "Screen/Docs — Telemetry Provider on Kubernetes",
"theme": {
"semantic": "dark"
@@ -110262,7 +111326,7 @@
"name": "Meta Chip 1",
"descendants": {
"yb6zz": {
- "content": "v0.3"
+ "content": "v0.4"
}
}
},
@@ -111083,7 +112147,7 @@
"type": "frame",
"id": "K6tq5Z",
"x": 0,
- "y": 120468,
+ "y": 109460,
"name": "Screen/Telemetry Statement",
"theme": {
"semantic": "dark"
@@ -111153,7 +112217,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": 760,
- "content": "Last updated 2026-10-07.",
+ "content": "Last updated 2026-11-10.",
"textAlign": "center",
"fontFamily": "$typography/font-sans",
"fontSize": 16,
@@ -111227,7 +112291,7 @@
"fill": "$muted",
"textGrowth": "fixed-width",
"width": "fill_container",
- "content": "Two tiers, about once a day, only while an admin leaves them on.",
+ "content": "Two tiers, about once a day. New installs send both by default, after the first-login notice; an admin can turn either off. Upgraded installs that saved basic on with no destination start sending basic reports to the project default.",
"lineHeight": 1.45,
"fontFamily": "Geist",
"fontSize": 13,
@@ -111418,110 +112482,2343 @@
},
{
"type": "frame",
- "id": "nFcmz",
- "name": "Guide Section 1",
- "width": "fill_container",
+ "id": "nFcmz",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "mlrJf",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "What the provider stores",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "d1jyC",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Daily aggregates, activity records and a total-reports counter.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "uiOWJ",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "s2dHPF",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "S4xx2",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "YLcxz",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Daily aggregates: counts by version, fleet-size band and category, never linked to an install ID.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "P1eejb",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "S7sTv6",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "lnrR1",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Activity records: keyed hash of the install ID, key fingerprint, first/last seen, last version.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "cB3db",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "TSFRP",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "rvvnu",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Total-reports counter: a single number.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "t0qQ5B",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "NWxP8",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "How long",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "G5KyWM",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Aggregates 24 months; activity records 90 days after the last report; source addresses never written to disk.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "pYTx1",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "k3JsKp",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Abuse protection",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "O81l3",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Strict validation (16 KiB cap), per-source daily limit, proof-of-work that costs nothing in normal traffic, and a private token-protected dashboard.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "UoRma",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "a6pUwo",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Public summary",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "sKDfN",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "GET /v1/summary returns exactly five numbers; the detailed dashboard is private to the maintainers.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "GVGJA",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "vbCKO",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "How to opt out",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "DTDuT",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Notice before the first report, then separate switches in Admin Settings > Telemetry.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "epdW6",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "x80Spm",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "OYJHO",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "f4kxVu",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "At first login: separate basic and extended switches; basic off turns extended off.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "p9saIX",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "tz1ws",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "XulJR",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "At install time: --set api.telemetry.enabled=false is a hard off with no notice.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "u1pPo",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "hipxx",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "KSniZ",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Custom provider: api.telemetry.endpoint=https://your-host/ingest replaces the project's.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "r5thm",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "hHeyP",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Questions and requests",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "u4JLM1",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Open an issue on GitHub; the maintainers operate the provider.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CZkko",
+ "type": "ref",
+ "ref": "gnZrl",
+ "name": "Footer",
+ "width": "fill_container"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "xA0uh",
+ "x": 0,
+ "y": 111157,
+ "name": "Screen/Docs — Standalone Panel",
+ "theme": {
+ "semantic": "dark"
+ },
+ "clip": true,
+ "width": 1440,
+ "height": 1120,
+ "fill": "$background/background",
+ "children": [
+ {
+ "id": "qlxUA",
+ "type": "ref",
+ "ref": "K2Rt4H",
+ "height": "fill_container",
+ "name": "DocsSidebar/Expanded",
+ "width": 280,
+ "descendants": {
+ "w7U9E": {
+ "fill": "$foreground/foreground"
+ },
+ "Ammc4": {
+ "fill": "$muted"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "ndfDZ",
+ "name": "Docs Main",
+ "width": "fill_container",
+ "height": "fill_container",
+ "fill": "$background/background",
+ "layout": "vertical",
+ "children": [
+ {
+ "id": "egez2",
+ "type": "ref",
+ "ref": "SOdlr",
+ "name": "Docs Top Bar",
+ "width": "fill_container",
+ "descendants": {
+ "NImey": {
+ "content": "Platform"
+ },
+ "ikbi6": {
+ "content": "Standalone panel"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "CjXGW",
+ "name": "Docs Article Body",
+ "clip": true,
+ "width": "fill_container",
+ "height": "fill_container",
+ "gap": 32,
+ "padding": 32,
+ "children": [
+ {
+ "type": "frame",
+ "id": "ieVmb",
+ "name": "Docs Article",
+ "width": 780,
+ "layout": "vertical",
+ "gap": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "ZG2L3",
+ "name": "Article Eyebrow",
+ "fill": "$accent/accent",
+ "content": "PLATFORM",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11,
+ "fontWeight": "600",
+ "letterSpacing": 0.8
+ },
+ {
+ "type": "text",
+ "id": "OvPMn",
+ "name": "Article Title",
+ "fill": "$foreground/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Standalone panel",
+ "lineHeight": 1.1,
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 30,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "nGWrj",
+ "name": "Article Lead",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Run the dashboard and API on a host without Kubernetes, then register remote game clusters and manage their credentials.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 15,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "t5OwMd",
+ "name": "Article Metadata",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "id": "Z2iUw1",
+ "type": "ref",
+ "ref": "NZPtq",
+ "name": "Meta Chip 0",
+ "descendants": {
+ "NLG8t": {
+ "content": "PLATFORM"
+ }
+ }
+ },
+ {
+ "id": "YC4mj",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 1",
+ "descendants": {
+ "yb6zz": {
+ "content": "v0.4"
+ }
+ }
+ },
+ {
+ "id": "njn3h",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 2",
+ "descendants": {
+ "yb6zz": {
+ "content": "14 MIN"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "iYPQJ",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "vt30T",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "network",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "BMHNM",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Set GAMEPLANE_REMOTE_ALLOWED_CIDRS before registering clusters, or registration can reach any private address the panel host can reach.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "I8yGH",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "gtRy3",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Run with Docker Compose",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "nyBCG",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Two services, no Kubernetes on the host; the API stays on the Compose network.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "nJsri",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "k4OTHn",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "mqFko",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "XMUvf",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Set GAMEPLANE_REMOTE_ALLOWED_CIDRS to your API and gateway networks.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "AnFlw",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "ZfPYL",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "E2xb0",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Run exactly one gameplane-api container; never scale it.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "gNJrb",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "ZatCl",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Sr6oe",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Bootstrap the first admin against the same database volume.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "k4cwC",
+ "name": "Guide Section 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "Ww67A",
+ "name": "Section Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Keep the database and key apart",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "cSGrL",
+ "name": "Section Body 2",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Settings and credentials are encrypted with the panel key; recovery needs both halves.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "Q5ak2L",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "TyO4C",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "b83re",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Y8jRT7",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Back up the database and WAL files after stopping services.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "AWUc0",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "TE45d",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "kkCah",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Back up the panel key separately, with restricted access.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "yoxKU",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "npk5q",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "IfqcZ",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Provision the key outside database storage when you can.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "b05AFm",
+ "name": "Guide Section 3",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "tGAOW",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Register remote clusters",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "bGpxK",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Each target runs its own operator. The panel stores registrations in SQL, with no Cluster resource.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "uJQM4",
+ "name": "Quick Reference",
+ "width": "fill_container",
+ "fill": "$surface/tertiary",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 3,
+ "padding": 12,
+ "children": [
+ {
+ "type": "text",
+ "id": "mMtHe",
+ "name": "Quick Reference Label",
+ "fill": "$accent/accent",
+ "content": "STANDALONE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.6
+ },
+ {
+ "type": "text",
+ "id": "Io9zZ",
+ "name": "Quick Reference Line 1",
+ "fill": "$foreground/foreground",
+ "content": "01 Compose: set GAMEPLANE_REMOTE_ALLOWED_CIDRS, run one API",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "UciYF",
+ "name": "Quick Reference Line 2",
+ "fill": "$foreground/foreground",
+ "content": "02 Back up the database and panel key separately",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "nEigk",
+ "name": "Quick Reference Line 3",
+ "fill": "$foreground/foreground",
+ "content": "03 Register clusters with POST /clusters; grant per cluster",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "BTFOG",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "iOkFM",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "milestone",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "ErCN0",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Restore the database and key together; a new key cannot decrypt existing credentials.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "YzcIM",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "ARYpc",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Rotate kubeconfigs and upgrade",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "TnQGi",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Rotate with PUT, then verify the cluster before revoking the old credential.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "N5gdW",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "J7g3o",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "k4alwm",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "v2Iiy1",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Use PUT /clusters/NAME/kubeconfig; the registration keeps its identity.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "oavLx",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "L8QEXB",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "XBBqf",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Verify required operations before revoking the old credential.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "g4QIn5",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "OAbhd",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "UcLxA",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Stop services and back up before upgrading; match remote operator versions.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "ci0bP",
+ "name": "Article Next Link",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "padding": [
+ 10,
+ 0,
+ 0,
+ 0
+ ],
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "fNKDe",
+ "name": "Next Link Text",
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "Sf2Zb",
+ "name": "Next Link Eyebrow",
+ "fill": "$field/placeholder",
+ "content": "NEXT GUIDE",
+ "fontFamily": "Geist",
+ "fontSize": 10,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "VCpU7",
+ "name": "Next Link Title",
+ "fill": "$foreground/foreground",
+ "content": "High availability and failure domains",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 13,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "icon",
+ "id": "ZIT9o",
+ "name": "Next Link Icon",
+ "width": 15,
+ "height": 15,
+ "icon": "arrow-right",
+ "library": "lucide",
+ "fill": "$muted"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "liArD",
+ "name": "Docs Page Aside",
+ "width": 250,
+ "layout": "vertical",
+ "gap": 16,
+ "children": [
+ {
+ "type": "frame",
+ "id": "LP7LV",
+ "name": "Docs Table of Contents",
+ "width": "fill_container",
+ "fill": "$surface/secondary",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 10,
+ "padding": 16,
+ "children": [
+ {
+ "type": "text",
+ "id": "vsIoY",
+ "name": "TOC Label",
+ "fill": "$field/placeholder",
+ "content": "ON THIS PAGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "F7NXy",
+ "name": "TOC Row 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "WtPj5",
+ "name": "TOC Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "nnh6u",
+ "name": "TOC Text 0",
+ "fill": "$foreground/foreground",
+ "content": "Compose",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "T3c3S1",
+ "name": "TOC Row 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "RMquy",
+ "name": "TOC Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "L78YR",
+ "name": "TOC Text 1",
+ "fill": "$muted",
+ "content": "Keys",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "g0YMDY",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Pf5Or",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "o8UsN",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Register",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "Q9mj05",
+ "name": "TOC Row 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "Bts1U",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "s2Sh3v",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Credentials",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "rectangle",
+ "id": "pFRY1",
+ "name": "TOC Divider",
+ "fill": "$border/border",
+ "width": "fill_container",
+ "height": 1
+ },
+ {
+ "type": "text",
+ "id": "pzZra",
+ "name": "Coverage Label",
+ "fill": "$field/placeholder",
+ "content": "COVERS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
+ {
+ "type": "frame",
+ "id": "ROn2A",
+ "name": "Coverage Row 0",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "qHAol",
+ "name": "Coverage Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "Bs4Zv",
+ "name": "Coverage Text 0",
+ "fill": "$muted",
+ "content": "Compose",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "wdb5p",
+ "name": "Coverage Row 1",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "byxKO",
+ "name": "Coverage Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "GgrpR",
+ "name": "Coverage Text 1",
+ "fill": "$muted",
+ "content": "Registration",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "VTrJN",
+ "name": "Coverage Row 2",
+ "width": "fill_container",
+ "gap": 7,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "B4t6A",
+ "name": "Coverage Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
+ "library": "lucide",
+ "fill": "$field/placeholder"
+ },
+ {
+ "type": "text",
+ "id": "j2hwTD",
+ "name": "Coverage Text 2",
+ "fill": "$muted",
+ "content": "Keys",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "zIHX7",
+ "name": "Edit Page Card",
+ "width": "fill_container",
+ "fill": "$background/background",
+ "cornerRadius": "$radius/3xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 6,
+ "padding": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "uHDjX",
+ "name": "Edit Page Title",
+ "fill": "$foreground/foreground",
+ "content": "Improve this page",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 12,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "kobaP",
+ "name": "Edit Page Body",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Found a gap? Open a docs issue or suggest an edit on GitHub.",
+ "lineHeight": 1.4,
+ "fontFamily": "Geist",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "TdANt",
+ "name": "Edit Page Link",
+ "gap": 6,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "hPX3l",
+ "name": "Edit Page Link Text",
+ "fill": "$accent/soft-foreground",
+ "content": "Edit this page",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "500"
+ },
+ {
+ "type": "icon",
+ "id": "j7IG8a",
+ "name": "Edit Page Link Icon",
+ "width": 12,
+ "height": 12,
+ "icon": "external-link",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "H8zQ2X",
+ "x": 0,
+ "y": 112357,
+ "name": "Screen/Docs — Languages & Translations",
+ "theme": {
+ "semantic": "dark"
+ },
+ "clip": true,
+ "width": 1440,
+ "height": 900,
+ "fill": "$background/background",
+ "children": [
+ {
+ "id": "bKw0z",
+ "type": "ref",
+ "ref": "K2Rt4H",
+ "height": "fill_container",
+ "name": "DocsSidebar/Expanded",
+ "width": 280,
+ "descendants": {
+ "w7U9E": {
+ "fill": "$foreground/foreground"
+ },
+ "UNTiv": {
+ "fill": "$muted"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "eqeRz",
+ "name": "Docs Main",
+ "width": "fill_container",
+ "height": "fill_container",
+ "fill": "$background/background",
+ "layout": "vertical",
+ "children": [
+ {
+ "id": "rGlFW",
+ "type": "ref",
+ "ref": "SOdlr",
+ "name": "Docs Top Bar",
+ "width": "fill_container",
+ "descendants": {
+ "NImey": {
+ "content": "Platform"
+ },
+ "ikbi6": {
+ "content": "Languages & Translations"
+ }
+ }
+ },
+ {
+ "type": "frame",
+ "id": "iYmXB",
+ "name": "Docs Article Body",
+ "clip": true,
+ "width": "fill_container",
+ "height": "fill_container",
+ "gap": 32,
+ "padding": 32,
+ "children": [
+ {
+ "type": "frame",
+ "id": "rUnsZ",
+ "name": "Docs Article",
+ "width": 780,
+ "layout": "vertical",
+ "gap": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "zRDJo",
+ "name": "Article Eyebrow",
+ "fill": "$accent/accent",
+ "content": "ACCESS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11,
+ "fontWeight": "600",
+ "letterSpacing": 0.8
+ },
+ {
+ "type": "text",
+ "id": "a3RCgy",
+ "name": "Article Title",
+ "fill": "$foreground/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Languages & Translations",
+ "lineHeight": 1.1,
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 30,
+ "fontWeight": "700"
+ },
+ {
+ "type": "text",
+ "id": "vL5jn",
+ "name": "Article Lead",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pick a dashboard language, set the instance default, and translate Gameplane or module text.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 15,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "iXDMF",
+ "name": "Article Metadata",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "id": "St1wV",
+ "type": "ref",
+ "ref": "NZPtq",
+ "name": "Meta Chip 0",
+ "descendants": {
+ "NLG8t": {
+ "content": "ADMIN GUIDE"
+ }
+ }
+ },
+ {
+ "id": "AU6GT",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 1",
+ "descendants": {
+ "yb6zz": {
+ "content": "v0.4"
+ }
+ }
+ },
+ {
+ "id": "F2zc0E",
+ "type": "ref",
+ "ref": "EbSsA",
+ "name": "Meta Chip 2",
+ "descendants": {
+ "yb6zz": {
+ "content": "8 MIN"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "mfCzY",
+ "name": "Article Callout",
+ "width": "fill_container",
+ "fill": "$accent/soft",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "gap": 10,
+ "padding": [
+ 10,
+ 12
+ ],
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "QCGap",
+ "name": "Article Callout Icon",
+ "width": 16,
+ "height": 16,
+ "icon": "users-round",
+ "library": "lucide",
+ "fill": "$accent/soft-foreground"
+ },
+ {
+ "type": "text",
+ "id": "HTjNt",
+ "name": "Article Callout Text",
+ "fill": "$accent/soft-foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Only languages at 80% translated appear in the picker. Missing messages show in English.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "JDjJ3",
+ "name": "Guide Section 1",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "q5o7Z",
+ "name": "Section Title 1",
+ "fill": "$foreground/foreground",
+ "content": "Choose your language",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "B4KF6",
+ "name": "Section Body 1",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Pick the dashboard language on Theme & Appearance. Signed-in choices follow you across devices.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "IYwBK",
+ "name": "Section List 1",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "E7CIr",
+ "name": "Section 1 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "EH7NL",
+ "name": "Section 1 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "UVCtw",
+ "name": "Section 1 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Saved to your account when signed in; Automatic clears it.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "RDKZo",
+ "name": "Section 1 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "RC0nr",
+ "name": "Section 1 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "C9AxK",
+ "name": "Section 1 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Signed-out pages save the choice to that browser only.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "bvaY7",
+ "name": "Section 1 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "jJns6",
+ "name": "Section 1 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "ZbHJ4",
+ "name": "Section 1 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Dates, numbers and relative times follow the active language.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "gQgWS",
+ "name": "Guide Section 2",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "twApc",
+ "name": "Section Title 2",
+ "fill": "$foreground/foreground",
+ "content": "Admins set the defaults",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "z6awsN",
+ "name": "Section Body 2",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Set the instance default, then a language for each notification destination.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "oyjWo",
+ "name": "Section List 2",
+ "width": "fill_container",
+ "fill": "$surface/surface",
+ "cornerRadius": "$radius/2xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 5,
+ "padding": [
+ 8,
+ 10
+ ],
+ "children": [
+ {
+ "type": "frame",
+ "id": "jhZCE",
+ "name": "Section 2 Item 0",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "QLEQV",
+ "name": "Section 2 Item Icon 0",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "ZHmUO",
+ "name": "Section 2 Item Text 0",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Instance default: Language card in Admin Settings, starts as English.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "CVu1B",
+ "name": "Section 2 Item 1",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "M4Sal",
+ "name": "Section 2 Item Icon 1",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "Lrz5P",
+ "name": "Section 2 Item Text 1",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Notification language: Discord, email and webhook destinations.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "t93Mym",
+ "name": "Section 2 Item 2",
+ "width": "fill_container",
+ "gap": 8,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "icon",
+ "id": "eIOX4",
+ "name": "Section 2 Item Icon 2",
+ "width": 13,
+ "height": 13,
+ "icon": "check",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ },
+ {
+ "type": "text",
+ "id": "LA70U",
+ "name": "Section 2 Item Text 2",
+ "fill": "$default/foreground",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Telemetry: the extended usage report includes the UI language.",
+ "fontFamily": "Geist",
+ "fontSize": 12.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "DZ7n6",
+ "name": "Guide Section 3",
+ "width": "fill_container",
+ "layout": "vertical",
+ "gap": 6,
+ "children": [
+ {
+ "type": "text",
+ "id": "lW7l3",
+ "name": "Section Title 3",
+ "fill": "$foreground/foreground",
+ "content": "Translate and check packs",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 17,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "nKgOp",
+ "name": "Section Body 3",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Each language is a folder under i18n/locales with app.json and meta.json.",
+ "lineHeight": 1.45,
+ "fontFamily": "Geist",
+ "fontSize": 13,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "BZJoW",
+ "name": "Quick Reference",
+ "width": "fill_container",
+ "fill": "$surface/tertiary",
+ "cornerRadius": "$radius/xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 3,
+ "padding": 12,
+ "children": [
+ {
+ "type": "text",
+ "id": "oLLpC",
+ "name": "Quick Reference Label",
+ "fill": "$accent/accent",
+ "content": "LANGUAGES",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.6
+ },
+ {
+ "type": "text",
+ "id": "UOznm",
+ "name": "Quick Reference Line 1",
+ "fill": "$foreground/foreground",
+ "content": "01 Choice: account → browser → instance default → English",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "SQDhd",
+ "name": "Quick Reference Line 2",
+ "fill": "$foreground/foreground",
+ "content": "02 Listed in the picker at 80% translated",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "fO1Y2",
+ "name": "Quick Reference Line 3",
+ "fill": "$foreground/foreground",
+ "content": "03 Check packs with go run ./cmd/i18n-check locales",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "roWiP",
+ "name": "Article Next Link",
+ "width": "fill_container",
+ "stroke": "$border/border",
+ "strokeWidth": {
+ "top": 1
+ },
+ "strokeAlignment": "inner",
+ "strokeLinejoin": "round",
+ "padding": [
+ 10,
+ 0,
+ 0,
+ 0
+ ],
+ "justifyContent": "space_between",
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "frame",
+ "id": "hPw6R",
+ "name": "Next Link Text",
+ "layout": "vertical",
+ "gap": 2,
+ "children": [
+ {
+ "type": "text",
+ "id": "Ag63g",
+ "name": "Next Link Eyebrow",
+ "fill": "$field/placeholder",
+ "content": "NEXT GUIDE",
+ "fontFamily": "Geist",
+ "fontSize": 10,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "text",
+ "id": "KXxvn",
+ "name": "Next Link Title",
+ "fill": "$foreground/foreground",
+ "content": "Audit & Observability",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 13,
+ "fontWeight": "500"
+ }
+ ]
+ },
+ {
+ "type": "icon",
+ "id": "d9c1sW",
+ "name": "Next Link Icon",
+ "width": 15,
+ "height": 15,
+ "icon": "arrow-right",
+ "library": "lucide",
+ "fill": "$muted"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "frame",
+ "id": "V3WYf",
+ "name": "Docs Page Aside",
+ "width": 250,
"layout": "vertical",
- "gap": 6,
+ "gap": 16,
"children": [
- {
- "type": "text",
- "id": "mlrJf",
- "name": "Section Title 1",
- "fill": "$foreground/foreground",
- "content": "What the provider stores",
- "fontFamily": "JetBrains Mono",
- "fontSize": 17,
- "fontWeight": "600"
- },
- {
- "type": "text",
- "id": "d1jyC",
- "name": "Section Body 1",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Daily aggregates, activity records and a total-reports counter.",
- "lineHeight": 1.45,
- "fontFamily": "Geist",
- "fontSize": 13,
- "fontWeight": "normal"
- },
{
"type": "frame",
- "id": "uiOWJ",
- "name": "Section List 1",
+ "id": "Z7aolI",
+ "name": "Docs Table of Contents",
"width": "fill_container",
- "fill": "$surface/surface",
+ "fill": "$surface/secondary",
"cornerRadius": "$radius/2xl",
"stroke": "$border/border",
"strokeWidth": 1,
"strokeAlignment": "inner",
"layout": "vertical",
- "gap": 5,
- "padding": [
- 8,
- 10
- ],
+ "gap": 10,
+ "padding": 16,
"children": [
+ {
+ "type": "text",
+ "id": "nWF0J",
+ "name": "TOC Label",
+ "fill": "$field/placeholder",
+ "content": "ON THIS PAGE",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
{
"type": "frame",
- "id": "s2dHPF",
- "name": "Section 1 Item 0",
+ "id": "hOxj7",
+ "name": "TOC Row 0",
"width": "fill_container",
"gap": 8,
"alignItems": "center",
"children": [
{
"type": "icon",
- "id": "S4xx2",
- "name": "Section 1 Item Icon 0",
- "width": 13,
- "height": 13,
- "icon": "check",
+ "id": "CyTpc",
+ "name": "TOC Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
"library": "lucide",
"fill": "$accent/accent"
},
{
"type": "text",
- "id": "YLcxz",
- "name": "Section 1 Item Text 0",
- "fill": "$default/foreground",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Daily aggregates: counts by version, fleet-size band and category, never linked to an install ID.",
+ "id": "Y55Skm",
+ "name": "TOC Text 0",
+ "fill": "$foreground/foreground",
+ "content": "Choose",
"fontFamily": "Geist",
"fontSize": 12.5,
- "fontWeight": "normal"
+ "fontWeight": "500"
}
]
},
{
"type": "frame",
- "id": "P1eejb",
- "name": "Section 1 Item 1",
+ "id": "T3ld1",
+ "name": "TOC Row 1",
"width": "fill_container",
"gap": 8,
"alignItems": "center",
"children": [
{
"type": "icon",
- "id": "S7sTv6",
- "name": "Section 1 Item Icon 1",
- "width": 13,
- "height": 13,
- "icon": "check",
+ "id": "Z6wd0",
+ "name": "TOC Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
"library": "lucide",
- "fill": "$accent/accent"
+ "fill": "$field/placeholder"
},
{
"type": "text",
- "id": "lnrR1",
- "name": "Section 1 Item Text 1",
- "fill": "$default/foreground",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Activity records: keyed hash of the install ID, key fingerprint, first/last seen, last version.",
+ "id": "Pbgkd",
+ "name": "TOC Text 1",
+ "fill": "$muted",
+ "content": "Defaults",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
@@ -111530,330 +114827,218 @@
},
{
"type": "frame",
- "id": "cB3db",
- "name": "Section 1 Item 2",
+ "id": "RgQua",
+ "name": "TOC Row 2",
"width": "fill_container",
"gap": 8,
"alignItems": "center",
"children": [
{
"type": "icon",
- "id": "TSFRP",
- "name": "Section 1 Item Icon 2",
- "width": 13,
- "height": 13,
- "icon": "check",
+ "id": "T5odSB",
+ "name": "TOC Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "hash",
"library": "lucide",
- "fill": "$accent/accent"
+ "fill": "$field/placeholder"
},
{
"type": "text",
- "id": "rvvnu",
- "name": "Section 1 Item Text 2",
- "fill": "$default/foreground",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Total-reports counter: a single number.",
+ "id": "gp0MB",
+ "name": "TOC Text 2",
+ "fill": "$muted",
+ "content": "Translate",
"fontFamily": "Geist",
"fontSize": 12.5,
"fontWeight": "normal"
}
]
- }
- ]
- }
- ]
- },
- {
- "type": "frame",
- "id": "t0qQ5B",
- "name": "Guide Section 1",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 6,
- "children": [
- {
- "type": "text",
- "id": "NWxP8",
- "name": "Section Title 1",
- "fill": "$foreground/foreground",
- "content": "How long",
- "fontFamily": "JetBrains Mono",
- "fontSize": 17,
- "fontWeight": "600"
- },
- {
- "type": "text",
- "id": "G5KyWM",
- "name": "Section Body 1",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Aggregates 24 months; activity records 90 days after the last report; source addresses never written to disk.",
- "lineHeight": 1.45,
- "fontFamily": "Geist",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
- },
- {
- "type": "frame",
- "id": "pYTx1",
- "name": "Guide Section 1",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 6,
- "children": [
- {
- "type": "text",
- "id": "k3JsKp",
- "name": "Section Title 1",
- "fill": "$foreground/foreground",
- "content": "Abuse protection",
- "fontFamily": "JetBrains Mono",
- "fontSize": 17,
- "fontWeight": "600"
- },
- {
- "type": "text",
- "id": "O81l3",
- "name": "Section Body 1",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Strict validation (16 KiB cap), per-source daily limit, proof-of-work that costs nothing in normal traffic, and a private token-protected dashboard.",
- "lineHeight": 1.45,
- "fontFamily": "Geist",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
- },
- {
- "type": "frame",
- "id": "UoRma",
- "name": "Guide Section 1",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 6,
- "children": [
- {
- "type": "text",
- "id": "a6pUwo",
- "name": "Section Title 1",
- "fill": "$foreground/foreground",
- "content": "Public summary",
- "fontFamily": "JetBrains Mono",
- "fontSize": 17,
- "fontWeight": "600"
- },
- {
- "type": "text",
- "id": "sKDfN",
- "name": "Section Body 1",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "GET /v1/summary returns exactly five numbers; the detailed dashboard is private to the maintainers.",
- "lineHeight": 1.45,
- "fontFamily": "Geist",
- "fontSize": 13,
- "fontWeight": "normal"
- }
- ]
- },
- {
- "type": "frame",
- "id": "GVGJA",
- "name": "Guide Section 1",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 6,
- "children": [
- {
- "type": "text",
- "id": "vbCKO",
- "name": "Section Title 1",
- "fill": "$foreground/foreground",
- "content": "How to opt out",
- "fontFamily": "JetBrains Mono",
- "fontSize": 17,
- "fontWeight": "600"
- },
- {
- "type": "text",
- "id": "DTDuT",
- "name": "Section Body 1",
- "fill": "$muted",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Notice before the first report, then separate switches in Admin Settings > Telemetry.",
- "lineHeight": 1.45,
- "fontFamily": "Geist",
- "fontSize": 13,
- "fontWeight": "normal"
- },
- {
- "type": "frame",
- "id": "epdW6",
- "name": "Section List 1",
- "width": "fill_container",
- "fill": "$surface/surface",
- "cornerRadius": "$radius/2xl",
- "stroke": "$border/border",
- "strokeWidth": 1,
- "strokeAlignment": "inner",
- "layout": "vertical",
- "gap": 5,
- "padding": [
- 8,
- 10
- ],
- "children": [
+ },
+ {
+ "type": "rectangle",
+ "id": "oYOpW",
+ "name": "TOC Divider",
+ "fill": "$border/border",
+ "width": "fill_container",
+ "height": 1
+ },
+ {
+ "type": "text",
+ "id": "OAPLN",
+ "name": "Coverage Label",
+ "fill": "$field/placeholder",
+ "content": "COVERS",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 9,
+ "fontWeight": "600",
+ "letterSpacing": 0.7
+ },
{
"type": "frame",
- "id": "x80Spm",
- "name": "Section 1 Item 0",
+ "id": "gOyM1",
+ "name": "Coverage Row 0",
"width": "fill_container",
- "gap": 8,
+ "gap": 7,
"alignItems": "center",
"children": [
{
"type": "icon",
- "id": "OYJHO",
- "name": "Section 1 Item Icon 0",
- "width": 13,
- "height": 13,
- "icon": "check",
+ "id": "QSoNy",
+ "name": "Coverage Icon 0",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
"library": "lucide",
- "fill": "$accent/accent"
+ "fill": "$field/placeholder"
},
{
"type": "text",
- "id": "f4kxVu",
- "name": "Section 1 Item Text 0",
- "fill": "$default/foreground",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "At first login: separate basic and extended switches; basic off turns extended off.",
+ "id": "P5YpR",
+ "name": "Coverage Text 0",
+ "fill": "$muted",
+ "content": "Languages",
"fontFamily": "Geist",
- "fontSize": 12.5,
+ "fontSize": 12,
"fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "p9saIX",
- "name": "Section 1 Item 1",
+ "id": "mhIIt",
+ "name": "Coverage Row 1",
"width": "fill_container",
- "gap": 8,
+ "gap": 7,
"alignItems": "center",
"children": [
{
"type": "icon",
- "id": "tz1ws",
- "name": "Section 1 Item Icon 1",
- "width": 13,
- "height": 13,
- "icon": "check",
+ "id": "Alxec",
+ "name": "Coverage Icon 1",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
"library": "lucide",
- "fill": "$accent/accent"
+ "fill": "$field/placeholder"
},
{
"type": "text",
- "id": "XulJR",
- "name": "Section 1 Item Text 1",
- "fill": "$default/foreground",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "At install time: --set api.telemetry.enabled=false is a hard off with no notice.",
+ "id": "Q7UHa",
+ "name": "Coverage Text 1",
+ "fill": "$muted",
+ "content": "Translations",
"fontFamily": "Geist",
- "fontSize": 12.5,
+ "fontSize": 12,
"fontWeight": "normal"
}
]
},
{
"type": "frame",
- "id": "u1pPo",
- "name": "Section 1 Item 2",
+ "id": "wXbBj",
+ "name": "Coverage Row 2",
"width": "fill_container",
- "gap": 8,
+ "gap": 7,
"alignItems": "center",
"children": [
{
"type": "icon",
- "id": "hipxx",
- "name": "Section 1 Item Icon 2",
- "width": 13,
- "height": 13,
- "icon": "check",
+ "id": "L7lmf",
+ "name": "Coverage Icon 2",
+ "width": 12,
+ "height": 12,
+ "icon": "book-open",
"library": "lucide",
- "fill": "$accent/accent"
+ "fill": "$field/placeholder"
},
{
"type": "text",
- "id": "KSniZ",
- "name": "Section 1 Item Text 2",
- "fill": "$default/foreground",
- "textGrowth": "fixed-width",
- "width": "fill_container",
- "content": "Custom provider: api.telemetry.endpoint=https://your-host/ingest replaces the project's.",
+ "id": "dfJx1",
+ "name": "Coverage Text 2",
+ "fill": "$muted",
+ "content": "Locales",
"fontFamily": "Geist",
- "fontSize": 12.5,
+ "fontSize": 12,
"fontWeight": "normal"
}
]
}
]
- }
- ]
- },
- {
- "type": "frame",
- "id": "r5thm",
- "name": "Guide Section 1",
- "width": "fill_container",
- "layout": "vertical",
- "gap": 6,
- "children": [
- {
- "type": "text",
- "id": "hHeyP",
- "name": "Section Title 1",
- "fill": "$foreground/foreground",
- "content": "Questions and requests",
- "fontFamily": "JetBrains Mono",
- "fontSize": 17,
- "fontWeight": "600"
},
{
- "type": "text",
- "id": "u4JLM1",
- "name": "Section Body 1",
- "fill": "$muted",
- "textGrowth": "fixed-width",
+ "type": "frame",
+ "id": "OaS2L",
+ "name": "Edit Page Card",
"width": "fill_container",
- "content": "Open an issue on GitHub; the maintainers operate the provider.",
- "lineHeight": 1.45,
- "fontFamily": "Geist",
- "fontSize": 13,
- "fontWeight": "normal"
+ "fill": "$background/background",
+ "cornerRadius": "$radius/3xl",
+ "stroke": "$border/border",
+ "strokeWidth": 1,
+ "strokeAlignment": "inner",
+ "layout": "vertical",
+ "gap": 6,
+ "padding": 14,
+ "children": [
+ {
+ "type": "text",
+ "id": "nI25o",
+ "name": "Edit Page Title",
+ "fill": "$foreground/foreground",
+ "content": "Improve this page",
+ "fontFamily": "JetBrains Mono",
+ "fontSize": 12,
+ "fontWeight": "600"
+ },
+ {
+ "type": "text",
+ "id": "HC2An",
+ "name": "Edit Page Body",
+ "fill": "$muted",
+ "textGrowth": "fixed-width",
+ "width": "fill_container",
+ "content": "Found a gap? Open a docs issue or suggest an edit on GitHub.",
+ "lineHeight": 1.4,
+ "fontFamily": "Geist",
+ "fontSize": 11.5,
+ "fontWeight": "normal"
+ },
+ {
+ "type": "frame",
+ "id": "Eklxu",
+ "name": "Edit Page Link",
+ "gap": 6,
+ "alignItems": "center",
+ "children": [
+ {
+ "type": "text",
+ "id": "AcCo4",
+ "name": "Edit Page Link Text",
+ "fill": "$accent/soft-foreground",
+ "content": "Edit this page",
+ "fontFamily": "Geist",
+ "fontSize": 12,
+ "fontWeight": "500"
+ },
+ {
+ "type": "icon",
+ "id": "Uio0s",
+ "name": "Edit Page Link Icon",
+ "width": 12,
+ "height": 12,
+ "icon": "external-link",
+ "library": "lucide",
+ "fill": "$accent/accent"
+ }
+ ]
+ }
+ ]
}
]
}
]
}
]
- },
- {
- "id": "CZkko",
- "type": "ref",
- "ref": "gnZrl",
- "name": "Footer",
- "width": "fill_container"
}
]
}