Skip to content

fix(desktop): render black static boot screen#1570

Merged
wesbillman merged 5 commits into
mainfrom
tho/boot-animation-indicator
Jul 7, 2026
Merged

fix(desktop): render black static boot screen#1570
wesbillman merged 5 commits into
mainfrom
tho/boot-animation-indicator

Conversation

@tellaho

@tellaho tellaho commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

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 #D7D72E over 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 backgroundColor to 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 BuzzMark on 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 #D7D72E mark color.

Reproduction Steps

  1. Launch Buzz Desktop into a first-run or cold boot setup state.
  2. Watch the app from the first visible startup frame through the main UI appearing.
  3. Confirm startup is black instead of flashing white.
  4. Confirm the loading screen shows a static Buzz mark in #D7D72E over a solid black background.
  5. Confirm no gradient background or visible “Setting up your workspace...” text appears.
  6. Confirm assistive loading copy is still present for screen readers.

Screenshots/Demos

static Buzz boot gate on black

Validation

  • pnpm typecheck
  • biome / lint clean
  • fresh desktop dist build, with inline black document style verified in dist/index.html
  • cargo check in desktop/src-tauri (Tauri config parses)
  • onboarding.spec.ts integration suite: 32/32 passed
  • workspace-rail.spec.ts smoke suite: 6/6 passed
  • scratch first-frame probe confirmed 0 <animate> elements and the mark visible on a live gate

Coordination

buzz://message?channel=32d5c18c-d853-4ec5-833f-01d00373f621&thread=65c98d041ee698bf2848a4b5dea6e3a979f218f7f21a433ad9f833956cedbb9d

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>
@tellaho tellaho marked this pull request as draft July 7, 2026 06:01
@tellaho tellaho changed the title use Buzz animation for cold boot splash feat(desktop): use Buzz animation for cold boot splash Jul 7, 2026
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w and others added 2 commits July 7, 2026 00:02
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>
@tellaho tellaho marked this pull request as ready for review July 7, 2026 08:21
@tellaho tellaho marked this pull request as draft July 7, 2026 08:32
…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>
@tellaho tellaho changed the title feat(desktop): use Buzz animation for cold boot splash refactor(desktop): show static Buzz mark during cold boot Jul 7, 2026
@tellaho tellaho marked this pull request as ready for review July 7, 2026 08:55
… 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>
@tellaho tellaho changed the title refactor(desktop): show static Buzz mark during cold boot fix(desktop): render black static cold boot screen Jul 7, 2026
@tellaho tellaho marked this pull request as draft July 7, 2026 09:04
@tellaho tellaho marked this pull request as ready for review July 7, 2026 09:11
@tellaho tellaho changed the title fix(desktop): render black static cold boot screen fix(desktop): render black static boot screen Jul 7, 2026
@tellaho tellaho marked this pull request as draft July 7, 2026 09:22
@tellaho tellaho marked this pull request as ready for review July 7, 2026 15:32
@wesbillman wesbillman merged commit 10444d2 into main Jul 7, 2026
25 checks passed
@wesbillman wesbillman deleted the tho/boot-animation-indicator branch July 7, 2026 15:38
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants