feat(admin): Basic settings answers where the instance is reachable, not just what it is called #337

Merged
Cordy merged 3 commits from fix/basic-settings into main 2026-08-27 20:48:27 +00:00
Owner

The page shipped as one field on an otherwise empty screen, and its subtitle promised less than the mockup does.

Subtitle

"How this instance identifies itself." → "What this instance calls itself, and the address it answers on." The old line described half the page because only half the page existed.

Identity

The instance-name row gets an Identity heading and a live preview of everywhere the name appears: the header wordmark and the browser-tab chip, both updating as you type.

The preview clones the real header elements — the .mark glyph and the tagline <small> — rather than re-describing them in a second place. A preview that restates the thing it previews is a second source of truth that drifts; cloning cannot.

maxlength="64" was already on the input, so the description can now state "Up to 64 characters" truthfully. Prefixed in all four languages.

Where this instance answers

New read-only table: Address (with a TLS/No TLS chip), Share links (explaining they are built from that address, so changing it breaks links already sent), and WebDAV.

The address comes from location.origin, not from a setting — because that is the answer. It's the address that just served the page, through whatever reverse proxy sits in front. Cairn doesn't own it and shouldn't pretend to, which is what the read-only note says.

The share-expiry pointer is back

I argued against this panel when we moved default share expiry to Sharing (#331), on the grounds that Cairn has no users who could have learned the old location. Your mockup includes it and I think that's the better call: the question "where did it go?" gets asked by anyone reading the docs or a screenshot, not only by someone with muscle memory. It jumps to Sharing by clicking the rail button.

Caught by the guard

My first attempt used t("sharing") === "sharing" ? "Sharing" : t("sharing") — a defensive fallback around a key I had not defined. TestI18nKeysDefined failed the build and named it. That check exists precisely to stop this papering-over, so the fix was a real bsSharingLink key in four languages rather than a smarter fallback.

Gate: node --check, go vet ./..., go test ./..., go build ./cmd/cairnd. All new keys in four languages.

The page shipped as one field on an otherwise empty screen, and its subtitle promised less than the mockup does. ## Subtitle "How this instance identifies itself." → **"What this instance calls itself, and the address it answers on."** The old line described half the page because only half the page existed. ## Identity The instance-name row gets an `Identity` heading and a **live preview** of everywhere the name appears: the header wordmark and the browser-tab chip, both updating as you type. The preview **clones the real header elements** — the `.mark` glyph and the tagline `<small>` — rather than re-describing them in a second place. A preview that restates the thing it previews is a second source of truth that drifts; cloning cannot. `maxlength="64"` was already on the input, so the description can now state "Up to 64 characters" truthfully. Prefixed in all four languages. ## Where this instance answers New read-only table: **Address** (with a TLS/No TLS chip), **Share links** (explaining they are built from that address, so changing it breaks links already sent), and **WebDAV**. The address comes from `location.origin`, not from a setting — because that *is* the answer. It's the address that just served the page, through whatever reverse proxy sits in front. Cairn doesn't own it and shouldn't pretend to, which is what the read-only note says. ## The share-expiry pointer is back I argued against this panel when we moved default share expiry to Sharing (#331), on the grounds that Cairn has no users who could have learned the old location. Your mockup includes it and I think that's the better call: the question "where did it go?" gets asked by anyone reading the docs or a screenshot, not only by someone with muscle memory. It jumps to Sharing by clicking the rail button. ## Caught by the guard My first attempt used `t("sharing") === "sharing" ? "Sharing" : t("sharing")` — a defensive fallback around a key I had not defined. `TestI18nKeysDefined` failed the build and named it. That check exists precisely to stop this papering-over, so the fix was a real `bsSharingLink` key in four languages rather than a smarter fallback. Gate: `node --check`, `go vet ./...`, `go test ./...`, `go build ./cmd/cairnd`. All new keys in four languages.
Cordy merged commit 5e37f32fc2 into main 2026-08-27 20:48:27 +00:00
Cordy deleted branch fix/basic-settings 2026-08-27 20:48:28 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Cordy/Cairn#337
No description provided.