Skip to content

Commit 9e808ea

Browse files
committed
docs: Added dashboard screenshots and closed out Phase 6
1 parent 76453d4 commit 9e808ea

10 files changed

Lines changed: 61 additions & 7 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ numbers, which drift):
6969
| `src/lib` helpers | 67 |
7070
| Schemas/repositories | 13 / 13 |
7171
| Scheduled jobs | 4 |
72-
| Tests | 2,985 across 192 suites |
72+
| Tests | 3,234 across 205 suites |
7373

7474
**There is no music system.** It was removed deliberately — see
7575
[§21](#21-decisions-already-made--do-not-relitigate). Do not add one back without reading that section.

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ The whole thing was rebuilt around the problems the old codebase actually had.
8585
| **Start-up** | Command registration raced the login | Each step awaited in order; a malformed file names itself and stops the boot |
8686
| **Errors** | Stack traces could reach chat | One error boundary — users get a plain apology, you get the full context |
8787
| **Money** | Read-modify-save, so balances could duplicate under load | Atomic database updates |
88-
| **Tests** | A handful | **2,985 tests**, with an enforced 80% coverage floor |
88+
| **Tests** | A handful | **3,234 tests**, with an enforced 80% coverage floor |
8989
| **Setup** | Manual, including patching a file inside `node_modules` | `npm run setup`, and you are running |
9090

9191
Everything the old bot did is still here, apart from the integrations that needed paid or personal API keys
@@ -365,6 +365,17 @@ It follows your device's light or dark setting out of the box, and speaks **Engl
365365
French** — picked from the browser's own language, and changeable from the Appearance screen. Both are per
366366
browser: nothing you choose there affects anybody else on the server.
367367

368+
<p align="center">
369+
<img alt="The server overview: member counts, a permission warning, and which features are on" src="docs/dashboard/screenshots/overview.png">
370+
</p>
371+
372+
| | |
373+
| ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
374+
| <img alt="Levelling settings in the light theme" src="docs/dashboard/screenshots/levelling.png"> | <img alt="Server settings, each card a description beside its controls" src="docs/dashboard/screenshots/settings.png"> |
375+
| **Levelling**, in the light theme | **Server settings** — the switches with no screen of their own |
376+
| <img alt="The owner console's usage tab" src="docs/dashboard/screenshots/owner-console.png"> | <img alt="The appearance screen: theme, accent, motion and language" src="docs/dashboard/screenshots/appearance.png"> |
377+
| **Owner console** — usage counted, never logged | **Appearance** — theme, accent, motion and language |
378+
368379
### Turning it on
369380

370381
Four settings. `npm run setup` handles all of them: it asks for the client secret and the base URL, sets

docs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ The web dashboard is a workspace of its own (`dashboard/`), with an API inside t
3838
| [`dashboard/guide.md`](dashboard/guide.md) | The practical guide: layout, components, the six edits a screen takes, the traps |
3939
| [`dashboard/re-write.md`](dashboard/re-write.md) | The UI rewrite plan — phases, invariants, exit criteria |
4040
| [`dashboard/design-plan/`](dashboard/design-plan/00-INDEX.md) | The original design documents: scope, auth, permissions, API, accessibility, roadmap |
41+
| [`dashboard/screenshots/`](dashboard/screenshots/README.md) | The images the root README embeds, and how to retake one when a screen changes |
4142

4243
`CLAUDE.md` §24 wins wherever it and `dashboard/guide.md` disagree.
4344

docs/dashboard/design-plan/13-ROADMAP-AND-RISKS.md

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ rather than a transport, which is a dozen lines. Three things it settled:
204204
shoulder than a terminal, and a line that was never stored with a connection string in it cannot leak one
205205
through a future endpoint.
206206

207-
### Phase 6 — Polish (~1 week) — **partly done**
207+
### Phase 6 — Polish (~1 week) — **done, bar what needs a person or a Docker daemon**
208208

209209
Terms and privacy pages are built, and they sit **outside** `RequireAuth`: somebody deciding whether to add the
210210
bot has to be able to read them before signing in. Both are written for a self-hosted bot — the operator is
@@ -234,8 +234,19 @@ pinning the four claims the code has to keep true.
234234
own loopback and a published port reaches nothing. The image has **not been built** — the environment it was
235235
written in has no Docker daemon — though the production-only install, the compiled layout and
236236
`docker compose config` were each verified directly.
237-
- README screenshots; `CONTRIBUTING.md` section.
238-
- Light theme, if wanted — cheap now that everything is tokens, but re-verify every contrast ratio.
237+
- **README screenshots — done.** Five, in [`../screenshots/`](../screenshots/README.md), captured from the
238+
built bundle against stub responses so no real server or account is in one. Both themes appear deliberately.
239+
`docs/contributing.md` already carries the dashboard section, including how to add a language.
240+
- **Light theme — done**, and it is not an afterthought: every colour in `index.css` is one `light-dark()` line
241+
holding both schemes, and `contrast.test.ts` reads **both halves** and checks each against WCAG, so a light
242+
value nobody looked at fails the build. The switch is `color-scheme` and nothing else.
243+
- **Appearance customisation — done**, beyond what this phase asked for: six accents, a motion override that
244+
wins in both directions, and the language picker. All three are one `Preference` mechanism — an attribute on
245+
the root element, a `localStorage` key, and a fallback that _removes_ the attribute so the CSS answers before
246+
any script runs. Every accent is measured against both backgrounds.
247+
- **Narrow widths — done.** Ten routes at 390 and 820 CSS px carry no horizontal overflow and no page error.
248+
Two defects that only exist on a phone were fixed there: the owner console's eight-tab strip cut with nothing
249+
saying five tabs sat past the edge, and landing on a later tab left the strip at its start with none marked.
239250

240251
Roughly eight to nine weeks of evenings. Phases 0–2 are the ones that must not be rushed; 3 is mechanical.
241252

@@ -272,8 +283,12 @@ Worth deciding before phase 2, because each changes work later.
272283
"someone says it broke" and "here is the stack". Phase 5, or earlier if support load justifies it.
273284
4. **Kick and ban.** Deliberately excluded (`05-API.md`). Softban covers the reversible case. If you want them,
274285
they need a stronger confirmation than typing a name.
275-
5. **Light theme.** Phase 6 or never. Cheap to add, but every contrast ratio in `08-DESIGN.md` needs recomputing
276-
against a light background, and an unverified light theme is worse than none.
286+
5. **Light theme.** ~~Phase 6 or never.~~ **Answered: built.** The worry was right — an unverified light theme
287+
is worse than none — so `contrast.test.ts` reads both halves of every token out of `index.css` and checks
288+
each against WCAG. Two things it caught are worth keeping in mind: a pair can pass for the wrong reason
289+
(check the colour the component actually draws, not the token you assume it uses), and elevation cannot
290+
simply be recoloured — a drop shadow reads as a smudge on near-black, an inset highlight is invisible on
291+
paper, so `surface-edge` switches technique by theme.
277292
6. **Realtime.** Everything here is request/response. Live member counts or a live audit feed would want SSE
278293
(simpler than WebSockets, and one-directional is all this needs). Not in the POC; the polling in TanStack
279294
Query is enough.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Dashboard screenshots
2+
3+
The images the [root README](../../../README.md) embeds. Committed rather than hosted, so a fork carries them.
4+
5+
They are captured from the **built** dashboard against stub API responses — never a live install, so no real
6+
server, account or snowflake appears in one. The signed-in account renders as `you` for the same reason.
7+
8+
## Retaking them
9+
10+
A screenshot that no longer matches the page is a document that lies, so retake the affected one whenever a
11+
screen changes shape. The recipe, rather than a script: adding Playwright as a dependency to this repository
12+
would cost every self-hoster a browser download for something only a maintainer runs.
13+
14+
1. `npm run build` — the screenshots are of the production bundle, not the dev server.
15+
2. Serve `dashboard/dist` statically and intercept `/api/**` with stub responses.
16+
3. Load each route at **1280px** wide, in the theme listed below, and wait for the network to settle.
17+
18+
| File | Route | Theme |
19+
| ------------------- | ---------------------------- | ----- |
20+
| `overview.png` | `/guilds/:guildId` | dark |
21+
| `levelling.png` | `/guilds/:guildId/levelling` | light |
22+
| `settings.png` | `/guilds/:guildId/settings` | dark |
23+
| `owner-console.png` | `/owner?tab=usage` | dark |
24+
| `appearance.png` | `/appearance` | light |
25+
26+
Both themes appear on purpose: a reader deciding whether to run this should see that the light one is real
27+
rather than an afterthought.
133 KB
Loading
151 KB
Loading
159 KB
Loading
186 KB
Loading
194 KB
Loading

0 commit comments

Comments
 (0)