## Getting started
@@ -118,4 +125,4 @@ https://cinny.in
Cinny is licensed under the GNU Affero General Public License,
Version 3 of the License (AGPL-3.0-only).
-You may obtain a copy of the License at https://www.gnu.org/licenses/agpl-3.0.html
+You may obtain a copy of the License at https://www.gnu.org/licenses/agpl-3.0.html
\ No newline at end of file
diff --git a/build.config.ts b/build.config.ts
index ec8a41d0..ac51db97 100644
--- a/build.config.ts
+++ b/build.config.ts
@@ -1,3 +1,3 @@
export default {
- base: '/',
+ base: process.env.CINNY_BASE ?? '/',
};
diff --git a/config.json b/config.json
index a61bb966..e945d1c4 100644
--- a/config.json
+++ b/config.json
@@ -5,17 +5,7 @@
"featuredCommunities": {
"openAsDefault": false,
- "spaces": [
- "#cinny:matrix.org",
- "#community:matrix.org",
- "#space:unredacted.org",
- "#librewolf-community:matrix.org",
- "#stickers-and-emojis:tastytea.de",
- "#videogames:waywardinn.com",
- "#science-space:matrix.org",
- "#libregaming-games:tchncs.de",
- "#mathematics-on:matrix.org"
- ],
+ "spaces": ["#gamecult:gamecult.org"],
"rooms": [
"#tuwunel:grin.hu",
"#freesoftware:matrix.org",
diff --git a/docs/gamecult/ratatoskr-target.md b/docs/gamecult/ratatoskr-target.md
new file mode 100644
index 00000000..166c5c72
--- /dev/null
+++ b/docs/gamecult/ratatoskr-target.md
@@ -0,0 +1,352 @@
+# Ratatoskr: target and prose map
+
+Ratatoskr is GameCult's Matrix chat client: this fork of Cinny, forge
+`GameCult/cinny` (to be renamed `GameCult/Ratatoskr`; see the cut sequence).
+Void stewards it. Campaign `ratatoskr` lives in the eureka mind for now, beside
+the rulings it rests on. Under `eureka-body:ruling:ruling-home-steward-mind` it
+is handed to Void's mind once, by procedure, as soon as that hand-off procedure
+exists (`hand_off` is parked); after that every new ruling on it is admitted in
+Void's mind. Nothing here is written into Void's mind before then.
+
+The mind holds the questions, rulings, specs, reports and verdicts. This file
+holds what no document kind carries: the design truths, body facts, the model
+page, rationale, the reconstructed collaboration plan, and the cut sequence.
+All times are UTC.
+
+## Why
+
+GameCult is the only server this client talks to. A general Matrix client
+treats it as one community among thousands, so the operator meets GameCult's
+structure three clicks deep in an invite list of 50+ rooms (operator, `#swarm`
+10-31 05:14: "The biggest pain is navigation. GameCult has a structure."). The
+client should open on GameCult's estate as data: its spaces, its project rooms
+grouped by steward, its Minds, and the person's own place in it. It should
+also be a pleasant place to be in its own right: emotes, sound, and weather in
+the background.
+
+## Design truths (from rulings in force)
+
+- **We own the interface, not the engine.** The fork keeps Cinny's engine
+ (matrix-js-sdk, Rust crypto, sync) and replaces the whole UI; every
+ user-facing string and its translation is ours, and upstream locale files
+ are not the source (`gamecult-chat:ruling:we-own-the-ui-and-translation`).
+- **Mobile first.** On phones, inactive elements hide, vertical space is
+ cheaper than horizontal, and text never gets squeezed into narrow columns
+ (`eureka-body:ruling:chat-client-base-cinny-mobile-first`).
+- **The first spec** (`eureka-body:ruling:chat-client-first-spec`): an emote
+ slot on every bubble (a pose id carried on the event); room and participant
+ lists tiered (category, then items) and reached from the header menu, not
+ side columns; participants grouped by estate (Minds, Members, Users,
+ Patrons); rooms grouped by kind (general, estates, projects, work rooms);
+ Minds indexed by stewardship, read from Matrix state projected from the
+ stewardship records in the Minds' own minds (the minds stay the truth); one
+ room per project, a Space child, with the steward joined.
+- **Rooms are visible without a join dance.** No invite screen in the way; a
+ room the server lets you join shows in the same list as joined ones; opening
+ one shows its name and a one-tap Join; joining happens on that tap or a first
+ post, never silently; no peeking (operator, `#swarm` 10-31 04:08, 04:12
+ "Peeking sounds like YAGNI to me", 04:14 "One tap is a reasonable cost").
+ Rooms you may not enter are refused by the server, not hidden by the client
+ (Heimdall 04:10, accepted by Void 04:11 and 04:15).
+- **Language.** A user's language is the BCP 47 tag in profile field
+ `org.gamecult.language`, owned by the user through the client's language
+ picker (`gamecult-chat:ruling:user-language-profile-field`). The client ships
+ localized; people talk with stewards in their own language; rooms are made
+ for a language, with no per-language mirrors
+ (`gamecult-chat:ruling:multilingual-client-stewards-language-rooms`). One
+ host Mind sits in a language room, Weksa for `#pt-br`
+ (`gamecult-chat:ruling:language-room-one-host-weksa`). The first person this
+ must work for is a non-English, non-technical patron (placeholder
+ `patron-pt1`) whose account we set up and walk through login
+ (`gamecult-chat:ruling:patron-in-his-own-language`).
+- **Push.** `gamecult-chat:ruling:chat-push` rules out native mobile push for
+ now; Web Push to the installed web app is a different thing and is open
+ (question `ratatoskr:question:pwa-web-push`).
+- **Collaboration is recorded, not chatted.** Work spanning Minds belongs in
+ Atlas (`eureka-body:ruling:atlas-records-collaborative-work`). Atlas is not
+ deployed, so the plan below is its interim home; Atlas imports it later.
+
+## Body facts
+
+Probes run by Imagination on 2026-10-31, session `self-2026-10-29-eureka`.
+
+1. **Branch.** `void/gamecult-theme-and-project-nav` is `b8e696c8` over main
+ `1e6412ed` (v4.12.8), 2 commits, 14 files, +1153/-32 (686 of it lockfile):
+ a GameCult theme as default, member drawer hidden by default, bubble
+ layout, and steward grouping in `src/app/pages/client/space/Space.tsx`
+ (`useStewardGroups` at 429-437, group headers at 505-524) over
+ `useSpaceJoinedHierarchy` (409). Read by `git diff`.
+2. **Live estate shape** (Synapse on Yggdrasil, read as `admin` over the
+ client API, counts only). Root Space `#gamecult:gamecult.org`, room version
+ 12, has 9 children: 8 rooms and the `Projects` sub-Space. `Projects` has 52
+ children; 50 readable rooms, all room version 12. Server `/hierarchy` from
+ the root returns 59 rooms, 2 of them spaces. **Every room's join rule is
+ `invite`**; none is world-readable. 50 rooms carry `org.gamecult.steward`
+ with content `{mind, repo, source, steward: