feat: follow --comfy-api-base for staging and preview backends#13054
feat: follow --comfy-api-base for staging and preview backends#13054bigcat88 wants to merge 1 commit into
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughRemote config bootstrapping in ChangesRemote-config-first initialization and URL resolution
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 7✅ Passed checks (7 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1686 passed, 0 failed · 2 flaky📊 Browser Reports
📦 Bundle: 7.54 MB gzip 🔴 +313 BDetailsSummary
Category Glance App Entry Points — 46.9 kB (baseline 46.9 kB) • 🔴 +41 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.25 MB (baseline 1.25 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 97.5 kB (baseline 97.5 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 12 added / 12 removed Panels & Settings — 516 kB (baseline 516 kB) • 🔴 +314 BConfiguration panels, inspectors, and settings screens
Status: 15 added / 15 removed / 11 unchanged User & Accounts — 20 kB (baseline 20 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 8 added / 8 removed / 2 unchanged Editors & Dialogs — 112 kB (baseline 112 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 5 added / 5 removed UI Components — 65.2 kB (baseline 65.2 kB) • ⚪ 0 BReusable component library chunks
Status: 13 added / 13 removed / 1 unchanged Data & Services — 269 kB (baseline 269 kB) • ⚪ 0 BStores, services, APIs, and repositories
Status: 15 added / 15 removed / 1 unchanged Utilities & Hooks — 3.34 MB (baseline 3.34 MB) • 🟢 -99 BHelpers, composables, and utility bundles
Status: 25 added / 25 removed / 7 unchanged Vendor & Third-Party — 15.3 MB (baseline 15.3 MB) • ⚪ 0 BExternal libraries and shared vendor chunks
Status: 7 added / 7 removed / 9 unchanged Other — 10.7 MB (baseline 10.7 MB) • ⚪ 0 BBundles that do not match a named category
Status: 106 added / 106 removed / 55 unchanged ⚡ Performance Report
✅ No regressions detected. All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-06-25T18:15:19.056Z",
"gitSha": "ba1dfba3fdc0e4a79ca6b37c001bd2ec82be2360",
"branch": "feat/ephemeral-env-features",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2056.9230000000402,
"styleRecalcs": 6,
"styleRecalcDurationMs": 5.487999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 437.75,
"heapDeltaBytes": -7987100,
"heapUsedBytes": 61178508,
"domNodes": -294,
"jsHeapTotalBytes": 19832832,
"scriptDurationMs": 13.346000000000004,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2052.5139999999737,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.934000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 375.53399999999993,
"heapDeltaBytes": 13187552,
"heapUsedBytes": 65253684,
"domNodes": -268,
"jsHeapTotalBytes": 16117760,
"scriptDurationMs": 16.762,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1807.8160000000025,
"styleRecalcs": 75,
"styleRecalcDurationMs": 35.54,
"layouts": 12,
"layoutDurationMs": 3.2509999999999994,
"taskDurationMs": 761.428,
"heapDeltaBytes": -12977972,
"heapUsedBytes": 56283464,
"domNodes": -240,
"jsHeapTotalBytes": 19046400,
"scriptDurationMs": 113.93900000000001,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1776.7489999999952,
"styleRecalcs": 73,
"styleRecalcDurationMs": 32.821999999999996,
"layouts": 12,
"layoutDurationMs": 3.658,
"taskDurationMs": 733.835,
"heapDeltaBytes": -2526652,
"heapUsedBytes": 48657736,
"domNodes": -266,
"jsHeapTotalBytes": 16117760,
"scriptDurationMs": 109.68599999999999,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1725.0290000000064,
"styleRecalcs": 31,
"styleRecalcDurationMs": 16.425,
"layouts": 6,
"layoutDurationMs": 0.6179999999999999,
"taskDurationMs": 336.56199999999995,
"heapDeltaBytes": -4099120,
"heapUsedBytes": 65119040,
"domNodes": -227,
"jsHeapTotalBytes": 12754944,
"scriptDurationMs": 16.787,
"eventListeners": -184,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1708.1650000000081,
"styleRecalcs": 30,
"styleRecalcDurationMs": 14.886999999999999,
"layouts": 6,
"layoutDurationMs": 0.541,
"taskDurationMs": 269.093,
"heapDeltaBytes": 4843660,
"heapUsedBytes": 62750584,
"domNodes": 77,
"jsHeapTotalBytes": 19136512,
"scriptDurationMs": 16.779999999999998,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 595.2670000000353,
"styleRecalcs": 12,
"styleRecalcDurationMs": 9.014999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 382.033,
"heapDeltaBytes": -22708376,
"heapUsedBytes": 46583636,
"domNodes": -279,
"jsHeapTotalBytes": 5152768,
"scriptDurationMs": 55.056,
"eventListeners": -203,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 526.9939999999451,
"styleRecalcs": 13,
"styleRecalcDurationMs": 8.659,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 327.031,
"heapDeltaBytes": 12228884,
"heapUsedBytes": 69853172,
"domNodes": 22,
"jsHeapTotalBytes": 18612224,
"scriptDurationMs": 56.689,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666682,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2049.004000000025,
"styleRecalcs": 9,
"styleRecalcDurationMs": 10.815,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 505.3510000000001,
"heapDeltaBytes": -9893784,
"heapUsedBytes": 57509100,
"domNodes": -270,
"jsHeapTotalBytes": -1298432,
"scriptDurationMs": 85.047,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2034.5109999999522,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.915,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 500.359,
"heapDeltaBytes": -10144380,
"heapUsedBytes": 57220712,
"domNodes": -267,
"jsHeapTotalBytes": -1822720,
"scriptDurationMs": 83.51700000000001,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2100.977999999998,
"styleRecalcs": 69,
"styleRecalcDurationMs": 16.742,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 992.455,
"heapDeltaBytes": 12432200,
"heapUsedBytes": 81118724,
"domNodes": -272,
"jsHeapTotalBytes": -1880064,
"scriptDurationMs": 384.369,
"eventListeners": -197,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2116.029000000026,
"styleRecalcs": 69,
"styleRecalcDurationMs": 17.436999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1058.341,
"heapDeltaBytes": 13525640,
"heapUsedBytes": 82023240,
"domNodes": -272,
"jsHeapTotalBytes": -1355776,
"scriptDurationMs": 418.192,
"eventListeners": -197,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3044.5049999999583,
"styleRecalcs": 64,
"styleRecalcDurationMs": 15.996999999999998,
"layouts": 60,
"layoutDurationMs": 6.8839999999999995,
"taskDurationMs": 1207.247,
"heapDeltaBytes": 12591080,
"heapUsedBytes": 67962324,
"domNodes": 10,
"jsHeapTotalBytes": 1310720,
"scriptDurationMs": 479.57,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3072.3860000000514,
"styleRecalcs": 64,
"styleRecalcDurationMs": 16.257,
"layouts": 60,
"layoutDurationMs": 6.902000000000001,
"taskDurationMs": 1174.347,
"heapDeltaBytes": 11906476,
"heapUsedBytes": 67056656,
"domNodes": 10,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 452.532,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2016.0570000000462,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.831,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 464.54599999999994,
"heapDeltaBytes": 11053820,
"heapUsedBytes": 70171476,
"domNodes": 16,
"jsHeapTotalBytes": 6029312,
"scriptDurationMs": 85.988,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2010.0259999999253,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.571999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 472.117,
"heapDeltaBytes": -8634128,
"heapUsedBytes": 65216600,
"domNodes": 18,
"jsHeapTotalBytes": 7745536,
"scriptDurationMs": 85.778,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 571.9899999999711,
"styleRecalcs": 47,
"styleRecalcDurationMs": 11.511,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 385.2060000000001,
"heapDeltaBytes": -21909380,
"heapUsedBytes": 47371752,
"domNodes": -275,
"jsHeapTotalBytes": 4890624,
"scriptDurationMs": 118.516,
"eventListeners": -197,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 543.4179999999742,
"styleRecalcs": 48,
"styleRecalcDurationMs": 11.161,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 336.26,
"heapDeltaBytes": 8055020,
"heapUsedBytes": 66856936,
"domNodes": 22,
"jsHeapTotalBytes": 20447232,
"scriptDurationMs": 114.55799999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-idle",
"durationMs": 2038.755999999978,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.685,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 376.14799999999997,
"heapDeltaBytes": -8253816,
"heapUsedBytes": 60988352,
"domNodes": -277,
"jsHeapTotalBytes": 20357120,
"scriptDurationMs": 12.771999999999998,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2008.2159999999476,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.160999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 367.359,
"heapDeltaBytes": -1493108,
"heapUsedBytes": 50993108,
"domNodes": -288,
"jsHeapTotalBytes": 17690624,
"scriptDurationMs": 12.062,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1725.9520000000066,
"styleRecalcs": 75,
"styleRecalcDurationMs": 33.665,
"layouts": 16,
"layoutDurationMs": 4.91,
"taskDurationMs": 667.299,
"heapDeltaBytes": 16965968,
"heapUsedBytes": 69532972,
"domNodes": -268,
"jsHeapTotalBytes": 14282752,
"scriptDurationMs": 86.524,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1725.608999999963,
"styleRecalcs": 77,
"styleRecalcDurationMs": 33.989000000000004,
"layouts": 16,
"layoutDurationMs": 3.888,
"taskDurationMs": 633.17,
"heapDeltaBytes": -10237232,
"heapUsedBytes": 48724632,
"domNodes": 63,
"jsHeapTotalBytes": 25690112,
"scriptDurationMs": 85.57900000000001,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-transition-enter",
"durationMs": 915.9250000000156,
"styleRecalcs": 17,
"styleRecalcDurationMs": 26.285999999999998,
"layouts": 5,
"layoutDurationMs": 11.66,
"taskDurationMs": 680.2520000000001,
"heapDeltaBytes": 3875152,
"heapUsedBytes": 80301992,
"domNodes": 13833,
"jsHeapTotalBytes": 12582912,
"scriptDurationMs": 24.846999999999994,
"eventListeners": 2533,
"totalBlockingTimeMs": 143,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "viewport-pan-sweep",
"durationMs": 8120.127999999966,
"styleRecalcs": 251,
"styleRecalcDurationMs": 50.569,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3430.117,
"heapDeltaBytes": -16601832,
"heapUsedBytes": 68232244,
"domNodes": -264,
"jsHeapTotalBytes": 7643136,
"scriptDurationMs": 1182.65,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8159.153999999944,
"styleRecalcs": 250,
"styleRecalcDurationMs": 50.437000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3421.29,
"heapDeltaBytes": -17038580,
"heapUsedBytes": 67984916,
"domNodes": -265,
"jsHeapTotalBytes": 5283840,
"scriptDurationMs": 1184.496,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333338,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 10693.097000000023,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 10679.300000000001,
"heapDeltaBytes": -47461532,
"heapUsedBytes": 170303756,
"domNodes": -3300,
"jsHeapTotalBytes": 6815744,
"scriptDurationMs": 551.2479999999999,
"eventListeners": -16464,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 10788.036000000033,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 10776.893000000002,
"heapDeltaBytes": -20078792,
"heapUsedBytes": 168540788,
"domNodes": -3300,
"jsHeapTotalBytes": 11796480,
"scriptDurationMs": 532.0780000000001,
"eventListeners": -16466,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 14001.764999999978,
"styleRecalcs": 65,
"styleRecalcDurationMs": 15.519000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13982.553000000002,
"heapDeltaBytes": -54070604,
"heapUsedBytes": 157665384,
"domNodes": -3300,
"jsHeapTotalBytes": 4194304,
"scriptDurationMs": 840.1379999999999,
"eventListeners": -16464,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 13934.680999999955,
"styleRecalcs": 66,
"styleRecalcDurationMs": 15.825000000000006,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13916.146999999999,
"heapDeltaBytes": -2038148,
"heapUsedBytes": 180840564,
"domNodes": -3303,
"jsHeapTotalBytes": 20594688,
"scriptDurationMs": 823.221,
"eventListeners": -16472,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "workflow-execution",
"durationMs": 498.11399999998685,
"styleRecalcs": 17,
"styleRecalcDurationMs": 26.443999999999996,
"layouts": 5,
"layoutDurationMs": 1.435,
"taskDurationMs": 158.924,
"heapDeltaBytes": -1587324,
"heapUsedBytes": 51420896,
"domNodes": -120,
"jsHeapTotalBytes": -659456,
"scriptDurationMs": 18.104999999999997,
"eventListeners": -134,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "workflow-execution",
"durationMs": 455.8469999999488,
"styleRecalcs": 18,
"styleRecalcDurationMs": 22.352,
"layouts": 5,
"layoutDurationMs": 1.223,
"taskDurationMs": 106.14999999999999,
"heapDeltaBytes": 5161144,
"heapUsedBytes": 64987632,
"domNodes": 159,
"jsHeapTotalBytes": 2883584,
"scriptDurationMs": 15.385000000000002,
"eventListeners": 69,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.663333333333338,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #13054 +/- ##
==========================================
- Coverage 76.52% 76.49% -0.04%
==========================================
Files 1620 1620
Lines 106307 105857 -450
Branches 34108 33993 -115
==========================================
- Hits 81355 80977 -378
+ Misses 24106 24043 -63
+ Partials 846 837 -9
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 22 files with indirect coverage changes 🚀 New features to boost your workflow:
|
b2a6f3c to
9540f5a
Compare
9540f5a to
cf743ef
Compare
|
@CodeJuggernaut thank you, this was a really thorough review and two of these were genuine bugs, so I appreciate the care. It is all addressed in the latest commits. |
|
You're welcome. I re-checked the latest commits, and both bug fixes are spot on, so I'm approving this PR. |
184b099
184b099 to
a66f9af
Compare
|
✅ All contributors have signed the CLA. Thank you! This PR is ready to be merged. |
|
I have read and agree to the Contributor License Agreement |
christian-byrne
left a comment
There was a problem hiding this comment.
This seems fine but can we just make it a pass through in this case? That is, move the config values to the given backends and send them normally rather than inferring the config set from the single api base argument? I.e., have local also send the full /features payload with all the config values. Or am I missing something?
7dfe0fd to
e2f116b
Compare
Read the api and platform base from /features (remoteConfig) for all builds, and pick the dev Firebase project when the api base is staging-tier, so a prod bundle can talk to a staging or preview backend without a rebuild.
e2f116b to
dd80f74
Compare
Summary
Let the running ComfyUI server decide which backend the web UI talks to (and which Firebase project it signs you into), so launching with
--comfy-api-basejust works with the regular bundled frontend.Changes
/api/featureson every build (not just cloud) and treats the server'scomfy_api_base_url/comfy_platform_base_urlas authoritative, falling back to the build-time defaults.When that api base is a staging-tier host (staging, or a
*.testenvs.comfy.orgpreview env) and the server hasn't supplied its own Firebase config, the frontend picks the dev Firebase project, derived from the api base.Production is left exactly as it is today.
main.ts: load remote config first thing, before Firebase initializes, so every module sees the right values from the first renderconfig/comfyApi.ts: the api/platform getters now read the server's values on all distributionsconfig/firebase.ts:getFirebaseConfig()resolves in order: a server-provided config first (cloud), then the dev project for a staging-tier api base, then the build-time defaultplatform/remoteConfig/refreshRemoteConfig.ts: the startup fetch now has a 5s timeout, so a slow or wedged/featurescan never keep the app from mounting; on failure we fall back to the build-time defaults/featuresoverrides (production and ordinary self-hosting), behavior is unchangedReview Focus
getFirebaseConfig()(config/firebase.ts): server config first, then the staging-tier dev project, then the build-time default. The staging-tier check matchesstagingapi.comfy.organd any*.testenvs.comfy.orghost, and falls back to build-time for anything it can't parse.refreshRemoteConfig()unconditionally and first inmain.ts, with the new fetch timeout as the safety net.Testing
I tested every case by hand, locally, on top of the automated checks.
Tested both with
pnpm run buildandUSE_PROD_CONFIG=true pnpm buildand running Comfy from that folder.Pointed a local ComfyUI at each backend with
--comfy-api-baseand signed in with Google each time:https://api.comfy.org): stays on production and signs into the production Firebase project, identical to today.https://stagingapi.comfy.org): follows it and signs into the dev project.https://pr-<n>.testenvs.comfy.org): the friendly host is accepted as-is, the frontend follows it, lands in the dev project, and Google sign-in completes.The only exception where fronted does not respect the
--comfy-api-baseis when Comfy runs againstprodand frontend runs with thepnpm run dev- due to overridden config(this is expected behavior).Supersedes: #12560
Companion Core PR: Comfy-Org/ComfyUI#14569
Screenshots (if applicable)