2026-04-13
Signal: dungeon.club is carrying more weight than expected
Carrie reacted to the landing page boot sequence today — specifically the directory path (location: /jersey-city/dungeon-books). She compared it to Mastodon federation. That framing crystallizes something I couldn’t articulate before: city = dungeon, shop = club. The domain isn’t a pun; it’s the data model surfaced in the URL. Member handles fall out of it naturally — jc.dungeonbooks reads like a fediverse address and signals the cooperative network without explaining it.
The moment a second shop joins, sf.dungeonbooks or nyc.othershop tells the story. Quest hub vision gets a visible address layer from day one. Short codes over full city names (jc not jersey-city) — ambiguous to outsiders, specific to the culture, which is the point.
Saved the framing to project memory; it should drive URL structure, handle design, and partner onboarding.
Shipped
PR #100 — dungeon.club terminal landing and auth pages (merged 17:41 UTC)
A coherent first pass at the brand surface. Seven commits:
- Sacred component port — ActionButton, ActionListItem, Badge, BarProgress, BlockLoader, Button, Card. All scoped under
.sacred-root; doesn’t leak into Tailwind. Share Tech Mono vianext/font. Default accent swapped to warm amber (oklch(0.8 0.18 70)); tier classes still override. - Terminal boot landing (
/) — types out a connection handshake and resolves to a singleLOGINaction plus “no account? apply at the shop.” Boot plays every visit. Login button usesnext/linkso back-nav unmounts/remounts the page cleanly. - Terminal treatment across
/login,/signup,/forgot-password,/reset-password,/verify-email— all composed from a sharedTerminalShell+terminal.module.cssunder(frontend)/_terminal/. Card titles are uppercase verbs (AUTHENTICATE, ENROLL, RECOVER, RESET). Filenames in the prompt follow the.exe-for-actions /.status-for-states convention from the aesthetic doc. - Button polish — unified SacredActionButton hover so the whole button flips to amber (hotkey block was filling, content was only gaining a 2px border — read as imbalanced). Dropped the 200ms transition on SacredButton to match the Discord button’s instant feel; terminals don’t animate.
- BlockLoader port — replaced a custom CSS dots-loader that animated the
contentproperty (non-standard, inconsistent across browsers) with sacred’sBlockLoadercycling▁▂▃▄▅▆▇█viasetInterval.
Docs
docs/references/bbs-ansi-inspiration.md— BBS/ANSI references, 16colo.rs packs, ACiD context, patterns worth stealing (hotkeys, decorative framing, validation-message onboarding)docs/plans/bbs-menu-design.md— post-login menu design exploration (bulletins, presence, tavern, archives, cartography) with a hotkey table- Memory: dungeon.club URL concept (city=dungeon, shop=club, Mastodon-style handles)
Housekeeping
CLAUDE.mdupdated to reflect 14 collections and current feature listgtskill (~/.claude/skills/gt) gained a “submit a git-created branch” recipe and a pitfall for trunk-out-of-sync on submit — both bit us today before we got the PR open
Thinking out loud
The soft-nav bug was the hidden trap in sacred’s <a href>
Sacred’s SacredActionButton renders a plain <a> for href. In App Router that’s a full browser navigation — bfcache restores the page whole on back, React state preserved, useEffect never re-fires. Symptom: boot animation never replayed after visiting /login and hitting back. Spent too long on pageshow + sessionStorage + forced reload gymnastics before the real fix landed: swap to next/link for internal hrefs. App Router unmounts/remounts cleanly; no bfcache in the loop.
Worth remembering for future sacred components. Anything that navigates inside the app should route through next/link. External URLs can stay <a>.
The validation-message pattern maps perfectly onto in-person onboarding
Classic BBSes required new users to write a short message to the sysop explaining how they found the system before access was granted. Our invite + in-person requirement is the same shape: the shop visit is the validation message, paid in time and attention instead of words. The Discord gate (only members who’ve visited can join) is already doing this — we just don’t call it that yet.
Possible extension: a “how you heard about us” text field at signup, not required for access (they already have an invite), but captured for culture and analytics. Reinforces vouched entry. Deferred.
Copilot review: useful once triaged
12 comments on PR #100. Triage:
- 5 false positives — “add React type imports” on files using
React.HTMLAttributes.tsconfigsetsjsx: "react-jsx", which resolves the namespace automatically.tsc --noEmitis clean. - 4 unused-code speculation —
SacredActionListItem/SacredBarProgresswarts on components with zero consumers. Deferred until first use. - 3 real issues, all fixed in same branch: custom dots loader (→ BlockLoader), stale e2e assertions, stale PR description.
Replied to all 12 so the record is clear. Treat Copilot like a noisy linter — the false-positive rate means you have to triage, but the real catches are worth keeping the review on.
Menu design coming into focus
The current dashboard nav (Character / Activity / Quests / Rewards / Guild) is already BBS-shaped. What it lacks is place — something that changes when you log in. Bulletins + live presence are the highest-value lowest-effort additions: both reuse data we already collect, both flip the dashboard from “tool” to “place.” Archives (ebook shelf), Cartography (partner network map), Sysop message, Tavern (framed Discord) are the downstream additions. All captured in the design doc.
Hotkey table committed on paper. SacredActionButton already supports hotkey; worth wiring them up properly so the portal is keyboard-navigable from day one. C for character, J for journal, Q for quests, etc. Matches BBS mental model, rewards muscle memory.
Open
- PR #100 — merged 2026-04-13 17:41 UTC, CI green
- Next session pick: (a) character sheet redesign onto sacred primitives, or (b) bulletins + presence on the dashboard menu
- #93 — PII minimization in Members collection
- #94 — Pi overnight reliability
- #97 — pinned “next event” card above rotating list
- #98 — render QR code from URL client-side
- #99 — wire Guild Activity feed to real check-ins and member events
- Mount the OP6 lite kiosk in the shop and observe live customer use
First external invites + a Firefox/Linux signup bug
Dropped three invite codes into Discord around 13:48 as the first external test of dungeon.club signup:
3PSA8ECWFNB63585SSF97ZKV
Pitch was one line: “dungeon.club — a place you log into.”
Bug found almost immediately
Detour [HQ] on Firefox/Linux (14:06): email input was completely unresponsive to keyboard input. Workaround was browser autocomplete — they “claimed 1st key.” This is exactly the kind of bug that only surfaces on the long tail of browser/OS combos; I only test Chrome on Mac/Windows in dev. Shipped a CSS fix by 19:41, detour confirmed fixed at 21:07.
Same-day find-and-fix loop. Worth keeping the feedback channel this tight if we can.
Positive signal
Garrett (14:07): “This is a cool site. Plus I’m in the top 10 of the Leaderboard.” Two things in one line — the landing page reads as polished to an outsider, and the leaderboard surface is immediately engaging enough that someone new looked at it, scored themselves, and reported position. Leaderboard as onboarding hook was not an intentional design decision, but it’s working.
Nathaniel [TAV] chimed in on the Linux angle — suggests the invite pool skews technical. Useful for a first wave; they’ll find more of the weird bugs. Less useful as a signal for what non-technical members will experience.
Things to track
- 3 invites out, 0 known signups completed (need to check)
- 1 bug found, 1 bug fixed same-day
- Open question: what was the CSS bug specifically? Note it in a reference or in
known-issues.mdso the next person (or future me) doesn’t re-introduce it. Chrome/Mac blind spot is now documented as a real risk. - The [HQ] and [TAV] tags suggest testers have external guild/clan affiliations — worth asking what those are if they’re meaningful communities for future recruitment.
Open (continued)
- Follow up with the three invitees: did they complete signup? any other issues?
- Document the email-input CSS bug in a known-issues reference so it’s not lost in git history
- Add Firefox/Linux to the manual QA checklist before next external invite wave
- Ask detour and Nathaniel what [HQ] and [TAV] are — may be recruitment channels