Skip to content

Replace WolfWave canonical wolf mark - #393

Merged
nathanialhenniges merged 5 commits into
mainfrom
codex/update-wolf-logo
Aug 6, 2026
Merged

Replace WolfWave canonical wolf mark#393
nathanialhenniges merged 5 commits into
mainfrom
codex/update-wolf-logo

Conversation

@nathanialhenniges

@nathanialhenniges nathanialhenniges commented Aug 6, 2026

Copy link
Copy Markdown
Member

Summary

  • replace the canonical native wolf mark and derived app assets
  • sync widget fallback, favicon, public branding, and Discord artwork
  • document the canonical source and Light/Dark Icon Composer colors

Validation

  • CodeRabbit CLI: two completed review passes; documentation findings fixed
  • retained the requested #00ACED Dark appearance wolf tint
  • bun run --filter widget build
  • make build
  • git diff --check origin/main...HEAD
  • canonical path parity check across native and widget consumers

Note: a final CodeRabbit verification attempt was rate-limited after the fixes.

Summary by CodeRabbit

  • Branding

    • Introduced a unified minimal wolf-head mark across the app, menu bar, onboarding, widgets, documentation, and repository branding.
    • Updated app icon styling, sizing, and light/dark treatments.
    • Replaced legacy tray and wave-and-howl artwork.
  • Documentation

    • Updated brand guidelines, component references, onboarding notes, and changelogs to reflect the canonical mark and its usage.
  • Accessibility & Experience

    • Simplified the onboarding mark presentation while preserving surrounding entrance animations and theme-aware styling.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@nathanialhenniges, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 48 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c33f5b04-d387-46d4-82c2-84f34675a96c

📥 Commits

Reviewing files that changed from the base of the PR and between f921664 and a148890.

📒 Files selected for processing (7)
  • apps/docs/content/docs/design-system/brand.mdx
  • apps/native/WolfWave/Core/AppDelegate+MenuBar.swift
  • apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift
  • apps/native/WolfWave/Views/Onboarding/Components/WolfHeroMark.swift
  • apps/native/WolfWave/Views/Onboarding/OnboardingMenuBarPointerStepView.swift
  • apps/native/docs/onboarding-review.md
  • design-system/components/wolf-hero-mark.md

Walkthrough

The PR standardizes WolfMark branding across native app surfaces, widgets, onboarding, design-system documentation, app icons, and changelogs. WolfHeroMark now uses a static canonical asset with mono and gradient styles.

Changes

Unified WolfMark branding

Layer / File(s) Summary
Canonical WolfMark contract
apps/docs/content/docs/design-system/brand.mdx, CHANGELOG.md, apps/docs/content/docs/changelog.mdx
Brand guidance defines the canonical SVG, sizing, colors, rendering, and app-icon treatments. Changelogs document the v2.1.0 branding change.
Native asset adoption
apps/native/WolfWave/Resources/AppIcon.icon/icon.json, apps/native/WolfWave/Core/AppDelegate+MenuBar.swift, apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift, apps/native/WolfWave/Views/Onboarding/OnboardingMenuBarPointerStepView.swift, apps/native/WolfWave/Resources/widget.html
Native app surfaces use WolfMark instead of TrayIcon or waveform artwork. The app icon uses updated fills and logo scale.
WolfHeroMark rendering and onboarding
apps/native/WolfWave/Views/Onboarding/Components/WolfHeroMark.swift, apps/native/WolfWave/Views/Onboarding/OnboardingCompletionView.swift, apps/native/WolfWave/Views/Onboarding/OnboardingWelcomeStepView.swift, apps/native/WolfWaveTests/OnboardingCompletionViewTests.swift, apps/native/docs/onboarding-review.md
WolfHeroMark renders the static WolfMark asset with mono or brand-gradient styling. Onboarding callers, tests, and review documentation use the reduced API.
Widget artwork and component references
apps/widget/src/widget.html, apps/widget/src/widget.ts, design-system/components/*.md
Widget favicons and fallback artwork use compact WolfMark SVGs. Component documentation references the canonical asset and updated rendering behavior.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Poem

A rabbit sees the wolf mark shine,
In app and widget, crisp and fine.
The old bars rest; the gradients glow,
One mark now leads each place we go.
“Hop-hop!” says Bunny, “Ship the flow!”

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the replacement of the canonical WolfWave wolf mark, which is the main change.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/update-wolf-logo

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (1)
apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift (1)

277-284: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use Image("WolfMark") in both SwiftUI bodies instead of the NSImage(named:) bridge. Both sites wrap NSImage(named: "WolfMark") in an if let inside a SwiftUI body. The shared root cause is the unnecessary AppKit bridge. SwiftUI resolves catalog assets directly, and AlbumArtView.swift already follows that convention. The if let also drops the mark silently when the asset is missing.

  • apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift#L277-L284: replace the if let mark = NSImage(named: "WolfMark") block with Image("WolfMark") and keep the existing .resizable(), .renderingMode(.template), .interpolation(.high), .frame(width: DSSpace.s6, height: DSSpace.s6), and .foregroundStyle(.white) modifiers.
  • apps/native/WolfWave/Views/Onboarding/OnboardingMenuBarPointerStepView.swift#L97-L97: replace the if let trayIcon = NSImage(named: "WolfMark") block with Image("WolfMark"), which also removes the stale trayIcon name and the incorrect 8-space indentation.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift` around lines
277 - 284, Replace the NSImage(named:) bridges with direct Image("WolfMark")
usage in MonthlyWrapView.swift lines 277-284 and
OnboardingMenuBarPointerStepView.swift line 97. Remove the surrounding optional
bindings, stale variable names, and incorrect indentation while preserving the
existing image modifiers in MonthlyWrapView.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/docs/content/docs/design-system/brand.mdx`:
- Around line 22-27: Update the standalone brand-surface rule in the brand
guidance to authorize the approved brandGradient stops for Light and Dark
treatments, while preserving the existing solid blue and white options;
alternatively, update the native callers using brandGradient to use a solid
authorized mark color.

In `@apps/native/docs/onboarding-review.md`:
- Around line 113-114: Update the earlier findings in onboarding-review.md that
describe the custom Swift path, partner-gradient issue, or reference
WolfHeroMark.swift:96-106 so they are clearly labeled as historical before the
2026-08-06 sync, or rewrite them to reflect the current implementation. Keep the
new Brand sync status consistent and remove references that imply the deleted
code still exists.

In `@apps/native/WolfWave/Core/AppDelegate`+MenuBar.swift:
- Around line 24-27: In the status item setup around the WolfMark NSImage, set
the icon’s size to 18×18 before assigning it to button.image. Keep isTemplate
enabled and preserve the existing fallback behavior.

In `@apps/native/WolfWave/Views/Onboarding/Components/WolfHeroMark.swift`:
- Around line 44-47: Update WolfHeroMark to hide itself from accessibility by
default, replacing its explicit accessibility element and label with the
appropriate accessibility-hidden modifier. Preserve the existing visual layout,
and leave labeling to callers that need to expose the mark.

In
`@apps/native/WolfWave/Views/Onboarding/OnboardingMenuBarPointerStepView.swift`:
- Line 97: In the onboarding pointer step view’s WolfMark image block, align the
if-let statement with the enclosing ZStack body indentation and rename the
trayIcon binding to a name matching the WolfMark asset, updating all references
within the block.

In `@design-system/components/wolf-hero-mark.md`:
- Line 45: Update the documentation instruction in wolf-hero-mark.md to identify
assets/logo.svg as the canonical edit point, then instruct contributors to
regenerate or synchronize WolfMark.svg and all other documented derivatives from
it.

---

Nitpick comments:
In `@apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift`:
- Around line 277-284: Replace the NSImage(named:) bridges with direct
Image("WolfMark") usage in MonthlyWrapView.swift lines 277-284 and
OnboardingMenuBarPointerStepView.swift line 97. Remove the surrounding optional
bindings, stale variable names, and incorrect indentation while preserving the
existing image modifiers in MonthlyWrapView.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c7e12483-2a2f-4516-b7d3-f3343be60d45

📥 Commits

Reviewing files that changed from the base of the PR and between e74e621 and f921664.

⛔ Files ignored due to path filters (25)
  • apps/docs/public/apple-icon.png is excluded by !**/*.png
  • apps/docs/public/favicon.ico is excluded by !**/*.ico
  • apps/docs/public/icon.png is excluded by !**/*.png
  • apps/docs/public/icon.svg is excluded by !**/*.svg
  • apps/docs/public/logo.svg is excluded by !**/*.svg
  • apps/marketing/wolfwave-announcement/public/logo.png is excluded by !**/*.png
  • apps/marketing/wolfwave-announcement/public/logo.svg is excluded by !**/*.svg
  • apps/native/WolfWave/Resources/AppIcon.icon/Assets/logo.svg is excluded by !**/*.svg
  • apps/native/WolfWave/Resources/Assets.xcassets/DiscordArtWolfWave.imageset/DiscordArtWolfWave.png is excluded by !**/*.png
  • apps/native/WolfWave/Resources/Assets.xcassets/TrayIcon.imageset/TrayIcon.png is excluded by !**/*.png
  • apps/native/WolfWave/Resources/Assets.xcassets/TrayIcon.imageset/TrayIcon@2x.png is excluded by !**/*.png
  • apps/native/WolfWave/Resources/Assets.xcassets/WolfMark.imageset/WolfMark.svg is excluded by !**/*.svg
  • apps/native/WolfWave/Resources/favicon.ico is excluded by !**/*.ico
  • assets/logo-128.png is excluded by !**/*.png
  • assets/logo-256.png is excluded by !**/*.png
  • assets/logo-512.png is excluded by !**/*.png
  • assets/logo-64.png is excluded by !**/*.png
  • assets/logo-mono-128.png is excluded by !**/*.png
  • assets/logo-mono-256.png is excluded by !**/*.png
  • assets/logo-mono-512.png is excluded by !**/*.png
  • assets/logo-mono-64.png is excluded by !**/*.png
  • assets/logo-mono.svg is excluded by !**/*.svg
  • assets/logo.svg is excluded by !**/*.svg
  • discord-assets/icon.png is excluded by !**/*.png
  • discord-assets/wolfwave.png is excluded by !**/*.png
📒 Files selected for processing (19)
  • CHANGELOG.md
  • apps/docs/content/docs/changelog.mdx
  • apps/docs/content/docs/design-system/brand.mdx
  • apps/native/WolfWave/Core/AppDelegate+MenuBar.swift
  • apps/native/WolfWave/Resources/AppIcon.icon/icon.json
  • apps/native/WolfWave/Resources/Assets.xcassets/TrayIcon.imageset/Contents.json
  • apps/native/WolfWave/Resources/widget.html
  • apps/native/WolfWave/Views/HistoryStats/MonthlyWrapView.swift
  • apps/native/WolfWave/Views/Onboarding/Components/WolfHeroMark.swift
  • apps/native/WolfWave/Views/Onboarding/OnboardingCompletionView.swift
  • apps/native/WolfWave/Views/Onboarding/OnboardingMenuBarPointerStepView.swift
  • apps/native/WolfWave/Views/Onboarding/OnboardingWelcomeStepView.swift
  • apps/native/WolfWaveTests/OnboardingCompletionViewTests.swift
  • apps/native/docs/onboarding-review.md
  • apps/widget/src/widget.html
  • apps/widget/src/widget.ts
  • design-system/components/album-art-view.md
  • design-system/components/monthly-wrap-card.md
  • design-system/components/wolf-hero-mark.md
💤 Files with no reviewable changes (1)
  • apps/native/WolfWave/Resources/Assets.xcassets/TrayIcon.imageset/Contents.json

Comment thread apps/docs/content/docs/design-system/brand.mdx
Comment thread apps/native/docs/onboarding-review.md
Comment thread apps/native/WolfWave/Core/AppDelegate+MenuBar.swift
Comment thread apps/native/WolfWave/Views/Onboarding/Components/WolfHeroMark.swift
.frame(width: 26, height: 22)

if let trayIcon = NSImage(named: "TrayIcon") {
if let trayIcon = NSImage(named: "WolfMark") {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the indentation and rename trayIcon.

Line 97 uses 8 spaces of indentation. The enclosing ZStack body uses 16 spaces, so the block structure now reads incorrectly. The binding name trayIcon also no longer matches the WolfMark asset.

🧹 Proposed fix
-        if let trayIcon = NSImage(named: "WolfMark") {
-                    Image(nsImage: trayIcon)
+                if let wolfMark = NSImage(named: "WolfMark") {
+                    Image(nsImage: wolfMark)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if let trayIcon = NSImage(named: "WolfMark") {
if let wolfMark = NSImage(named: "WolfMark") {
Image(nsImage: wolfMark)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/native/WolfWave/Views/Onboarding/OnboardingMenuBarPointerStepView.swift`
at line 97, In the onboarding pointer step view’s WolfMark image block, align
the if-let statement with the enclosing ZStack body indentation and rename the
trayIcon binding to a name matching the WolfMark asset, updating all references
within the block.

Comment thread design-system/components/wolf-hero-mark.md Outdated
@nathanialhenniges
nathanialhenniges merged commit a8c1c99 into main Aug 6, 2026
2 checks passed
@nathanialhenniges
nathanialhenniges deleted the codex/update-wolf-logo branch August 6, 2026 22:44
@coderabbitai coderabbitai Bot mentioned this pull request Aug 7, 2026
25 tasks
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.

1 participant