fix(desktop): render black static boot screen#1570
Merged
Conversation
Replace the visible "Setting up your workspace..." text in AppLoadingGate with the shared FuzzyLogo Buzz mark (loop + rest window), matching the live activity/turn-liveness visual language. Keep the sr-only setup text for screen readers and leave the quiet workspace-switch gate untouched. Drop the now-dead setup loading-text CSS and update the onboarding e2e to assert the mark instead of the removed text styles. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
The boot splash reused the turn-liveness rest treatment, which fades the mark to opacity 0 for the whole 2s rest between 0.88s morph cycles — so the cold boot gate was blank ~69% of the time and read as "nothing is loading." Add a loopRestMode prop to BuzzLogoAnimation/FuzzyLogo: "hidden" (default) keeps the old inline-indicator behavior, "visible" holds the finished mark on screen through the rest with only a brief fade at the cycle boundary. The boot gate opts into "visible"; TurnLivenessIndicator is unchanged. Extend the onboarding e2e to sample the mark's opacity across a full cycle and fail if it reads as blank. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
…construct-rebuild loopRestMode="visible" previously still started each cycle with the morph-in-from-blank, and the ink shapes' base DOM attributes were opacity=0 / zero-width — any paint before SMIL beginElement() ran showed an empty gate. Short-lived boots (and WKWebView paints ahead of SMIL startup) rendered no mark at all. Rework the visible-rest cycle so it starts AT the finished mark: - restingAttrs() bakes each animated attribute's final keyframe value into the shapes' base DOM state, so the completed mark paints on the very first frame even if SMIL never starts (also covers reduced-motion). - visibleRestVariant() builds a seamless timeline: rest (mark held) -> reverse morph (deconstruct) -> forward morph (rebuild), landing back on the finished mark. No opacity fade hacks; RestWindowFade reverts to hidden-mode-only. - Default "hidden" mode (TurnLivenessIndicator, inline indicators) is unchanged. e2e now asserts the base opacity attributes are "1" pre-SMIL (the first-paint guarantee) in addition to sampling computed opacity across a full cycle. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
…k on black tho's final read on the animated gate was that it effectively renders as a static image — and that the static look is better. So drop the animation machinery from the cold boot gate entirely and make the simple shape explicit: - New BuzzMark: the finished Buzz mark as a plain static SVG (final keyframe geometry of the v8 morph), filled with currentColor. No SMIL, no scripting — it paints complete on the very first frame in any webview, which was the acceptance bar all along. - AppLoadingGate renders the mark in brand #D7D72E over solid black. No gradient background. sr-only "Setting up your workspace..." status text preserved. - Revert BuzzLogoAnimation/FuzzyLogo to main: the loopRestMode plumbing and visible-rest cycle were only needed to keep the animated gate from blanking; the static gate makes them dead weight. Inline indicators (TurnLivenessIndicator etc.) are untouched. - Delete ThemeGrainientBackground and its grainient CSS — the boot gate was its only consumer. e2e asserts the gate has zero <animate> elements, a flat black background with no background-image, and the #D7D72E currentColor mark. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
… flash
The webview document defaulted to a white background, so cold boot
flashed white for the frames between window show and the app bundle
painting the black loading gate. Make every pre-React layer black:
- index.html: inline <style> sets html { background-color: #000 } so
the document is black from its very first paint, before any bundle
or stylesheet loads. The body paints its own themed background once
app CSS loads, so this never shows through after boot.
- tauri.conf.json: backgroundColor #000000 on the main window covers
the native window/webview layer for the pre-document moment.
e2e now also asserts the document element computes a black background
while the loading gate is up.
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
wesbillman
approved these changes
Jul 7, 2026
tellaho
added a commit
that referenced
this pull request
Jul 7, 2026
…ivity * origin/main: fix(desktop): hydrate reactions for Inbox context messages (#1596) fix: cleanup old screenshots that my agents committed (#1598) chore(release): release Buzz Desktop version 0.3.46 (#1585) fix(desktop): preserve agent model/provider when persona snapshot fields are blank (#1583) feat(acp,desktop): identify and reap stale agent harness processes (#1582) feat(desktop): active-draft badge, send-from-drafts confirm dialog, thread-deleted state (#1581) fix(desktop): treat baked build env vars as satisfying required agent config (#1580) feat(desktop): add "Copy image" to image right-click context menu (#1579) fix(nest): use buzz-dev symlink name for dev builds (#1587) fix(composer): address image-editor follow-up nits on #1491 (#1565) fix(desktop): render black static boot screen (#1570) feat(agents): group activity tool bursts (#1571) feat(desktop): aggregated overview rail, commit detail page, and full breadcrumbs (#1573) fix(desktop): fetch profiles for reaction actors and thread-reply authors (#1550) refactor(desktop): unify EditAgentDialog styling with PersonaDialog (#1540) feat(desktop): add 10-minute message grouping window (#1578) feat(desktop): unify sidebar section actions into a per-section ⋮ menu (#1577) feat(desktop): emoji avatar picker for agents + reliable picker scroll (#1576) Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
tlongwell-block
pushed a commit
that referenced
this pull request
Jul 7, 2026
* origin/main: docs(readme): add Getting started section routing install paths (#1606) fix(desktop): restrict shared-agent sync to dev data dirs (#1597) feat(desktop): restart-required badge from spawn-time config hash (#1602) feat(desktop): boot-time reconcile of managed agents to relay events (#1601) feat(desktop): canonical <PubKey> component — hover to view/copy full keys, owner "you" labels (#1589) fix(desktop): hydrate reactions for Inbox context messages (#1596) fix: cleanup old screenshots that my agents committed (#1598) chore(release): release Buzz Desktop version 0.3.46 (#1585) fix(desktop): preserve agent model/provider when persona snapshot fields are blank (#1583) feat(acp,desktop): identify and reap stale agent harness processes (#1582) feat(desktop): active-draft badge, send-from-drafts confirm dialog, thread-deleted state (#1581) fix(desktop): treat baked build env vars as satisfying required agent config (#1580) feat(desktop): add "Copy image" to image right-click context menu (#1579) fix(nest): use buzz-dev symlink name for dev builds (#1587) fix(composer): address image-editor follow-up nits on #1491 (#1565) fix(desktop): render black static boot screen (#1570) feat(agents): group activity tool bursts (#1571) feat(desktop): aggregated overview rail, commit detail page, and full breadcrumbs (#1573) fix(desktop): fetch profiles for reaction actors and thread-reply authors (#1550)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Category: improvement
User Impact: Users now see a static Buzz mark on a black loading screen while the desktop app boots, without the initial white flash.
Problem: The cold boot surface was first changed toward an animated treatment, but the real startup path is short and first-paint-sensitive. The accepted visual is a static mark, and the pre-React document/window layers could still flash white before React rendered the loading gate.
Solution: The cold boot path now uses black at every early layer: the native Tauri window background, the initial HTML document background, and the React loading gate. Once React mounts, the gate renders a plain static Buzz SVG in
#D7D72Eover black with screen-reader-only loading text. Workspace switching and inline activity indicators are unchanged.File changes
desktop/src-tauri/tauri.conf.json
Sets the main Tauri window
backgroundColorto black so the native window/webview layer is black before the document paints.desktop/index.html
Adds an inline
html { background-color: #000; }style in the document head so the page is black before the app bundle or CSS loads.desktop/src/app/App.tsx
Renders the static
BuzzMarkon a solid black cold boot gate and preserves the screen-reader loading text.desktop/src/shared/ui/buzz-logo/BuzzMark.tsx
Adds the finished Buzz mark as a plain SVG using
currentColor, with no animation elements or startup timing dependency.desktop/src/app/ThemeGrainientBackground.tsx
Removes the former boot-only gradient background component.
desktop/src/shared/styles/globals/animations.css
Removes the now-unused setup gradient/loading text animation styles.
desktop/tests/e2e/onboarding.spec.ts
Updates boot splash coverage to assert the static contract: no
<animate>elements, black document/gate background, no background image, and the#D7D72Emark color.Reproduction Steps
#D7D72Eover a solid black background.Screenshots/Demos
Validation
pnpm typecheckbiome/ lint cleandist/index.htmlcargo checkindesktop/src-tauri(Tauri config parses)onboarding.spec.tsintegration suite: 32/32 passedworkspace-rail.spec.tssmoke suite: 6/6 passed<animate>elements and the mark visible on a live gateCoordination
buzz://message?channel=32d5c18c-d853-4ec5-833f-01d00373f621&thread=65c98d041ee698bf2848a4b5dea6e3a979f218f7f21a433ad9f833956cedbb9d