#307: pond-level branding overrides the instance logo and favicon #317
No reviewers
Labels
No Label
area:auth
area:docs
area:export
area:ops
area:storage
area:supply-chain
auth
backend
blocked
collab
deployment
docs
effort:L
effort:M
effort:S
frontend
plugins
qa
vs-nfd
vs-nfd:blocker
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stwaidele/dorfteich#317
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "issue-307-pond-branding"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements #307 on top of #306 (now on main).
A layer on #306's storage, serving and crop control — not a parallel implementation.
resolveBrandingin shared is the ONE place that answers "which asset applies here?", and both the sidebar logo and the favicon swap read it.The rule that is easiest to "fix" by accident
A logo set belongs to one level; variants are never mixed across levels. A pond that uploaded only a light logo shows THAT logo in dark mode — it does not borrow the instance's dark variant. Decided 2026-08-01: a logo silently swapping to a different image when the viewer switches theme is a change nobody ordered, and a design that looks wrong is more honest than one that is quietly substituted. Only a pond with no logo at all inherits the instance's set, again as a set.
It is pinned by name in
branding.test.ts, in both directions (pond-light-only stays on its own logo in dark mode; a pond with nothing set inherits both instance variants).Two consequences that are easy to get wrong:
Quota and purge
Unchanged security
Not relaxed because the uploader is now an ordinary Pond Admin rather than the operator: SVG refused (own error message), magic bytes and IHDR checked server-side, size caps, content type pinned on serving, no image parsing in the api.
Favicon swap
Driven by the RESOLVED pond, never the raw route parameter — an unreadable or unknown slug must not leave a stale icon in the tab. That the swap happens after first paint is accepted and stated in the code and the UI text; avoiding it would mean server-rendering index.html, which is #179's territory.
Verification
branding.changed) withscope: 'pond'— the catalogue already documents the field, so no version bump.Closes #307
4b9018c033to90748b743e90748b743etoa327126fac