feat: workflow sharing and ComfyHub publish flow (#8951)

## Summary

Add workflow sharing by URL and a multi-step ComfyHub publish wizard,
gated by feature flags and an optional profile gate.

## Changes

- **What**: Share dialog with URL generation and asset warnings;
ComfyHub publish wizard (Describe → Examples → Finish) with thumbnail
upload and tags; profile gate flow; shared workflow URL loader with
confirmation dialog
- **Dependencies**: None (new `sharing/` module under
`src/platform/workflow/`)

## Review Focus

- Three new feature flags: `workflow_sharing_enabled`,
`comfyhub_upload_enabled`, `comfyhub_profile_gate_enabled`
- Share service API contract and stale-share detection
(`workflowShareService.ts`)
- Publish wizard and profile gate state management
- Shared workflow URL loading and query-param preservation

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8951-feat-share-workflow-by-URL-30b6d73d3650813ebbfafdad775bfb33)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Alexander Brown
2026-03-05 16:33:06 -08:00
committed by GitHub
parent 6c2680f0ba
commit 1bac5d9bdd
71 changed files with 6448 additions and 598 deletions

View File

@@ -2998,7 +2998,131 @@
"actionbar": {
"dockToTop": "Dock to top",
"feedback": "Feedback",
"feedbackTooltip": "Feedback"
"feedbackTooltip": "Feedback",
"share": "Share",
"shareTooltip": "Share workflow"
},
"shareWorkflow": {
"shareLinkTab": "Share",
"publishToHubTab": "Publish",
"loadingTitle": "Share workflow",
"unsavedTitle": "Save workflow first",
"unsavedDescription": "You must save your workflow before sharing. Save it now to continue.",
"saveButton": "Save workflow",
"saving": "Saving...",
"workflowNameLabel": "Workflow name",
"createLinkTitle": "Share workflow",
"createLinkDescription": "When you create a link for your workflow, you will share these media items along with your workflow",
"privateAssetsDescription": "Your workflow contains private models and/or media files",
"createLinkButton": "Create a link",
"creatingLink": "Creating a link...",
"successTitle": "Workflow successfully published!",
"successDescription": "Anyone with this link can view and use this workflow. If you make changes to this workflow, you can republish to update the shared version.",
"hasChangesTitle": "Share workflow",
"hasChangesDescription": "You have made changes since this workflow was last published.",
"updateLinkButton": "Update link",
"updatingLink": "Updating link...",
"publishedOn": "Published on {date}",
"copyLink": "Copy",
"linkCopied": "Copied!",
"shareUrlLabel": "Share URL",
"loadFailed": "Failed to load shared workflow",
"saveFailedTitle": "Save failed",
"saveFailedDescription": "Failed to save workflow. Please try again.",
"mediaLabel": "{count} Media File | {count} Media Files",
"modelsLabel": "{count} Model | {count} Models",
"checkingAssets": "Checking media visibility…",
"acknowledgeCheckbox": "I understand these media items will be published and made public",
"inLibrary": "In library",
"comfyHubTitle": "Upload to ComfyHub",
"comfyHubDescription": "ComfyHub is ComfyUI's official community hub.\nYour workflow will have a public page viewable by all.",
"comfyHubButton": "Upload to ComfyHub"
},
"openSharedWorkflow": {
"dialogTitle": "Open shared workflow",
"author": "Author:",
"copyDescription": "Opening the workflow will create a new copy in your workspace",
"nonPublicAssetsWarningLine1": "This workflow comes with non-public assets.",
"nonPublicAssetsWarningLine2": "These will be imported to your library when you open the workflow",
"copyAssetsAndOpen": "Import assets & open workflow",
"openWorkflow": "Open workflow",
"openWithoutImporting": "Open without importing",
"importFailed": "Failed to import workflow assets",
"loadError": "Could not load this shared workflow. Please try again later."
},
"comfyHubPublish": {
"title": "Publish to ComfyHub",
"stepDescribe": "Describe your workflow",
"stepExamples": "Add output examples",
"stepFinish": "Finish publishing",
"workflowName": "Workflow name",
"workflowNamePlaceholder": "Tip: enter a descriptive name that's easy to search",
"workflowDescription": "Workflow description",
"workflowDescriptionPlaceholder": "What makes your workflow exciting and special? Be specific so people know what to expect.",
"workflowType": "Workflow type",
"workflowTypePlaceholder": "Select the type",
"workflowTypeImageGeneration": "Image generation",
"workflowTypeVideoGeneration": "Video generation",
"workflowTypeUpscaling": "Upscaling",
"workflowTypeEditing": "Editing",
"tags": "Tags",
"tagsDescription": "Select tags so people can find your workflow faster",
"tagsPlaceholder": "Enter tags that match your workflow to help people find it e.g #nanobanana, #anime or #faceswap",
"selectAThumbnail": "Select a thumbnail",
"showMoreTags": "Show more...",
"showLessTags": "Show less...",
"suggestedTags": "Suggested tags",
"thumbnailImage": "Image",
"thumbnailVideo": "Video",
"thumbnailImageComparison": "Image comparison",
"uploadThumbnail": "Upload an image",
"uploadVideo": "Upload a video",
"uploadComparison": "Upload before and after",
"thumbnailPreview": "Thumbnail preview",
"uploadPromptClickToBrowse": "Click to browse or",
"uploadPromptDropImage": "drop an image here",
"uploadPromptDropVideo": "drop a video here",
"uploadComparisonBeforePrompt": "Before",
"uploadComparisonAfterPrompt": "After",
"uploadThumbnailHint": "1:1 preferred, 1080p max",
"back": "Back",
"next": "Next",
"publishButton": "Publish to ComfyHub",
"examplesDescription": "Add up to {total} additional sample images",
"uploadAnImage": "Click to browse or drag an image",
"uploadExampleImage": "Upload example image",
"exampleImage": "Example image {index}",
"videoPreview": "Video thumbnail preview",
"maxExamples": "You can select up to {max} examples",
"createProfileToPublish": "Create a profile to publish to ComfyHub",
"createProfileCta": "Create a profile"
},
"comfyHubProfile": {
"checkingAccess": "Checking your publishing access...",
"profileCreationNav": "Profile creation",
"introTitle": "Publish to the ComfyHub",
"introDescription": "Publish your workflows, build your portfolio and get discovered by millions of users",
"introSubtitle": "To share your workflow on ComfyHub, let's first create your profile.",
"createProfileButton": "Create my profile",
"startPublishingButton": "Start publishing",
"modalTitle": "Create your profile on ComfyHub",
"createProfileTitle": "Create your Comfy Hub profile",
"uploadCover": "+ Upload a cover",
"uploadProfilePicture": "+ Upload a profile picture",
"chooseProfilePicture": "Choose a profile picture",
"nameLabel": "Your name",
"namePlaceholder": "Enter your name here",
"usernameLabel": "Your username (required)",
"usernamePlaceholder": "@",
"descriptionLabel": "Your description",
"descriptionPlaceholder": "Tell the community about yourself...",
"createProfile": "Create profile",
"creatingProfile": "Creating profile...",
"successTitle": "Looking good, {'@'}{username}!",
"successProfileUrl": "Your profile page is live at",
"successProfileLink": "comfy.com/p/{username}",
"successDescription": "You can now upload your workflow to your creator page",
"uploadWorkflowButton": "Upload my workflow"
},
"desktopDialogs": {
"": {