id: 91e017ecd5e04559826d9d5d8867a5fb
parent_id: 904c334bab54476d9f182d84967dc5a1
item_type: 1
item_id: bbc49a3bbada4fcdb8fedc66abf5014e
item_updated_time: 1785664056993
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"v.\\\n\\\n\"],[-1,\"**Why match the staging OS to prod?** Production is Debian on Hetzner. Running staging on a bhyve **Debian** guest catches kernel/glibc/runtime surprises before they hit prod.\\\n\\\n\"],[0,\"---\\\n\"]],\"start1\":2434,\"start2\":2434,\"length1\":185,\"length2\":8},{\"diffs\":[[0,\"s**.\"],[-1,\" The same software Codeberg.org runs.\"],[0,\" |\\\n|\"]],\"start1\":3044,\"start2\":3044,\"length1\":45,\"length2\":8},{\"diffs\":[[0,\"ancy\"],[-1,\" within the same box\"],[0,\". |\\\n\"]],\"start1\":3204,\"start2\":3204,\"length1\":28,\"length2\":8},{\"diffs\":[[0,\"one.\"],[-1,\" Ideal for publishing open-source projects while keeping work/closed-source repos private.\\\n\\\nWithout Forgejo you'd use bare `git init --bare` repos — functional but no web UI, no issue tracker, no PR workflow.\"],[0,\"\\\n\\\n##\"]],\"start1\":4548,\"start2\":4548,\"length1\":216,\"length2\":8},{\"diffs\":[[0,\"**. \"],[-1,\"In Skara Brae specifically:\\\n- **Session cache** — temporary game state, rate-limiting counters\\\n- **L\"],[1,\"Session cache, l\"],[0,\"eade\"]],\"start1\":4844,\"start2\":4844,\"length1\":108,\"length2\":24},{\"diffs\":[[0,\"erboards\"],[-1,\"** —\"],[0,\" \"],[1,\"(\"],[0,\"sorted s\"]],\"start1\":4867,\"start2\":4867,\"length1\":21,\"length2\":18},{\"diffs\":[[0,\"sets\"],[-1,\" for fast ranking queries\\\n- **WebSocket pub/sub** — broadcast game events (combat results, chat) to connected clients\\\n\\\n**Can be d\"],[1,\"), WebSocket pub/sub. **D\"],[0,\"eferr\"],[1,\"abl\"],[0,\"e\"],[-1,\"d\"],[0,\" for MVP\"],[-1,\".\"],[0,\"** \"],[-1,\"At low player counts,\"],[1,\"—\"],[0,\" the\"]],\"start1\":4884,\"start2\":4884,\"length1\":177,\"length2\":54},{\"diffs\":[[0,\"mory\"],[-1,\". Add Redis when you need multi-process scaling or want persistence across restar\"],[1,\" at low player coun\"],[0,\"ts. \"]],\"start1\":4991,\"start2\":4991,\"length1\":89,\"length2\":27},{\"diffs\":[[0,\"les all \"],[-1,\"*\"],[0,\"persiste\"]],\"start1\":5033,\"start2\":5033,\"length1\":17,\"length2\":16},{\"diffs\":[[0,\"rsistent\"],[-1,\"*\"],[0,\" data re\"]],\"start1\":5043,\"start2\":5043,\"length1\":17,\"length2\":16},{\"diffs\":[[0,\"se. \"],[-1,\"Stores a\"],[1,\"A\"],[0,\"ll p\"]],\"start1\":5102,\"start2\":5102,\"length1\":16,\"length2\":9},{\"diffs\":[[0,\"tate\"],[-1,\": users, characters, items, guilds, adventures, skills, crafting, etc\"],[0,\". Ru\"]],\"start1\":5127,\"start2\":5127,\"length1\":77,\"length2\":8},{\"diffs\":[[0,\"## C\"],[-1,\"urrent state (verified 2026-08-02)\\\n```\\\n~/RustroverProjects/    keyfob-station, rusty-marvin, rusty-telemetry, rusty_emu, super_marvin, top_drives\\\n~/WebstormProjects/     joplin-plugin-mcp, racecraft, super-marvin-userscripts   (note: lowercase 'storm')\\\n~/IdeaProjects/         ac-telemetry-plugin\\\n~/Development/poker/    old_bot, references          (legacy, pre-dates the IDE dirs)\\\n```\\\n\\\n### Recommended convention: one canonical workspace root\\\n```\\\n~/dev/     \"],[1,\"onvention: `~/Development/<project>/<repo>/`\\\n```\\\n~/Development/\"],[0,\"    \"]],\"start1\":5486,\"start2\":5486,\"length1\":468,\"length2\":71},{\"diffs\":[[0,\"root\"],[-1,\" (NEW)\"],[0,\"\\\n├──\"]],\"start1\":5595,\"start2\":5595,\"length1\":14,\"length2\":8},{\"diffs\":[[0,\"ra-brae/\"],[1,\"  \"],[0,\"        \"]],\"start1\":5607,\"start2\":5607,\"length1\":16,\"length2\":18},{\"diffs\":[[0,\"-server/        \"],[1,\"  \"],[0,\"# open in RustRo\"]],\"start1\":5714,\"start2\":5714,\"length1\":32,\"length2\":34},{\"diffs\":[[0,\"brae-client/\"],[1,\"  \"],[0,\"        # op\"]],\"start1\":5766,\"start2\":5766,\"length1\":24,\"length2\":26},{\"diffs\":[[0,\"        \"],[1,\"  \"],[0,\"# shared\"]],\"start1\":5833,\"start2\":5833,\"length1\":16,\"length2\":18},{\"diffs\":[[0,\"├── \"],[-1,\"super-marvin/\\\n├\"],[1,\"poker/                        # (existing)\\\n│   ├── old_bot/\\\n│   └── references/\\\n├── super-marvin/                 # single-repo projects are fine too\\\n└\"],[0,\"── r\"]],\"start1\":5876,\"start2\":5876,\"length1\":23,\"length2\":159},{\"diffs\":[[0,\"ft/\\\n\"],[-1,\"└── ...\\\n\"],[0,\"```\\\n\"]],\"start1\":6041,\"start2\":6041,\"length1\":16,\"length2\":8},{\"diffs\":[[0,\"`\\\n\\\n**Why `~/\"],[-1,\"d\"],[1,\"D\"],[0,\"ev\"],[1,\"elopment\"],[0,\"/<project>/<\"]],\"start1\":6047,\"start2\":6047,\"length1\":27,\"length2\":35},{\"diffs\":[[0,\"deps\"],[-1,\" (e.g. `sb-common = { path = \\\"../skara-brae-common/rust\\\" }`)\"],[0,\". Pe\"]],\"start1\":6152,\"start2\":6152,\"length1\":68,\"length2\":8},{\"diffs\":[[0,\"lder\"],[-1,\" — the per-IDE default is just a suggestion.\\\n\\\n### Symlinks (optional\"],[1,\". The `~/Development/` root was chosen over `~/dev/` because it already holds `poker/` and matches the Jenkins note path convention.\\\n\\\n### Current legacy state (being migrated)\\\n```\\\n~/RustroverProjects/    keyfob-station, rusty-marvin, rusty-telemetry, rusty_emu, super_marvin, top_drives\\\n~/WebstormProjects/     joplin-plugin-mcp, racecraft, super-marvin-userscripts\\\n~/IdeaProjects/         ac-telemetry-plugin\\\n```\\\n\\\n### Symlinks (for IDE discoverability\"],[0,\")\\\n``\"]],\"start1\":6245,\"start2\":6245,\"length1\":76,\"length2\":460},{\"diffs\":[[0,\"r.git ~/\"],[-1,\"d\"],[1,\"D\"],[0,\"ev\"],[1,\"elopment\"],[0,\"/skara-b\"]],\"start1\":6760,\"start2\":6760,\"length1\":19,\"length2\":27},{\"diffs\":[[0,\"ln -s ~/\"],[-1,\"d\"],[1,\"D\"],[0,\"ev\"],[1,\"elopment\"],[0,\"/skara-b\"]],\"start1\":6809,\"start2\":6809,\"length1\":19,\"length2\":27},{\"diffs\":[[0,\"h** (`~/\"],[-1,\"d\"],[1,\"D\"],[0,\"ev\"],[1,\"elopment\"],[0,\"/...`) i\"]],\"start1\":6919,\"start2\":6919,\"length1\":19,\"length2\":27},{\"diffs\":[[0,\"ts\\\" \"],[-1,\"discoverability only.\\\n\\\n### Decision to confirm\\\n- [ ] Adopt `~/dev/<project>/<repo>/` as the canonical root? (vs. `~/Development/...` which already holds `poker/`)\\\n- [ ] Migrate legacy repos into the new layout, or leave in place + symlink as touched?\"],[1,\"only.\"],[0,\"\\\n\\\n--\"]],\"start1\":7013,\"start2\":7013,\"length1\":258,\"length2\":13},{\"diffs\":[[0,\"VM**\"],[-1,\" (mirrors prod)\"],[0,\" run\"]],\"start1\":7507,\"start2\":7507,\"length1\":23,\"length2\":8},{\"diffs\":[[0,\"t:**\"],[-1,\" Hetzner is \\\"decent, not a powerhouse\\\" and now also runs Forgejo (+ planned Codeberg mirror). A Rust binary + Forgejo is light, but\"],[0,\" wat\"]],\"start1\":7945,\"start2\":7945,\"length1\":139,\"length2\":8},{\"diffs\":[[0,\" Forgejo on \"],[-1,\"the \"],[0,\"**Hetzner** \"]],\"start1\":8328,\"start2\":8328,\"length1\":28,\"length2\":24},{\"diffs\":[[0,\"er**\"],[-1,\" Debian box (public-facing)\"],[0,\".\\\n- \"]],\"start1\":8347,\"start2\":8347,\"length1\":35,\"length2\":8},{\"diffs\":[[0,\"ts (\"],[-1,\"e.g. \"],[0,\"open\"]],\"start1\":8389,\"start2\":8389,\"length1\":13,\"length2\":8},{\"diffs\":[[0,\"nt).\"],[-1,\" Visible to anyone, cloneable over HTTPS.\"],[0,\"\\\n- *\"]],\"start1\":8421,\"start2\":8421,\"length1\":49,\"length2\":8},{\"diffs\":[[0,\"als.\"],[-1,\" Require SSH key or password authentication.\"],[0,\"\\\n- *\"]],\"start1\":8501,\"start2\":8501,\"length1\":52,\"length2\":8},{\"diffs\":[[0,\"d): \"],[-1,\"second Codeberg/Forgejo instance\"],[1,\"repo redundancy\"],[0,\" on \"]],\"start1\":8535,\"start2\":8535,\"length1\":40,\"length2\":23},{\"diffs\":[[0,\"ame \"],[-1,\"Hetzner box for repo redundancy. Not yet standing\"],[1,\"box\"],[0,\".\\\n- \"]],\"start1\":8563,\"start2\":8563,\"length1\":57,\"length2\":11},{\"diffs\":[[0,\"cts \"],[-1,\"to Forgejo \"],[0,\"via \"]],\"start1\":8611,\"start2\":8611,\"length1\":19,\"length2\":8},{\"diffs\":[[0,\"hook\"],[-1,\" over the internet\"],[0,\".\\\n- \"]],\"start1\":8635,\"start2\":8635,\"length1\":26,\"length2\":8},{\"diffs\":[[0,\"note\"],[-1,\" (bare git repos on the server)\"],[0,\" is \"]],\"start1\":8719,\"start2\":8719,\"length1\":39,\"length2\":8},{\"diffs\":[[0,\"tly \"],[-1,\"`forgejo \"],[0,\"dump\"],[-1,\"`\"],[0,\" → H\"]],\"start1\":9144,\"start2\":9144,\"length1\":22,\"length2\":12},{\"diffs\":[[0,\"push\"],[-1,\" — basement is LAN-only\"],[0,\").\\\n \"]],\"start1\":9210,\"start2\":9210,\"length1\":31,\"length2\":8},{\"diffs\":[[0,\"site\"],[-1,\" (Hetzner Storage Box or pull from basement)\"],[0,\".\\\n  \"]],\"start1\":9311,\"start2\":9311,\"length1\":52,\"length2\":8},{\"diffs\":[[0,\"erit\"],[-1,\" the same model\"],[0,\": co\"]],\"start1\":9720,\"start2\":9720,\"length1\":23,\"length2\":8},{\"diffs\":[[0,\"t)\\\n\\\n\"],[-1,\"- [ ] Canonical root: `~/dev/` (recommended) vs. `~/Development/`.\\\n\"],[0,\"- [ \"]],\"start1\":9831,\"start2\":9831,\"length1\":75,\"length2\":8},{\"diffs\":[[0,\"er repos\"],[1,\" into `~/Development/`\"],[0,\" now, or\"]],\"start1\":9864,\"start2\":9864,\"length1\":16,\"length2\":38}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-08-02T09:49:55.923Z
created_time: 2026-08-02T09:49:55.923Z
is_locked: 0
type_: 13