Skip to content

Conversation

@deepme987
Copy link

@deepme987 deepme987 commented Nov 23, 2025

Summary

Adds a one-time modal introducing Comfy Cloud to macOS desktop users, with clear messaging that ComfyUI remains free and open source.

Changes

  • What: One-time cloud notification modal for macOS desktop users with persistent topbar badge
  • Breaking: None
  • Dependencies: None

Review Focus

Platform targeting is intentionally macOS + Electron only to minimize backlash and test user reception before broader rollout.

Screenshots (if applicable)

image image

┆Issue is synchronized with this Notion page by Unito

Adds a one-time informational modal that introduces Comfy Cloud to macOS desktop users. The modal emphasizes that ComfyUI remains free and open source, with Cloud as an optional service for GPU access.

Key features:
- Shows once on first launch for macOS + Electron users
- Persistent badge in topbar after dismissal for easy re-access
- Clean design with Comfy Cloud branding
- Non-intrusive messaging focused on infrastructure benefits

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Nov 23, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 23, 2025

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

Introduces a one-time cloud notification feature for Electron users on macOS. Adds a new CloudNotificationContent component, cloud notification badge in the topbar, dialog service method, core setting to track notification display state, and localization strings. The notification displays automatically on first app launch.

Changes

Cohort / File(s) Summary
Cloud Notification Dialog Component
src/components/dialog/content/CloudNotificationContent.vue, src/services/dialogService.ts
New CloudNotificationContent Vue SFC component with dismiss and explore actions; new showCloudNotification() method added to dialog service to display the notification dialog
Topbar Badge UI
src/components/topbar/TopbarBadges.vue
Adds cloud notification badge rendering with Electron and macOS platform detection; displays badge based on notification shown status; includes click handler to trigger dialog service
Settings Configuration
src/platform/settings/constants/coreSettings.ts, src/schemas/apiSchema.ts
New Comfy.Desktop.CloudNotificationShown boolean setting added with default value false; setting registered in both core settings and API schema
Localization
src/locales/en/main.json
New cloudNotification root-level object with title, message, four feature highlights, and UI action labels for promoting Comfy Cloud
App Initialization
src/App.vue
Async lifecycle hook modified to check and display cloud notification once on Electron macOS; reads notification shown flag from settings store and updates it after display

Sequence Diagram

sequenceDiagram
    participant User
    participant App as App.vue
    participant SettingStore as Setting Store
    participant Topbar as TopbarBadges
    participant Dialog as Dialog Service
    participant Content as CloudNotification<br/>Component

    App->>SettingStore: Check Comfy.Desktop.CloudNotificationShown
    alt First Load (not shown)
        SettingStore-->>App: false
        App->>Dialog: showCloudNotification()
        Dialog->>Content: Render notification
        Content-->>User: Display cloud notification
        App->>SettingStore: Set Comfy.Desktop.CloudNotificationShown = true
    else Subsequent Loads
        SettingStore-->>App: true
        App-->>Topbar: Skip init notification
    end

    rect rgba(200, 220, 255, 0.3)
    Note over Topbar,Dialog: Topbar Badge (always available once shown)
    Topbar->>SettingStore: Read Comfy.Desktop.CloudNotificationShown
    alt Electron + macOS + notification shown
        SettingStore-->>Topbar: true
        Topbar-->>User: Display cloud badge
        User->>Topbar: Click badge
        Topbar->>Dialog: handleCloudBadgeClick()
        Dialog->>Content: Render notification
        Content-->>User: Show dialog
    end
    end

    User->>Content: Dismiss or Explore
    Content->>Dialog: closeDialog()
Loading
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/cloud-notification-macos

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

@github-actions
Copy link

github-actions bot commented Nov 23, 2025

🎭 Playwright Test Results

Some tests failed

⏰ Completed at: 11/23/2025, 11:00:13 PM UTC

📈 Summary

  • Total Tests: 495
  • Passed: 482 ✅
  • Failed: 1 ❌
  • Flaky: 3 ⚠️
  • Skipped: 9 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 473 / ❌ 1 / ⚠️ 3 / ⏭️ 9
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@github-actions
Copy link

github-actions bot commented Nov 23, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/23/2025, 10:49:36 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@deepme987 deepme987 marked this pull request as draft November 23, 2025 15:26
@github-actions
Copy link

github-actions bot commented Nov 23, 2025

Bundle Size Report

Summary

  • Raw size: 14.2 MB baseline 14.2 MB — 🔴 +8.44 kB
  • Gzip: 2.84 MB baseline 2.84 MB — 🔴 +1.78 kB
  • Brotli: 2.23 MB baseline 2.22 MB — 🔴 +1.15 kB
  • Bundles: 92 current • 92 baseline • 43 added / 43 removed

Category Glance
App Entry Points 🔴 +6.61 kB (3.19 MB) · Graph Workspace 🔴 +1.84 kB (943 kB) · Vendor & Third-Party 🟢 -21 B (5.7 MB) · Other ⚪ 0 B (3.87 MB) · Panels & Settings ⚪ 0 B (306 kB) · UI Components ⚪ 0 B (141 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.19 MB (baseline 3.18 MB) • 🔴 +6.61 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-0hq-6ipv.js (new) 2.96 MB 🔴 +2.96 MB 🔴 +616 kB 🔴 +468 kB
assets/index-CaGKsPec.js (removed) 2.95 MB 🟢 -2.95 MB 🟢 -615 kB 🟢 -467 kB
assets/index-CmtQsI-h.js (removed) 228 kB 🟢 -228 kB 🟢 -48.9 kB 🟢 -40.3 kB
assets/index-CwglAiPN.js (new) 228 kB 🔴 +228 kB 🔴 +48.9 kB 🔴 +40.3 kB
assets/index-DWwYX8i2.js (removed) 345 B 🟢 -345 B 🟢 -245 B 🟢 -210 B
assets/index-hk1zKvf1.js (new) 345 B 🔴 +345 B 🔴 +246 B 🔴 +199 B

Status: 3 added / 3 removed

Graph Workspace — 943 kB (baseline 941 kB) • 🔴 +1.84 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B2Ur2sQ8.js (new) 943 kB 🔴 +943 kB 🔴 +183 kB 🔴 +140 kB
assets/GraphView-CQlMYFtZ.js (removed) 941 kB 🟢 -941 kB 🟢 -182 kB 🟢 -140 kB

Status: 1 added / 1 removed

Views & Navigation — 7.97 kB (baseline 7.97 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-aNmxDoxh.js (removed) 7.97 kB 🟢 -7.97 kB 🟢 -2.43 kB 🟢 -2.14 kB
assets/UserSelectView-DOUVeYv9.js (new) 7.97 kB 🔴 +7.97 kB 🔴 +2.43 kB 🔴 +2.14 kB

Status: 1 added / 1 removed

Panels & Settings — 306 kB (baseline 306 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-DX2fBoKp.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -5.46 kB 🟢 -4.78 kB
assets/CreditsPanel-j_ZJTXcG.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +5.46 kB 🔴 +4.79 kB
assets/KeybindingPanel-CZppHPgx.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.73 kB 🟢 -3.28 kB
assets/KeybindingPanel-DqHSOJhu.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.73 kB 🔴 +3.29 kB
assets/ExtensionPanel-BDdOtHsX.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -2.79 kB 🟢 -2.44 kB
assets/ExtensionPanel-CfboHNVq.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +2.79 kB 🔴 +2.45 kB
assets/AboutPanel-C0GBsEDI.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.62 kB 🟢 -2.31 kB
assets/AboutPanel-xedUSVuW.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.62 kB 🔴 +2.31 kB
assets/ServerConfigPanel-CSz9hNIa.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.12 kB 🟢 -1.88 kB
assets/ServerConfigPanel-CY7EBxYS.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.12 kB 🔴 +1.88 kB
assets/UserPanel-BBSO8nGF.js (new) 7.74 kB 🔴 +7.74 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/UserPanel-DQcJF1-k.js (removed) 7.74 kB 🟢 -7.74 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

UI Components — 141 kB (baseline 141 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-DUcKcvMT.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.43 kB 🔴 +7.23 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-QYzN_JMy.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.43 kB 🟢 -7.23 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CHocBOAM.js (new) 48 kB 🔴 +48 kB 🔴 +10.3 kB 🔴 +8.91 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-D_yuZRnO.js (removed) 48 kB 🟢 -48 kB 🟢 -10.3 kB 🟢 -8.91 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-B0o713NM.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -3.31 kB 🟢 -2.93 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-B6lQr-zT.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.3 kB 🔴 +2.92 kB
assets/ComfyQueueButton-73yRfwMz.js (new) 9.22 kB 🔴 +9.22 kB 🔴 +2.5 kB 🔴 +2.2 kB
assets/ComfyQueueButton-BaW2Kpf1.js (removed) 9.22 kB 🟢 -9.22 kB 🟢 -2.5 kB 🟢 -2.2 kB
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-BAAKTpke.js (new) 2.14 kB 🔴 +2.14 kB 🔴 +793 B 🔴 +685 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-zHqDSGHc.js (removed) 2.14 kB 🟢 -2.14 kB 🟢 -794 B 🟢 -689 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-BJchH3cw.js (removed) 848 B 🟢 -848 B 🟢 -472 B 🟢 -424 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-C50eipsR.js (new) 848 B 🔴 +848 B 🔴 +471 B 🔴 +413 B
assets/LazyImage.vue_vue_type_script_setup_true_lang-Wi-CcgaU.js 10.7 kB 10.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-D2s8tnS2.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CtnTx0SP.js 1.72 kB 1.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-DPe6Tcqd.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/keybindingService-e_h6X-Sk.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/serverConfigStore-C5oQ_nzr.js (new) 2.79 kB 🔴 +2.79 kB 🔴 +890 B 🔴 +784 B
assets/serverConfigStore-D2N-YjtJ.js (removed) 2.79 kB 🟢 -2.79 kB 🟢 -891 B 🟢 -774 B
assets/audioService-0BaVO9kv.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +959 B 🔴 +818 B
assets/audioService-Fuj1FK6y.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -962 B 🟢 -825 B

Status: 3 added / 3 removed

Utilities & Hooks — 2.94 kB (baseline 2.94 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-BqekmAyj.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -650 B 🟢 -544 B
assets/audioUtils-C9cYLs2d.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +650 B 🔴 +549 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Vendor & Third-Party — 5.7 MB (baseline 5.7 MB) • 🟢 -21 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-OCBGbKU2.js (removed) 3.59 MB 🟢 -3.59 MB 🟢 -757 kB 🟢 -604 kB
assets/vendor-other-BoVhU9i7.js (new) 3.59 MB 🔴 +3.59 MB 🔴 +757 kB 🔴 +605 kB
assets/vendor-tiptap-CmuD0u4q.js (removed) 232 kB 🟢 -232 kB 🟢 -45.7 kB 🟢 -37.7 kB
assets/vendor-tiptap-DRVeTlfM.js (new) 232 kB 🔴 +232 kB 🔴 +45.7 kB 🔴 +37.7 kB
assets/vendor-vue-Cxtw_GM2.js (new) 92.6 kB 🔴 +92.6 kB 🔴 +23.9 kB 🔴 +20.8 kB
assets/vendor-vue-DhKsTD0i.js (removed) 92.6 kB 🟢 -92.6 kB 🟢 -23.9 kB 🟢 -20.8 kB
assets/vendor-primevue-PESgPnbc.js 517 B 517 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 3 added / 3 removed

Other — 3.87 MB (baseline 3.87 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-Dq1bnB_b.js (removed) 21.9 kB 🟢 -21.9 kB 🟢 -5.52 kB 🟢 -4.87 kB
assets/WidgetRecordAudio-HLcMXNTF.js (new) 21.9 kB 🔴 +21.9 kB 🔴 +5.52 kB 🔴 +4.87 kB
assets/AudioPreviewPlayer-C-uX5MF6.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.69 kB 🔴 +3.3 kB
assets/AudioPreviewPlayer-DTF5tBpQ.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.69 kB 🟢 -3.3 kB
assets/WidgetGalleria-DD-zm8Nv.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.74 kB 🔴 +1.54 kB
assets/WidgetGalleria-Mv3ZjnDb.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.74 kB 🟢 -1.54 kB
assets/WidgetColorPicker-BJQXd9Uk.js (new) 4.87 kB 🔴 +4.87 kB 🔴 +1.69 kB 🔴 +1.48 kB
assets/WidgetColorPicker-BwC4DJ5A.js (removed) 4.87 kB 🟢 -4.87 kB 🟢 -1.69 kB 🟢 -1.48 kB
assets/WidgetMarkdown-BBAcbkYu.js (removed) 4.64 kB 🟢 -4.64 kB 🟢 -1.62 kB 🟢 -1.41 kB
assets/WidgetMarkdown-CWCfVL08.js (new) 4.64 kB 🔴 +4.64 kB 🔴 +1.62 kB 🔴 +1.41 kB
assets/WidgetAudioUI-BXil-ibo.js (removed) 4.33 kB 🟢 -4.33 kB 🟢 -1.44 kB 🟢 -1.29 kB
assets/WidgetAudioUI-SrNW8GXN.js (new) 4.33 kB 🔴 +4.33 kB 🔴 +1.44 kB 🔴 +1.29 kB
assets/WidgetTextarea-BRImVHw1.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/WidgetTextarea-CKJZUVCF.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.34 kB 🔴 +1.2 kB
assets/WidgetInputText-Bt7UTw2T.js (removed) 3.45 kB 🟢 -3.45 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/WidgetInputText-COO-cIAr.js (new) 3.45 kB 🔴 +3.45 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/WidgetToggleSwitch-DVJzDlAS.js (new) 3.23 kB 🔴 +3.23 kB 🔴 +1.14 kB 🔴 +1.02 kB
assets/WidgetToggleSwitch-fhFojMxe.js (removed) 3.23 kB 🟢 -3.23 kB 🟢 -1.14 kB 🟢 -1.01 kB
assets/MediaImageBottom-5iLtd6kq.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.05 kB 🔴 +912 B
assets/MediaImageBottom-DAtZl3pf.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.05 kB 🟢 -922 B
assets/MediaAudioBottom-B9UUcCMH.js (new) 3 kB 🔴 +3 kB 🔴 +1.05 kB 🔴 +923 B
assets/MediaAudioBottom-CQ0YVRHx.js (removed) 3 kB 🟢 -3 kB 🟢 -1.05 kB 🟢 -933 B
assets/Media3DTop-CaNR9gdw.js (new) 3 kB 🔴 +3 kB 🔴 +1.08 kB 🔴 +917 B
assets/Media3DTop-DOiNAOFN.js (removed) 3 kB 🟢 -3 kB 🟢 -1.08 kB 🟢 -912 B
assets/MediaVideoBottom-Ci5_FGXY.js (removed) 3 kB 🟢 -3 kB 🟢 -1.05 kB 🟢 -929 B
assets/MediaVideoBottom-DF2GUc30.js (new) 3 kB 🔴 +3 kB 🔴 +1.04 kB 🔴 +914 B
assets/Media3DBottom-4d8Bi9H9.js (removed) 2.98 kB 🟢 -2.98 kB 🟢 -1.04 kB 🟢 -913 B
assets/Media3DBottom-s28DfVhT.js (new) 2.98 kB 🔴 +2.98 kB 🔴 +1.04 kB 🔴 +919 B
assets/WidgetSelect-BoYtuB3D.js (removed) 2.17 kB 🟢 -2.17 kB 🟢 -675 B 🟢 -576 B
assets/WidgetSelect-CDqi6E4A.js (new) 2.17 kB 🔴 +2.17 kB 🔴 +675 B 🔴 +580 B
assets/WidgetInputNumber-CA65d4l2.js (removed) 2.12 kB 🟢 -2.12 kB 🟢 -664 B 🟢 -558 B
assets/WidgetInputNumber-CfEy93Rp.js (new) 2.12 kB 🔴 +2.12 kB 🔴 +661 B 🔴 +565 B
assets/Load3D-BYOvb4zq.js (new) 1.94 kB 🔴 +1.94 kB 🔴 +596 B 🔴 +498 B
assets/Load3D-uYxAiNff.js (removed) 1.94 kB 🟢 -1.94 kB 🟢 -598 B 🟢 -507 B
assets/WidgetLegacy-CPJlOP0r.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -560 B 🟢 -471 B
assets/WidgetLegacy-DPu1tjzI.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +560 B 🔴 +499 B
assets/MediaImageTop-D74Oj3gx.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +804 B 🔴 +680 B
assets/MediaImageTop-DlKHfEAA.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -805 B 🟢 -687 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-5lOBdqcC.js 84.5 kB 84.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BOCuaVpE.js 73.4 kB 73.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ClrEFGUz.js 72.4 kB 72.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CyNU0iQX.js 99.3 kB 99.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D7gwLxft.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DC8o4BCt.js 86.8 kB 86.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DKiesCV4.js 94.3 kB 94.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Hq2q-OtB.js 83.6 kB 83.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-USAlAlnj.js 82 kB 82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-RTI8pWy9.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BB0lT7C5.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-rDmYEWg5.js 2.39 kB 2.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Ds3K3ULR.js 2.15 kB 2.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 19 added / 19 removed

Copy link

@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: 0

🧹 Nitpick comments (4)
src/locales/en/main.json (1)

2215-2231: cloudNotification i18n block looks good, with one unused key

The new cloudNotification.* strings are consistent with the dialog and badge usage. Note that cloudNotification.badgeTooltip is defined but not used anywhere; either wire it into a tooltip on the badge or remove it to avoid dead i18n keys.

src/platform/settings/constants/coreSettings.ts (1)

291-301: Consider marking CloudNotificationShown as hidden/internal

The new setting id and default are correct, but this flag is effectively internal state (“has seen cloud promo”). To avoid cluttering user-facing settings, consider:

{
  id: 'Comfy.Desktop.CloudNotificationShown',
  name: 'Cloud notification shown',
  type: 'hidden',
  defaultValue: false,
  // optionally: versionAdded: '1.xx.x'
}

If you do intend users to be able to toggle this in the UI (e.g., to re-show/hide the promo), keeping type: 'boolean' is fine, but then it might deserve a more user-friendly name/category.

src/components/topbar/TopbarBadges.vue (1)

3-18: Cloud badge logic works but has redundant state and unused i18n

Functionally, the badge will only render for Electron + macOS once Comfy.Desktop.CloudNotificationShown is true, and clicking it re-opens the cloud dialog. That’s consistent with tying the persistent badge to users who’ve already seen the modal, but it does introduce a few nits:

  • cloudBadge and TopbarBadgeType are only used for v-if="cloudBadge"; the actual label/text/tooltip are hard-coded in the template. Either:
    • Drop cloudBadge and the type import and just use a simpler shouldShowCloudBadge boolean, or
    • Reuse <TopbarBadge :badge="cloudBadge" ...> so the structured badge object actually drives the UI.
  • You define cloudNotification.badgeTooltip in i18n but don’t use it; consider adding a tooltip (e.g., :title="t('cloudNotification.badgeTooltip')" or your existing tooltip directive) or removing the key.
  • Optional: for robustness and tests, you could guard navigator usage, e.g. typeof navigator !== 'undefined' && navigator.platform.toLowerCase().includes('mac').

None of these are blockers, but cleaning them up would simplify the badge implementation and ensure all i18n strings are exercised.

If the intention was to show the badge even for users who have not yet seen the modal, shouldShowCloudBadge should likely not depend on hasShownNotification; please confirm product requirements.

Also applies to: 65-96

src/components/dialog/content/CloudNotificationContent.vue (1)

1-104: Cloud notification dialog content is solid; consider tightening window.open and closeDialog usage

The dialog layout and i18n wiring look good and align with the new cloudNotification.* strings. Two minor polish points:

  • For onExplore, consider using window.open('https://www.comfy.org/cloud', '_blank', 'noopener,noreferrer') (and optionally nulling opener) to avoid exposing window.opener to the new tab.
  • useDialogStore().closeDialog() is called without a key. If the store supports multiple dialogs at once, you may want to pass { key: 'global-cloud-notification' } (or whatever key the service uses) to ensure only this dialog is closed.

Otherwise this component is straightforward and matches the intended UX.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 09c888e and e5ba351.

📒 Files selected for processing (7)
  • src/App.vue (3 hunks)
  • src/components/dialog/content/CloudNotificationContent.vue (1 hunks)
  • src/components/topbar/TopbarBadges.vue (3 hunks)
  • src/locales/en/main.json (1 hunks)
  • src/platform/settings/constants/coreSettings.ts (1 hunks)
  • src/schemas/apiSchema.ts (1 hunks)
  • src/services/dialogService.ts (3 hunks)
⏰ 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). (4)
  • GitHub Check: setup
  • GitHub Check: lint-and-format
  • GitHub Check: test
  • GitHub Check: collect
🔇 Additional comments (3)
src/schemas/apiSchema.ts (1)

368-524: CloudNotificationShown setting schema wired correctly

'Comfy.Desktop.CloudNotificationShown': z.boolean() matches the new core setting id and store usage and keeps the Settings type consistent; no issues here.

src/App.vue (1)

20-21: One-time macOS/Electron notification flow is coherent

Using Comfy.Desktop.CloudNotificationShown to gate showCloudNotification() for isElectron() && isMacOS is consistent and should ensure the modal appears only once per settings store. The async onMounted change is localized to awaiting the settings write, so it won’t affect other initialization paths.

Also applies to: 51-93

src/services/dialogService.ts (1)

5-5: Cloud notification dialog helper integrates cleanly

showCloudNotification() follows the existing dialogService patterns (unique key, simple config, added to the public API) and cleanly decouples callers from dialogStore details. No issues spotted.

Also applies to: 545-553, 555-577

Adds Mixpanel event tracking and UTM parameters to measure:
- Modal impression rate (cloud_notification_modal_shown)
- Click-through rate (cloud_notification_explore_cloud_clicked)
- Dismiss rate (cloud_notification_continue_locally_clicked)
- Badge engagement (cloud_notification_badge_clicked)

UTM parameters enable full funnel tracking:
- Desktop users clicking Explore Cloud
- Cloud website signups with utm_source=desktop
- Subscription conversions attributed to desktop

This enables measurement of the desktop→cloud conversion funnel to validate the 5.6% signup-to-paid conversion rate goal.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
- Fix badge not appearing by accessing settingStore.settingValues directly for proper reactivity
- Increase modal delay to 2s to ensure it appears after missing models dialog
- Move setting update inside setTimeout to only save when modal actually shows

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants