rh-test had UseNewMenu='Top' by default, showing workflow tabs in all tests.
main has UseNewMenu='Disabled' by default, hiding workflow tabs.
Since we pulled snapshots from main, tests were failing due to UI mismatch.
Changing rh-test default to match main fixes snapshot comparisons.
Pull latest snapshot images from main to fix snapshot test failures.
rh-test UI hasn't changed significantly, but main has continued evolving
with UI updates that affected the expected snapshots.
Cloud builds (rh-test) have two initialization blockers for Playwright tests:
1. Firebase auth guard in router waits 16s for auth initialization
- Tests timeout at 15s, causing all tests to fail
- Fix: Skip entire auth guard when DISTRIBUTION !== 'cloud'
- Safe because guard is 100% cloud-specific (Firebase, cloud login, etc.)
2. main.ts calls loadRemoteConfig() which fetches /api/features
- Only triggered when isCloud=true, but still blocks if endpoint missing
- Fix: Mock /api/features in ComfyPage setup, try real backend first
Both issues only affect cloud builds. Playwright builds with DISTRIBUTION='localhost'
so these fixes make tests pass while keeping cloud functionality intact.
Use mode: 'no-cors' when fetching GCS URL to avoid CORS errors.
GCS doesn't have CORS headers, but we don't need to read the response
anyway - opaque response works fine for images/videos/audio.
Removed debug console.log statements.
The await was causing the app to hang on deployment with a white screen
because the service worker registration promise was not resolving.
Changed back to void import() to allow the app to mount immediately
while service worker registration happens in the background.
Backport of #6272 to rh-test
## Summary
Fixes the Pinia initialization error by moving service worker
registration to after Pinia is initialized in the app setup flow.
## Problem
The service worker was being registered before Pinia was initialized,
causing:
```
Error: [🍍]: "getActivePinia()" was called but there was no active Pinia.
```
## Solution
Moved the dynamic import of the service worker to execute after Pinia
setup but before app mounting, while preserving the tree-shaking pattern
for cloud-only builds.
## Test Plan
- [x] Typecheck passes
- [x] Verify service worker registers correctly in cloud build
- [x] Verify no Pinia initialization errors
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6273-backport-rh-test-fix-service-worker-registration-timing-to-run-after-Pinia-setup-6272-2976d73d365081d6bd19fa0f77f66254)
by [Unito](https://www.unito.io)
## Summary
Backport of #6269 to rh-test.
Removes the checkbox from the sign up form to simplify the user
experience.
## Changes
- Removed checkbox field from sign up schema
- Updated `SignUpForm.vue` component
- Kept rh-test-specific auth error display
## Conflict Resolution
Manually resolved merge conflict in `SignUpForm.vue`:
- Removed the checkbox as in main
- Preserved the auth error message section that exists on rh-test
The "By clicking 'Next' or 'Sign Up'..." notice already covers the same
information.
Original commit: b1439be7f0
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6271-backport-rh-test-remove-checkbox-from-sign-up-form-2976d73d36508109ba52eab1c80e787f)
by [Unito](https://www.unito.io)
## Summary
Cleans up the cloud login page by removing redundant UI elements.
## Changes
1. **Removed duplicate signup text**: "Don't have an account yet? Sign
up instead" was appearing twice - once at the top and once at the
bottom. Now it only appears once at the top where it's most visible.
2. **Removed beta banner**: The "Cloud is currently in private beta"
banner at the top of the page has been removed.
## Before/After
**Before:**
- Beta banner at top
- "Don't have an account yet?" at top
- Form in middle
- "Don't have an account yet?" again at bottom (duplicate)
**After:**
- "Don't have an account yet?" at top only
- Form in middle
- Contact info at bottom
The page is now cleaner and less repetitive.
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6270-ux-clean-up-cloud-login-page-remove-duplicate-signup-text-and-beta-banner-2976d73d365081c5a7a5c15dd426317d)
by [Unito](https://www.unito.io)
## Summary
Fixes queue history reconciliation broken by cloud distribution removing
the `priority` field from task items.
## Problem
The reconciliation logic in `queueStore.ts` was using the `priority`
field to determine which existing history items to keep:
- Created a Set of all `priority` values from server history
- Filtered local history items to keep only those whose `queueIndex`
(priority) exists in server
Since cloud does not have unique `priority` fields, reconciliation was
failing completely - which could be reproduced with the steps:
* Clear all tasks
* Run 2 jobs and let complete
* Delete one
* Check the refresh (GET history) triggered by queueStore.update
* response will only have 1 item
* Queue panel will still show 2, since it's checking which of the
previous (existing state) priorrity (queue_index) are in the new (new
state)
## Solution
Changed reconciliation to use `prompt_id` instead of `priority`:
- `allIndex` now uses `prompt_id` (string) instead of `priority`
(number)
- `existingHistoryItems` filter now checks `item.promptId` instead of
`item.queueIndex`
## Notes
- This fix is separate from deduplication (already uses `prompt_id`) and
sorting (uses timestamps)
- `prompt_id` is a stable, unique identifier that always exists
- Typecheck passed
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6263-bugfix-fix-queue-history-reconciliation-to-use-prompt_id-instead-of-priority-2966d73d365081709480d2132905116a)
by [Unito](https://www.unito.io)
## Summary
Backport of #6139 to `rh-test` branch.
Added Service Worker to inject Firebase auth headers into browser-native
`/api/view` requests (img, video, audio tags) for cloud distribution.
## Changes
- **What**: Implemented [Service
Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)
to intercept and authenticate media requests that cannot natively send
custom headers
- **Dependencies**: None (uses native Service Worker API)
## Implementation Details
**Tree-shaking**: Uses compile-time `isCloud` constant - completely
removed from localhost/desktop builds (verified via bundle analysis).
**Caching**: 50-minute auth header cache with automatic invalidation on
login/logout to prevent redundant token fetches.
## Backport Notes
- Resolved merge conflict in `src/main.ts` where remote config loading
logic was added on `rh-test`
- Preserved the CRITICAL comment about loading remote config first
- All files from original commit included
- Typecheck passed successfully
Original commit: 26f587c956
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6259-backport-rh-test-add-service-worker-on-cloud-distribution-to-attach-auth-header-to-brow-2966d73d365081b39cdac969b6c24d0d)
by [Unito](https://www.unito.io)
## Summary
- Fixed duplicate verification email issue where emails were sent every
time users returned to the root page
- Emails are now only sent automatically when coming from signup/login
flow
- Added proper toast notifications to cloud onboarding pages
## Changes
- **Conditional email sending**: Only send verification email when
`fromAuth=true` query parameter is present (from signup/login flow)
- **Auto-cleanup**: Remove `fromAuth` parameter after sending email to
prevent re-sending on page refresh
- **Toast system fix**:
- Added `GlobalToast` component to `CloudLayoutView` for proper toast
display in onboarding pages
- Migrated from PrimeVue `useToast()` to ComfyUI's `useToastStore()`
- **UI improvements**:
- Better spacing and layout for email verification page
- Added multiline support for tips and instructions
- Improved toast messages with clearer titles and summaries
## Problem it solves
Previously, when users signed up and received a verification email,
every time they navigated back to the root page (`/`), the router guard
would redirect them to the email verification page which would
automatically send another email. This caused multiple emails to be
sent, often ending up in spam folders.
## Test plan
- [x] Sign up for a new account → Should receive ONE verification email
- [x] Navigate away and back to root → Should NOT receive another email
- [x] Click "Resend email" button → Should receive a new email
- [x] Refresh the verification page → Should NOT receive another email
- [x] Toast notifications appear correctly in all auth flows
[screen-capture
(1).webm](https://github.com/user-attachments/assets/25ffad94-d129-4051-b29e-5bdec696cd11)
## Summary
- Complete telemetry implementation with circular dependency fix
- Add build performance optimizations from main branch
### Telemetry Features
- ✅ Final telemetry events: signup opened, survey flow, email
verification
- ✅ Onboarding mode to prevent circular dependencies during app
initialization
- ✅ Lazy composable loading with dynamic imports for workflow tracking
- ✅ Survey responses as both event properties and persistent user
properties
- ✅ User identification method for onboarding flow
- ✅ Deferred user property setting until user is authenticated
### Performance Optimizations
- ✅ Tree-shaking enabled to remove unused code
- ✅ Manual chunk splitting for vendor libraries (primevue, vue, tiptap,
chart.js, etc.)
- ✅ Enhanced esbuild minification with console removal in production
builds
- ✅ GENERATE_SOURCEMAP environment variable control
- ✅ Maintained ImportMap disabled for cloud performance
## Test plan
- [x] Telemetry events track correctly in Mixpanel
- [x] No circular dependency errors on app startup
- [x] Survey responses appear as both event properties and user
properties
- [x] Build optimizations reduce bundle size and improve loading
performance
- [x] All lint/format/typecheck passes
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6158-track-cloud-specific-onboarding-events-and-add-performance-optimizations-for-hosted-cloud-2926d73d365081a7b533dde249d5f734)
by [Unito](https://www.unito.io)
---------
Co-authored-by: Claude <noreply@anthropic.com>
## Summary
Backport of PR #6144 to the `rh-test` branch.
This adds build time feature flags system starting with a flag that
indicates whether subscription is required to use the app. This is only
used on cloud.
## Changes
- Added build feature flags system via `__BUILD_FLAGS__` global
- Added `REQUIRE_SUBSCRIPTION` flag that can be set via environment
variable
- Conditionally load subscription-related components based on the flag
- Updated run button logic to respect the subscription requirement flag
- Updated settings UI to show subscription panel only when required
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6147-Backport-make-require-subscription-toggleable-in-build-to-rh-test-2916d73d365081e89bcfc4502315a812)
by [Unito](https://www.unito.io)
## Summary
Backport of #6064 (subscription page) to the `rh-test` branch.
This PR manually cherry-picks commit
7e1e8e3b65 to the rh-test branch and
resolves merge conflicts that prevented automatic backporting.
## Conflicts Resolved
### 1. `src/components/actionbar/ComfyActionbar.vue`
- **Conflict**: HEAD (rh-test) used `<ComfyQueueButton />` while the
subscription PR introduced `<ComfyRunButton />`
- **Resolution**: Updated to use `<ComfyRunButton />` to include the
subscription functionality wrapper while maintaining the existing
rh-test template structure
### 2. `src/composables/auth/useFirebaseAuthActions.ts`
- **Conflict**: Simple ordering difference in the return statement
- **Resolution**: Used the subscription PR's ordering: `deleteAccount,
accessError, reportError`
## Testing
The cherry-pick completed successfully and passed all pre-commit hooks:
- ✅ ESLint
- ✅ Prettier formatting
- ⚠️ Note: 2 unused i18n keys detected (informational only, same as
original PR)
## Related
- Original PR: #6064
- Cherry-picked commit: 7e1e8e3b65
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6140-backport-subscription-page-to-rh-test-2916d73d365081f38f00df422004f61a)
by [Unito](https://www.unito.io)
Co-authored-by: Terry Jia <terryjia88@gmail.com>
Co-authored-by: GitHub Action <action@github.com>
## 🎯 Summary
Improves the user experience for already authenticated users when
accessing invite links by skipping the unnecessary login step.
## 📋 Changes
### Modified CloudInviteEntryView.vue
- Added authentication check on component mount
- Implemented conditional routing based on authentication status:
- **Not authenticated**: Routes to login page (original behavior)
- **Authenticated but email not verified**: Routes to email verification
- **Authenticated and verified with invite code**: Routes to invite
check page
- **Authenticated and verified without invite code**: Routes to user
check page
## 🔍 Impact
- **Before**: All users were redirected to login page, even if already
logged in
- **After**: Authenticated users skip login and go directly to the
appropriate next step
[invite-code-entry.webm](https://github.com/user-attachments/assets/79ea13cd-c7ba-4ff7-b755-cd62ecef91eb)
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6113-Skip-login-step-for-authenticated-users-in-invite-flow-28f6d73d3650813ba635fc74c7fe445b)
by [Unito](https://www.unito.io)
Co-authored-by: Claude <noreply@anthropic.com>
## Summary
- Display signed-in user email in waitlist view for better user clarity
- Add switch accounts option for users on waitlist to change their
account
- Simplify claim invite view by removing avatar box and reorganizing
layout
## Changes Made
### CloudWaitlistView.vue
- Added display of signed-in user email
- Added "Switch accounts" option with navigation to cloud-login
- Improved visual hierarchy and styling for better readability
### CloudClaimInviteView.vue
- Removed avatar box component to simplify UI
- Moved "Switch accounts" link below user info section
- Reorganized layout for better flow
## Test Plan
- [ ] Verify waitlist view displays signed-in user email correctly
- [ ] Test "Switch accounts" navigation works in both views
- [ ] Confirm visual changes display properly in both light/dark themes
- [ ] Ensure no regressions in cloud onboarding flow
🤖 Generated with [Claude Code](https://claude.ai/code)
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6071-fix-Improve-cloud-waitlist-view-UX-with-signed-in-user-display-28d6d73d365081618c19cfb56f4a12b6)
by [Unito](https://www.unito.io)
Co-authored-by: Claude <noreply@anthropic.com>
## Summary
- Removed the "Don't have an account? Sign up" link from the
CloudLoginView when users access the page with an invite code (from
invite link in email)
- The signup option now only shows when there's no invite code present
## Changes
- Modified `CloudLoginView.vue` to conditionally show the signup text
only when `!hasInviteCode`
- Used `<template>` wrapper for better conditional rendering
## Why this change?
Users coming from an invite email link should focus on logging in with
their existing account rather than being presented with a signup option,
as they've already been invited to join.
Fixes the UX issue where invited users might get confused by seeing a
signup option when they should be logging in with their invited account.
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6070-chore-Remove-signup-option-on-invite-page-when-using-invite-code-28d6d73d365081e29ac7d58140b2079f)
by [Unito](https://www.unito.io)
## Summary
Improve cloud onboarding flow by adding email verification polling and
fixing signup auto-logout issue.
## Changes
- **What**:
- Add polling mechanism to automatically check email verification status
every 5 seconds on the verify email page
- Fix auto-logout issue after signup by redirecting to root instead of
login page
- Remove automatic logout on login page mount to preserve user session
after signup
- **Breaking**: None
- **Dependencies**: None
## Review Focus
- Email verification polling implementation uses Firebase Auth's
`reload()` method to refresh user state
- Polling stops after 5 minutes to prevent indefinite resource usage
- Proper cleanup of intervals/timeouts in `onUnmounted` hook to prevent
memory leaks
- Signup flow now maintains user session instead of forcing re-login
## User Experience Improvements
1. **Before**: Users had to manually refresh the page after clicking
email verification link
**After**: Page automatically detects verification and proceeds to next
step
2. **Before**: After signup, users were redirected to login page and
automatically logged out, requiring them to sign in again
**After**: Users stay logged in after signup and are redirected to root,
maintaining their session
## Testing
- Tested email verification polling with both verified and unverified
states
- Verified that invite codes are preserved throughout the flow
- Confirmed no memory leaks from polling intervals
- Tested signup flow with email/password authentication
## Related Issues
- Resolves user complaints about having to sign in twice during signup
flow
- Addresses email verification page not auto-advancing after
verification
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6030-fix-Improve-cloud-onboarding-UX-with-email-verification-polling-and-signup-flow-28a6d73d365081be8020caee6337c3e7)
by [Unito](https://www.unito.io)
## Summary
<!-- One sentence describing what changed and why. -->
## Changes
- **What**: <!-- Core functionality added/modified -->
- **Breaking**: <!-- Any breaking changes (if none, remove this line)
-->
- **Dependencies**: <!-- New dependencies (if none, remove this line)
-->
## Review Focus
<!-- Critical design decisions or edge cases that need attention -->
<!-- If this PR fixes an issue, uncomment and update the line below -->
<!-- Fixes #ISSUE_NUMBER -->
## Screenshots (if applicable)
<!-- Add screenshots or video recording to help explain your changes -->
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6043-Comfy-Cloud-Badge-indicator-28b6d73d365081b8b549ecc3beb2c132)
by [Unito](https://www.unito.io)
## Summary
Fixes browser tab progress and favicon remaining at ~14% after workflow
completion on `rh-test` by resetting execution state on success, error,
or interruption.
## Changes
- Add `execution_success` listener in the execution store
- Centralize terminal-state cleanup in `resetExecutionState()`
- Clear `nodeProgressStates`, queued prompt entry,
`_executingNodeProgress`, and set `activePromptId` to `null`
- Ensures `isIdle` becomes `true` post-run so tab title and favicon no
longer freeze mid-progress
Resolves#6024
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6025-fix-execution-reset-progress-state-after-runs-to-unfreeze-tab-title-favicon-2896d73d365081fc8849f3814f524d41)
by [Unito](https://www.unito.io)
- Add @ts-expect-error directive to unused postSurveyStatus function in auth.ts
- Add @ts-expect-error for .mts import extension in vite.electron.config.mts
- Add @ts-expect-error directives for global variable assignments in vitest.setup.ts
- Remove vite.electron.config.mts from ESLint allowDefaultProject to fix duplicate inclusion error