Skip to content

Updated icons for FV and fixed menubar bug#64

Merged
altic-dev merged 1 commit intomainfrom
b/icon
Dec 21, 2025
Merged

Updated icons for FV and fixed menubar bug#64
altic-dev merged 1 commit intomainfrom
b/icon

Conversation

@altic-dev
Copy link
Copy Markdown
Owner

@altic-dev altic-dev commented Dec 21, 2025

Description

Brief description of what this PR does.

Type of Change

  • 🐞 Bug fix (non-breaking change which fixes an issue)
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📝 Documentation update

Related Issues

Closes #(issue number)

Testing

  • Tested on Intel/Apple Silicon Mac
  • Tested on Apple Silicon Mac
  • Tested on macOS [version]
  • Ran linter locally: brew install swiftlint && swiftlint --strict --config .swiftlint.yml
  • Ran formatter locally: brew install swiftformat && swiftformat --config .swiftformat Sources

Screenshots / Video

Add screenshots or Video recording of the app after you have made your changes

Summary by CodeRabbit

  • Changes

    • App no longer displays a dock icon, operating exclusively as a menu bar utility.
  • Style

    • Updated menu bar icon to use vector-based assets for improved visual quality and consistency.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Dec 21, 2025

Walkthrough

The changes modify the app's visual presentation and behavior: replacing a custom-drawn menu bar icon with a vector asset, removing obsolete icon asset configuration, hiding the app from the dock by setting LSUIElement to true, and injecting AppServices as an environment object in the SwiftUI view hierarchy.

Changes

Cohort / File(s) Summary
App Visibility Configuration
Info.plist
Changed LSUIElement from false to true, designating the app as a UI element to hide it from the dock.
Icon Assets
Sources/Fluid/Assets.xcassets/AppIcon.appiconset/Untitled.icon/icon.json
Deleted icon asset configuration file containing fill, shadow, translucency, and platform-specific settings.
Menu Bar Icon Implementation
Sources/Fluid/Services/MenuBarManager.swift
Replaced programmatically drawn F-shaped icon with a vector asset named "MenuBarIcon" marked as template; added AppServices.shared as environmentObject in view construction paths to enable UI layer access.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

  • Verify the icon asset "MenuBarIcon" is properly referenced and included in the project
  • Confirm AppServices injection in both window creation paths is consistent and correct
  • Check that the template icon renders correctly across different menu bar states and themes

Poem

🐰 A icon made of code takes flight,
Traded for assets crisp and bright,
The dock hides now, the app stays lean,
Services shared in views between! ✨

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description follows the template structure but is largely incomplete with placeholder text and minimal actual information about the changes. Replace placeholder text with detailed descriptions of the icon updates and menubar bug fix, provide a specific issue number, check platform testing checkboxes, and add screenshots/video demonstrating the changes.
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main changes: updating icons and fixing a menubar bug, which align with the changes shown in the PR.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch b/icon

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 and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 73d15c8 and 83ff5ff.

⛔ Files ignored due to path filters (14)
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/Untitled.icon/Assets/icon-512@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-128@1x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-128@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-16@1x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-16@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-256@1x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-256@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-32@1x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-32@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-512@1x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/icon-512@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/MenuBarIcon.imageset/menubar-icon.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/MenuBarIcon.imageset/menubar-icon@2x.png is excluded by !**/*.png
  • Sources/Fluid/Assets.xcassets/MenuBarIcon.imageset/menubar-icon@3x.png is excluded by !**/*.png
📒 Files selected for processing (3)
  • Info.plist (1 hunks)
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/Untitled.icon/icon.json (0 hunks)
  • Sources/Fluid/Services/MenuBarManager.swift (2 hunks)
💤 Files with no reviewable changes (1)
  • Sources/Fluid/Assets.xcassets/AppIcon.appiconset/Untitled.icon/icon.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build FluidVoice
🔇 Additional comments (1)
Sources/Fluid/Services/MenuBarManager.swift (1)

476-476: AppServices.shared initialization is safe and guaranteed by Swift.

Stored type properties are lazily initialized on their first access and are guaranteed to be initialized only once, even when accessed by multiple threads simultaneously. The singleton is accessed in fluidApp.swift line 15 as a @StateObject during app startup, ensuring it initializes before any menu bar interactions trigger createAndShowMainWindow(). No explicit initialization confirmation needed.

Likely an incorrect or invalid review comment.

Comment on lines 23 to +24
<key>LSUIElement</key>
<false/>
<true/>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Find the FluidVoice repository and examine the Info.plist file
find . -name "Info.plist" -type f | head -20

Repository: altic-dev/FluidVoice

Length of output: 76


🏁 Script executed:

# Search for MenuBarManager.swift
find . -name "MenuBarManager.swift" -type f | head -20

Repository: altic-dev/FluidVoice

Length of output: 109


🏁 Script executed:

# Look for CHANGELOG, release notes, README
find . -maxdepth 2 -type f \( -name "CHANGELOG*" -o -name "RELEASE*" -o -name "README*" -o -name "HISTORY*" \) | head -20

Repository: altic-dev/FluidVoice

Length of output: 75


🏁 Script executed:

#!/bin/bash
echo "=== Searching for Info.plist ==="
find . -name "Info.plist" -type f
echo ""
echo "=== Searching for MenuBarManager.swift ==="
find . -name "MenuBarManager.swift" -type f
echo ""
echo "=== Searching for documentation files ==="
find . -maxdepth 3 -type f \( -name "CHANGELOG*" -o -name "RELEASE*" -o -name "README*" -o -name "HISTORY*" \)

Repository: altic-dev/FluidVoice

Length of output: 254


🏁 Script executed:

cat -n Info.plist | head -30

Repository: altic-dev/FluidVoice

Length of output: 1530


🏁 Script executed:

sed -n '310,330p' ./Sources/Fluid/Services/MenuBarManager.swift

Repository: altic-dev/FluidVoice

Length of output: 884


🏁 Script executed:

head -100 README.md

Repository: altic-dev/FluidVoice

Length of output: 3248


Document the intentional menu bar-only design in user-facing materials.

LSUIElement set to true hides the app from the Dock and Cmd+Tab switcher, configuring it as a background UI element. While the architecture confirms this is intentional (the app is designed as a menu bar utility), this significant behavioral change lacks clear user-facing documentation:

  1. The README mentions "Menu bar integration for quick access" but doesn't explicitly state the app won't appear in the Dock or application switcher.
  2. The "Open Fluid Voice" menu item provides access, but users unfamiliar with menu bar conventions may struggle to discover it.
  3. Release notes don't communicate this as an intentional shift or document the implications for discoverability.

Add explicit documentation in the README and release notes clarifying this menu bar-only design is intentional and highlighting that users must access the app via the menu bar or global hotkey, not Dock/Cmd+Tab.

🤖 Prompt for AI Agents
Info.plist lines 23-24: LSUIElement=true makes the app a menu bar–only utility
(hidden from Dock and Cmd+Tab) but this design isn't explicitly documented;
update the README (top-level usage/installation section) and the release notes
to state clearly that the app intentionally does not appear in the Dock or
application switcher, explain how to access the app via the menu bar icon and
any global hotkey (include default hotkey and how to change it), add a short
note about discoverability and where to find the “Open Fluid Voice” menu item,
and include a troubleshooting line explaining that visibility in Dock/Cmd+Tab is
expected behavior and not a bug.

Comment on lines +288 to +292
// Use MenuBarIcon asset - vectorized from logo
if let image = NSImage(named: "MenuBarIcon") {
image.isTemplate = true // Adapts to light/dark mode and tints red when recording
statusItem.button?.image = image
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# Find all xcassets directories
echo "=== Searching for Assets.xcassets ==="
find . -name "*.xcassets" -type d 2>/dev/null

# Search for MenuBarIcon
echo ""
echo "=== Searching for MenuBarIcon references ==="
rg -i "MenuBarIcon" --type-add 'json:*.json' --type json 2>/dev/null || true

# Also try broader text search
echo ""
echo "=== Broader text search for MenuBarIcon ==="
rg -i "MenuBarIcon" 2>/dev/null || true

Repository: altic-dev/FluidVoice

Length of output: 836


🏁 Script executed:

#!/bin/bash

# List contents of Assets.xcassets
echo "=== Contents of Assets.xcassets ==="
find ./Sources/Fluid/Assets.xcassets -type d -name "*.imageset" -o -name "*.appiconset" | sort

# Read MenuBarIconGenerator to understand how icon is created
echo ""
echo "=== MenuBarIconGenerator.swift content ==="
cat -n ./Sources/Fluid/UI/MenuBarIconGenerator.swift

# Read the updateMenuBarIcon method in full context
echo ""
echo "=== MenuBarManager.swift lines around updateMenuBarIcon ==="
rg -B5 -A10 "private func updateMenuBarIcon" ./Sources/Fluid/Services/MenuBarManager.swift

Repository: altic-dev/FluidVoice

Length of output: 3232


🏁 Script executed:

#!/bin/bash

# Read MenuBarIcon.imageset Contents.json
echo "=== MenuBarIcon.imageset Contents.json ==="
cat ./Sources/Fluid/Assets.xcassets/MenuBarIcon.imageset/Contents.json

# Search for isRecording handling in MenuBarManager
echo ""
echo "=== Search for isRecording in MenuBarManager ==="
rg -n "isRecording" ./Sources/Fluid/Services/MenuBarManager.swift

# Search for tinting, contentTint, or color logic in MenuBarManager
echo ""
echo "=== Search for tinting/color logic ==="
rg -n "tint|color|red" ./Sources/Fluid/Services/MenuBarManager.swift

Repository: altic-dev/FluidVoice

Length of output: 3178


Fix misleading comment about red tinting behavior.

The "MenuBarIcon" asset exists and is properly configured in the asset catalog with template-rendering-intent set to "template". However, the comment at line 290 is misleading: template images adapt to light/dark mode but do not automatically tint red when recording. The updateMenuBarIcon() method contains no logic to switch icons or apply color tinting based on the isRecording state. If red tinting during recording is desired, you'll need to implement explicit color/image switching logic, either by loading a different asset when recording or by programmatically setting statusItem.button?.contentTintColor based on the recording state.

🤖 Prompt for AI Agents
In Sources/Fluid/Services/MenuBarManager.swift around lines 288 to 292, the
inline comment incorrectly claims template images "tint red when recording" even
though updateMenuBarIcon() contains no recording-based tinting; either update
the comment to accurately state that template images adapt to light/dark mode
but do not auto-change color for recording, or implement explicit
recording-state handling (e.g., load a separate "MenuBarIconRecording" asset
when isRecording is true or set statusItem.button?.contentTintColor when
supported) and ensure the comment reflects the chosen approach.

@altic-dev altic-dev merged commit 305bbde into main Dec 21, 2025
2 checks passed
@altic-dev altic-dev deleted the b/icon branch March 15, 2026 07:49
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