0037 — Studio settings IA (typed panels + YAML advanced view)¶
Status: IN PROGRESS — from Matt's 2026-07-23 studio driving notes (0029 §9);
implementation started 2026-07-23 with the spec's recommendations adopted for
D1 (Socials = enablement/settings only), D2 (Advanced-YAML edits the project file
only), D3 (last-write-wins with a reload warning).
Date: 2026-07-23
Relates: 0034 (project settings — the tabbed overlay this extends), 0035 (config
writes — all panels persist via Store.Apply), 0014 (per-project config; inheritance),
0019 (publish/connections), 0012 (remote git).
1. Problem¶
The 0034 settings overlay has Themes · Avatars · Advanced, where Advanced is a raw key/value editor over the whole config. Much of what lives there deserves a real UI, and a raw table is the wrong escape hatch for a YAML-shaped, comment-carrying config file.
2. Goals (Matt's notes, items 3 + Themes-tab note)¶
- Extract typed panels from the raw settings into their own tabs:
- Version control — the 0012 commit-on-save/push-on-save/remote settings.
- Socials — platform enablement + per-platform posting settings (0019's config surface; token health stays on the Publish tab's ConnectionsPanel).
- Auth — OAuth client ids/redirects and the studio exposure settings (0018); secrets stay keychain/env-resolved, never editable plaintext.
- Themes belong in the Themes tab — any theme keys still reachable through Advanced disappear from it (single owner: the 0036 editor).
- Advanced becomes a YAML view — an editable YAML representation of the project
config (
.keryx.yaml), replacing the key/value table. Round-trips through the go/config Store so comments/anchors/key-order survive (0035); validated + diffed (aPlanpreview) before apply; secret-bearing keys masked/rejected exactly as the current putConfig allowlist does.
Update 2026-07-24 — Storage tab added (spec 0039). The object-store settings landed as a seventh typed panel (Providers · Storage · Version control · Socials · Auth, plus Themes/Avatars/Advanced):
storage.provider,storage.prefix, andstorage.s3.{bucket,region,endpoint}— all non-secret (credentials resolve via the AWS default chain, never the file), added to the putConfig allowlist. The panel opts into a Verify button (a newConfigPanelverifyprop) that callsPOST /api/v1/storage/verify→ the backend'sStore.Verify(bucket reachable + versioning enabled), showing the outcome inline; Verify is disabled while the form is dirty ("save first").
3. Design sketch¶
- Tab strip becomes: Themes · Avatars · Providers · Storage · Version control · Socials · Auth · Advanced.
- Each typed panel is a thin form over a declared key subset (same allowlist mechanism as putConfig today); unknown/unclaimed keys remain visible only in Advanced-YAML.
- Advanced-YAML:
GETrenders the project file verbatim (comments included); save routes the edit (not a whole-file overwrite) throughStore.Apply— either by computing the key-level diff or by a guarded whole-document replace that preserves the unedited remainder. Inherited-from-global keys render read-only (provenance viaOrigin).
4. Open questions (for review)¶
- D1: does the Socials panel include per-platform copy templates, or only enablement/settings? (Rec: enablement/settings v1.)
- D2: Advanced-YAML scope — project file only (rec), or a second read-only pane for
the effective merged view (
Explain-backed)? - D3: YAML editing conflict story vs CLI writes — last-write-wins with a reload warning (rec) or ETag-guarded?
5. Non-goals¶
- Editing the global config from the studio; managing keychain secrets; token capture flows (stay on the CLI / Publish connections).