Skip to content

SmartPaste improvements and Dashboard enhancements#20

Open
geemileg wants to merge 8 commits into
mazdak:masterfrom
geemileg:master
Open

SmartPaste improvements and Dashboard enhancements#20
geemileg wants to merge 8 commits into
mazdak:masterfrom
geemileg:master

Conversation

@geemileg
Copy link
Copy Markdown

@geemileg geemileg commented Jan 11, 2026

Summary

  • Add Silent Express Mode to prevent focus stealing during transcription
  • Add Direct Typing Mode for remote desktop compatibility (character-by-character typing)
  • Add user-configurable SmartPaste app exclusion list
  • Add version display in menu bar dropdown
  • Fix menu bar icon visibility
  • Fix Dashboard sidebar navigation hitbox (entire row now clickable)
  • Collapsible "Advanced Settings" section for SmartPaste options

Changes

  • SilentTranscriptionService for background transcription
  • KeyboardLayoutHelper for keyboard layout detection with AltGr support
  • ExcludedAppRow component with app icon, name, and bundle ID
  • NSOpenPanel integration for adding apps to exclusion list
  • UserDefaults persistence with caching
  • Unit tests for SilentTranscriptionService

Test plan

  • Silent Express Mode transcribes without stealing focus
  • Direct Typing Mode works with different keyboard layouts
  • SmartPaste exclusion UI: add/remove apps, persists on restart
  • Menu bar icon visible and clickable
  • Dashboard sidebar rows fully clickable
  • Version displays in menu dropdown

🤖 Generated with Claude Code


Note

Introduces silent, UI-less transcription and major SmartPaste upgrades, plus dashboard/menu UX tweaks and build/signing improvements.

  • Silent Express Mode: New SilentTranscriptionService handles background transcription, clipboard copy, optional smart paste, and focus restore; hotkey flow updated to store/target the previous app
  • SmartPaste: Layout-aware typing via KeyboardLayoutHelper, optional Direct Typing Mode (character-by-character), AppleScript/CGEvent fallbacks, excluded-apps support with cached UserDefaults, stricter accessibility checks, and async paste API
  • Dashboard: New preferences for Silent Express Mode and SmartPaste “Advanced Settings” (Direct Typing Mode, excluded apps with picker and ExcludedAppRow); sidebar rows now fully clickable
  • Menu/Status Bar: Version shown at top of menu; status item uses square length and robust icon creation with fallback drawing; icon size resets on screen changes
  • Infra/Build: DataManager.sharedInstance for DI; unit tests for silent service; build script finds/bundles uv in more locations and adds stable adhoc signing; version metadata updated; dependencies refreshed

Written by Cursor Bugbot for commit 17f9c3b. This will update automatically on new commits. Configure here.

golarits-entel and others added 7 commits January 11, 2026 06:33
- Add SilentTranscriptionService for UI-less transcription flow
- Add "Silent Express Mode" toggle in preferences (under Express Mode)
- Update AppDelegate+Hotkeys to use silent service when enabled
- Fix build script: add adhoc signing fallback for TCC permission persistence
- Fix build script: check ~/.local/bin/uv for Parakeet support

Silent Express Mode allows transcription without showing the popup window,
preventing focus from being stolen from full-screen apps like RustDesk.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change status item from variableLength to squareLength for consistent sizing
- Add imagePosition = .imageOnly for proper icon rendering
- Add fallback hand-drawn icon if SF Symbols fail to load

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Test singleton pattern
- Test cancellation behavior
- Test UserDefaults configuration defaults
- Test settings persistence
- Test notification names exist

16 tests, all passing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…artPaste exclusion

- Add KeyboardLayoutHelper that detects current keyboard layout and scans
  for correct key codes including Option/AltGr modifier combinations
- Add Direct Typing Mode toggle in Preferences (types character-by-character
  for remote desktop compatibility)
- Exclude RustDesk from SmartPaste to prevent the "V" insertion issue
- Add version display in menu bar for easier debugging
- Fix sidebar navigation hitbox in Dashboard (entire row now clickable)
- Refactor SilentTranscriptionService for testability with dependency injection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Allow users to manage the SmartPaste exclusion list via Dashboard Preferences:
- Add/remove apps using file picker
- Display excluded apps with icon and name
- Persist exclusions in UserDefaults with caching
- Migrate existing users with RustDesk defaults
- Show error alert when app selection fails

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Wrap Direct Typing Mode and Excluded Apps in a disclosure group
- Add summary text showing current settings (e.g., "Direct typing · 2 excluded")
- Custom disclosure style with animated chevron
- Reduces visual clutter when advanced options aren't needed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Exclusion list now starts empty - users add apps as needed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Comment thread Sources/Services/SilentTranscriptionService.swift Outdated
Only clear currentTask reference if it still points to our task,
preventing premature clearing when a newer transcription is started.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
return false
}
typeTextDirectly(text)
return true
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Direct typing silently fails without reporting error

Medium Severity

The typeClipboardContents function always returns true if the clipboard contains text, but typeTextDirectly can fail silently when CGEventSource creation fails (returning early without typing anything). Callers check the return value expecting it to indicate whether typing succeeded, but the function reports success even when nothing was typed. This causes silent failures where users think text was pasted but it actually wasn't.

Additional Locations (1)

Fix in Cursor Fix in Web

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