Repository: LykosAI/StabilityMatrix
Branch: main
Commit: 5d8a68d825fd
Files: 1529
Total size: 7.7 MB
Directory structure:
gitextract_tguifjg2/
├── .aiexclude
├── .backportrc.json
├── .config/
│ ├── .csharpierrc.json
│ └── dotnet-tools.json
├── .csharpierrc.yaml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bug.yml
│ │ ├── 2-bug-crash.yml
│ │ ├── 3-bug-package.yml
│ │ ├── 4-feature-request.yml
│ │ └── config.yml
│ ├── dependabot.yml
│ └── workflows/
│ ├── backport.yml
│ ├── build.yml
│ ├── cla.yml
│ ├── release.yml
│ ├── stale.yml
│ ├── test-ui.yml
│ └── version-bump.yml
├── .gitignore
├── .husky/
│ └── task-runner.json
├── Avalonia.Gif/
│ ├── Avalonia.Gif.csproj
│ ├── BgWorkerCommand.cs
│ ├── BgWorkerState.cs
│ ├── Decoding/
│ │ ├── BlockTypes.cs
│ │ ├── ExtensionType.cs
│ │ ├── FrameDisposal.cs
│ │ ├── GifColor.cs
│ │ ├── GifDecoder.cs
│ │ ├── GifFrame.cs
│ │ ├── GifHeader.cs
│ │ ├── GifRect.cs
│ │ ├── GifRepeatBehavior.cs
│ │ ├── InvalidGifStreamException.cs
│ │ └── LzwDecompressionException.cs
│ ├── Extensions/
│ │ └── StreamExtensions.cs
│ ├── GifImage.cs
│ ├── GifInstance.cs
│ ├── IGifInstance.cs
│ ├── InvalidGifStreamException.cs
│ └── WebpInstance.cs
├── Build/
│ ├── AppEntitlements.entitlements
│ ├── EmbeddedEntitlements.entitlements
│ ├── _utils.sh
│ ├── build_macos_app.sh
│ ├── codesign_embedded_macos.sh
│ ├── codesign_macos.sh
│ └── notarize_macos.sh
├── CHANGELOG.md
├── CONTRIBUTING.md
├── ConditionalSymbols.props
├── Directory.Build.props
├── Directory.Packages.props
├── Jenkinsfile
├── LICENSE
├── NuGet.Config
├── README.md
├── Runtimes.Default.props
├── StabilityMatrix/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── AppxManifest.xml
│ ├── AssemblyInfo.cs
│ ├── Assets/
│ │ ├── 7za - LICENSE.txt
│ │ ├── Python310/
│ │ │ ├── LICENSE.txt
│ │ │ ├── _asyncio.pyd
│ │ │ ├── _bz2.pyd
│ │ │ ├── _ctypes.pyd
│ │ │ ├── _decimal.pyd
│ │ │ ├── _elementtree.pyd
│ │ │ ├── _hashlib.pyd
│ │ │ ├── _lzma.pyd
│ │ │ ├── _msi.pyd
│ │ │ ├── _multiprocessing.pyd
│ │ │ ├── _overlapped.pyd
│ │ │ ├── _queue.pyd
│ │ │ ├── _socket.pyd
│ │ │ ├── _sqlite3.pyd
│ │ │ ├── _ssl.pyd
│ │ │ ├── _uuid.pyd
│ │ │ ├── _zoneinfo.pyd
│ │ │ ├── pyexpat.pyd
│ │ │ ├── python.cat
│ │ │ ├── python310._pth
│ │ │ ├── select.pyd
│ │ │ ├── unicodedata.pyd
│ │ │ └── winsound.pyd
│ │ ├── automatic_vladmandic.sm-package.yml
│ │ ├── licenses.json
│ │ ├── sm-package.schema.json
│ │ └── venv/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ └── scripts/
│ │ ├── common/
│ │ │ ├── Activate.ps1
│ │ │ └── activate
│ │ ├── nt/
│ │ │ ├── activate.bat
│ │ │ └── deactivate.bat
│ │ └── posix/
│ │ ├── activate.csh
│ │ └── activate.fish
│ ├── CheckpointBrowserPage.xaml
│ ├── CheckpointBrowserPage.xaml.cs
│ ├── CheckpointManagerPage.xaml
│ ├── CheckpointManagerPage.xaml.cs
│ ├── Controls/
│ │ ├── AppBrushes.cs
│ │ ├── ProgressBarSmoother.cs
│ │ ├── RefreshBadge.xaml
│ │ └── RefreshBadge.xaml.cs
│ ├── Converters/
│ │ ├── BoolNegationConverter.cs
│ │ ├── BooleanToHiddenVisibleConverter.cs
│ │ ├── IntDoubleConverter.cs
│ │ ├── IsStringNullOrWhitespaceConverter.cs
│ │ ├── LaunchOptionConverter.cs
│ │ ├── LaunchOptionIntDoubleConverter.cs
│ │ ├── NullToVisibilityConverter.cs
│ │ ├── StringNullOrEmptyToVisibilityConverter.cs
│ │ ├── UriToBitmapConverter.cs
│ │ └── ValueConverterGroup.cs
│ ├── DataDirectoryMigrationDialog.xaml
│ ├── DataDirectoryMigrationDialog.xaml.cs
│ ├── DesignData/
│ │ ├── MockCheckpointBrowserViewModel.cs
│ │ ├── MockCheckpointFolder.cs
│ │ ├── MockCheckpointManagerViewModel.cs
│ │ ├── MockFirstLaunchSetupViewModel.cs
│ │ ├── MockLaunchViewModel.cs
│ │ └── MockModelVersionDialogViewModel.cs
│ ├── ExceptionWindow.xaml
│ ├── ExceptionWindow.xaml.cs
│ ├── FirstLaunchSetupWindow.xaml
│ ├── FirstLaunchSetupWindow.xaml.cs
│ ├── Helper/
│ │ ├── AsyncDispatchTimer.cs
│ │ ├── DialogFactory.cs
│ │ ├── IDialogFactory.cs
│ │ ├── ISnackbarService.cs
│ │ ├── ScreenExtensions.cs
│ │ └── SnackbarService.cs
│ ├── InstallerWindow.xaml
│ ├── InstallerWindow.xaml.cs
│ ├── Interactions/
│ │ └── EventTriggerWithoutPropogation.cs
│ ├── LaunchOptionsDialog.xaml
│ ├── LaunchOptionsDialog.xaml.cs
│ ├── LaunchPage.xaml
│ ├── LaunchPage.xaml.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ ├── Models/
│ │ ├── CheckpointFile.cs
│ │ └── CheckpointFolder.cs
│ ├── OneClickInstallDialog.xaml
│ ├── OneClickInstallDialog.xaml.cs
│ ├── Package.appxmanifest
│ ├── PackageManagerPage.xaml
│ ├── PackageManagerPage.xaml.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── SelectInstallLocationsDialog.xaml
│ ├── SelectInstallLocationsDialog.xaml.cs
│ ├── SelectModelVersionDialog.xaml
│ ├── SelectModelVersionDialog.xaml.cs
│ ├── Services/
│ │ ├── INotificationBarService.cs
│ │ ├── InstallerWindowDialogService.cs
│ │ ├── NotificationBarService.cs
│ │ ├── PageContentDialogService.cs
│ │ └── PageService.cs
│ ├── SettingsPage.xaml
│ ├── SettingsPage.xaml.cs
│ ├── StabilityMatrix.csproj
│ ├── Styles/
│ │ └── Styles.xaml
│ ├── TextToImagePage.xaml
│ ├── TextToImagePage.xaml.cs
│ ├── UpdateWindow.xaml
│ ├── UpdateWindow.xaml.cs
│ ├── ViewModels/
│ │ ├── CheckpointBrowserCardViewModel.cs
│ │ ├── CheckpointBrowserViewModel.cs
│ │ ├── CheckpointManagerViewModel.cs
│ │ ├── DataDirectoryMigrationViewModel.cs
│ │ ├── ExceptionWindowViewModel.cs
│ │ ├── FirstLaunchSetupViewModel.cs
│ │ ├── InstallerViewModel.cs
│ │ ├── LaunchOptionsDialogViewModel.cs
│ │ ├── LaunchViewModel.cs
│ │ ├── MainWindowViewModel.cs
│ │ ├── OneClickInstallViewModel.cs
│ │ ├── PackageManagerViewModel.cs
│ │ ├── ProgressViewModel.cs
│ │ ├── RefreshBadgeViewModel.cs
│ │ ├── SelectInstallLocationsViewModel.cs
│ │ ├── SelectModelVersionDialogViewModel.cs
│ │ ├── SettingsViewModel.cs
│ │ ├── SnackbarViewModel.cs
│ │ ├── TextToImageViewModel.cs
│ │ ├── UpdateWindowViewModel.cs
│ │ └── WebLoginViewModel.cs
│ ├── WebLoginDialog.xaml
│ ├── WebLoginDialog.xaml.cs
│ ├── app.manifest
│ ├── appsettings.Development.json
│ └── appsettings.json
├── StabilityMatrix.Analyzers.CodeFixes/
│ └── StabilityMatrix.Analyzers.CodeFixes.csproj
├── StabilityMatrix.Avalonia/
│ ├── Animations/
│ │ ├── BaseTransitionInfo.cs
│ │ ├── BetterDrillInNavigationTransition.cs
│ │ ├── BetterEntranceNavigationTransition.cs
│ │ ├── BetterSlideNavigationTransition.cs
│ │ └── ItemsRepeaterArrangeAnimation.cs
│ ├── App.axaml
│ ├── App.axaml.cs
│ ├── Assets/
│ │ ├── AppIcon.icns
│ │ ├── Fonts/
│ │ │ └── NotoSansJP/
│ │ │ └── OFL.txt
│ │ ├── ImagePrompt.tmLanguage.json
│ │ ├── ThemeMatrixDark.json
│ │ ├── hf-packages.json
│ │ ├── licenses.json
│ │ ├── linux-x64/
│ │ │ ├── 7zzs
│ │ │ └── 7zzs - LICENSE.txt
│ │ ├── macos-arm64/
│ │ │ ├── 7zz
│ │ │ └── 7zz - LICENSE.txt
│ │ ├── markdown.css
│ │ ├── sdprompt.xshd
│ │ ├── sitecustomize.py
│ │ └── win-x64/
│ │ ├── 7za - LICENSE.txt
│ │ └── venv/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ └── scripts/
│ │ ├── common/
│ │ │ ├── Activate.ps1
│ │ │ └── activate
│ │ ├── nt/
│ │ │ ├── activate.bat
│ │ │ └── deactivate.bat
│ │ └── posix/
│ │ ├── activate.csh
│ │ └── activate.fish
│ ├── Assets.cs
│ ├── Behaviors/
│ │ ├── ConditionalToolTipBehavior.cs
│ │ ├── ResizeBehavior.cs
│ │ ├── TextEditorCompletionBehavior.cs
│ │ ├── TextEditorToolTipBehavior.cs
│ │ └── TextEditorWeightAdjustmentBehavior.cs
│ ├── Collections/
│ │ └── SearchCollection.cs
│ ├── Controls/
│ │ ├── AdvancedImageBox.axaml
│ │ ├── AdvancedImageBox.axaml.cs
│ │ ├── AdvancedImageBoxView.axaml
│ │ ├── AdvancedImageBoxView.axaml.cs
│ │ ├── AppWindowBase.cs
│ │ ├── ApplicationSplashScreen.cs
│ │ ├── AutoGrid.cs
│ │ ├── BetterAdvancedImage.cs
│ │ ├── BetterComboBox.cs
│ │ ├── BetterContentDialog.cs
│ │ ├── BetterContextDragBehavior.cs
│ │ ├── BetterDownloadableComboBox.cs
│ │ ├── BetterFlyout.cs
│ │ ├── BetterImage.cs
│ │ ├── BetterMarkdownScrollViewer.cs
│ │ ├── Card.cs
│ │ ├── CheckerboardBorder.cs
│ │ ├── CodeCompletion/
│ │ │ ├── CompletionData.cs
│ │ │ ├── CompletionIcons.cs
│ │ │ ├── CompletionList.cs
│ │ │ ├── CompletionListBox.cs
│ │ │ ├── CompletionListThemes.axaml
│ │ │ ├── CompletionWindow.axaml
│ │ │ ├── CompletionWindow.axaml.cs
│ │ │ ├── CompletionWindowBase.cs
│ │ │ ├── ICompletionData.cs
│ │ │ ├── InsertionRequestEventArgs.cs
│ │ │ └── PopupWithCustomPosition.cs
│ │ ├── ComfyUpscalerTemplateSelector.cs
│ │ ├── DataTemplateSelector.cs
│ │ ├── Dock/
│ │ │ └── DockUserControlBase.cs
│ │ ├── DropTargetTemplatedControlBase.cs
│ │ ├── DropTargetUserControlBase.cs
│ │ ├── EditorCommands.cs
│ │ ├── EditorFlyouts.axaml
│ │ ├── FADownloadableComboBox.cs
│ │ ├── FASymbolIconSource.cs
│ │ ├── FrameCarousel.axaml
│ │ ├── FrameCarousel.axaml.cs
│ │ ├── GitVersionSelector.axaml
│ │ ├── GitVersionSelector.axaml.cs
│ │ ├── HybridModelTemplateSelector.cs
│ │ ├── HyperlinkIconButton.cs
│ │ ├── ImageLoaders.cs
│ │ ├── Inference/
│ │ │ ├── BatchSizeCard.axaml
│ │ │ ├── BatchSizeCard.axaml.cs
│ │ │ ├── CfzCudnnToggleCard.axaml
│ │ │ ├── CfzCudnnToggleCard.axaml.cs
│ │ │ ├── ControlNetCard.axaml
│ │ │ ├── ControlNetCard.axaml.cs
│ │ │ ├── DiscreteModelSamplingCard.axaml
│ │ │ ├── DiscreteModelSamplingCard.axaml.cs
│ │ │ ├── ExtraNetworkCard.axaml
│ │ │ ├── ExtraNetworkCard.axaml.cs
│ │ │ ├── FaceDetailerCard.axaml
│ │ │ ├── FaceDetailerCard.axaml.cs
│ │ │ ├── FreeUCard.axaml
│ │ │ ├── FreeUCard.axaml.cs
│ │ │ ├── ImageFolderCard.axaml
│ │ │ ├── ImageFolderCard.axaml.cs
│ │ │ ├── ImageGalleryCard.axaml
│ │ │ ├── ImageGalleryCard.axaml.cs
│ │ │ ├── LayerDiffuseCard.axaml
│ │ │ ├── LayerDiffuseCard.axaml.cs
│ │ │ ├── ModelCard.axaml
│ │ │ ├── ModelCard.axaml.cs
│ │ │ ├── NrsCard.axaml
│ │ │ ├── NrsCard.axaml.cs
│ │ │ ├── PlasmaNoiseCard.axaml
│ │ │ ├── PlasmaNoiseCard.axaml.cs
│ │ │ ├── PromptCard.axaml
│ │ │ ├── PromptCard.axaml.cs
│ │ │ ├── PromptExpansionCard.axaml
│ │ │ ├── PromptExpansionCard.axaml.cs
│ │ │ ├── RescaleCfgCard.axaml
│ │ │ ├── RescaleCfgCard.axaml.cs
│ │ │ ├── SamplerCard.axaml
│ │ │ ├── SamplerCard.axaml.cs
│ │ │ ├── SeedCard.axaml
│ │ │ ├── SeedCard.axaml.cs
│ │ │ ├── SelectImageCard.axaml
│ │ │ ├── SelectImageCard.axaml.cs
│ │ │ ├── SharpenCard.axaml
│ │ │ ├── SharpenCard.axaml.cs
│ │ │ ├── StackCard.axaml
│ │ │ ├── StackCard.axaml.cs
│ │ │ ├── StackEditableCard.axaml
│ │ │ ├── StackEditableCard.axaml.cs
│ │ │ ├── StackExpander.axaml
│ │ │ ├── StackExpander.axaml.cs
│ │ │ ├── TiledVAECard.axaml
│ │ │ ├── TiledVAECard.axaml.cs
│ │ │ ├── UnetModelCard.axaml
│ │ │ ├── UnetModelCard.axaml.cs
│ │ │ ├── UpscalerCard.axaml
│ │ │ ├── UpscalerCard.axaml.cs
│ │ │ ├── WanModelCard.axaml
│ │ │ └── WanModelCard.axaml.cs
│ │ ├── LaunchOptionCardTemplateSelector.cs
│ │ ├── LineDashFrame.cs
│ │ ├── MarkdownViewer.axaml
│ │ ├── MarkdownViewer.axaml.cs
│ │ ├── Models/
│ │ │ ├── GitVersionSelectorVersionType.cs
│ │ │ ├── PenPath.cs
│ │ │ ├── PenPoint.cs
│ │ │ └── SKLayer.cs
│ │ ├── Paginator.axaml
│ │ ├── Paginator.axaml.cs
│ │ ├── Painting/
│ │ │ ├── PaintCanvas.axaml
│ │ │ └── PaintCanvas.axaml.cs
│ │ ├── ProgressRing.cs
│ │ ├── PropertyGrid/
│ │ │ ├── BetterPropertyGrid.cs
│ │ │ ├── PropertyGridCultureData.cs
│ │ │ ├── PropertyGridLocalizationService.cs
│ │ │ └── ToggleSwitchCellEditFactory.cs
│ │ ├── RefreshBadge.axaml
│ │ ├── RefreshBadge.axaml.cs
│ │ ├── Scroll/
│ │ │ ├── BetterScrollContentPresenter.cs
│ │ │ ├── BetterScrollViewer.axaml
│ │ │ └── BetterScrollViewer.cs
│ │ ├── SelectableImageCard/
│ │ │ ├── SelectableImageButton.axaml
│ │ │ └── SelectableImageButton.cs
│ │ ├── SettingsAccountLinkExpander.axaml
│ │ ├── SettingsAccountLinkExpander.axaml.cs
│ │ ├── SkiaCustomCanvas.axaml
│ │ ├── SkiaCustomCanvas.axaml.cs
│ │ ├── StarsRating.axaml
│ │ ├── StarsRating.axaml.cs
│ │ ├── TemplatedControlBase.cs
│ │ ├── TextMarkers/
│ │ │ ├── TextMarker.cs
│ │ │ ├── TextMarkerService.cs
│ │ │ ├── TextMarkerValidationEventArgs.cs
│ │ │ └── TextMarkerValidatorService.cs
│ │ ├── TreeFileExplorer.axaml
│ │ ├── TreeFileExplorer.axaml.cs
│ │ ├── UserControlBase.cs
│ │ ├── VendorLabs/
│ │ │ ├── AsyncImage/
│ │ │ │ ├── AsyncImageFailedEventArgs.cs
│ │ │ │ ├── BetterAsyncImage.Events.cs
│ │ │ │ ├── BetterAsyncImage.Properties.cs
│ │ │ │ ├── BetterAsyncImage.cs
│ │ │ │ └── BetterAsyncImageCacheProvider.cs
│ │ │ ├── Cache/
│ │ │ │ ├── CacheBase.cs
│ │ │ │ ├── CacheOptions.cs
│ │ │ │ ├── FileCache.cs
│ │ │ │ ├── IImageCache.cs
│ │ │ │ ├── ImageCache.cs
│ │ │ │ ├── InMemoryStorage.cs
│ │ │ │ ├── InMemoryStorageItem.cs
│ │ │ │ └── MemoryImageCache.cs
│ │ │ ├── LICENSE
│ │ │ └── Themes/
│ │ │ └── BetterAsyncImage.axaml
│ │ ├── VideoGenerationSettingsCard.axaml
│ │ ├── VideoGenerationSettingsCard.axaml.cs
│ │ ├── VideoOutputSettingsCard.axaml
│ │ └── VideoOutputSettingsCard.axaml.cs
│ ├── Converters/
│ │ ├── BooleanChoiceMultiConverter.cs
│ │ ├── CivitImageWidthConverter.cs
│ │ ├── ComfyUpscalerConverter.cs
│ │ ├── CultureInfoDisplayConverter.cs
│ │ ├── CustomStringFormatConverter.cs
│ │ ├── EnumAttributeConverter.cs
│ │ ├── EnumAttributeConverters.cs
│ │ ├── EnumStringConverter.cs
│ │ ├── EnumToBooleanConverter.cs
│ │ ├── EnumToIntConverter.cs
│ │ ├── EnumToValuesConverter.cs
│ │ ├── FileSizeConverters.cs
│ │ ├── FileUriConverter.cs
│ │ ├── FitSquarelyWithinAspectRatioConverter.cs
│ │ ├── FuncCommandConverter.cs
│ │ ├── IndexPlusOneConverter.cs
│ │ ├── KiloFormatter.cs
│ │ ├── KiloFormatterStringConverter.cs
│ │ ├── LaunchOptionConverter.cs
│ │ ├── LaunchOptionIntDoubleConverter.cs
│ │ ├── MemoryBytesFormatter.cs
│ │ ├── MultiplyConverter.cs
│ │ ├── NullableDefaultNumericConverter.cs
│ │ ├── NullableDefaultNumericConverters.cs
│ │ ├── NumberFormatModeSampleConverter.cs
│ │ ├── StringFormatConverters.cs
│ │ ├── UriStringConverter.cs
│ │ └── ValueConverterGroup.cs
│ ├── DesignData/
│ │ ├── DesignData.cs
│ │ ├── MockCompletionProvider.cs
│ │ ├── MockDownloadProgressItemViewModel.cs
│ │ ├── MockGitVersionProvider.cs
│ │ ├── MockImageIndexService.cs
│ │ ├── MockInferenceClientManager.cs
│ │ ├── MockLaunchPageViewModel.cs
│ │ ├── MockMetadataImportService.cs
│ │ ├── MockModelIndexService.cs
│ │ ├── MockPropertyGridObject.cs
│ │ └── MockSettingsManager.cs
│ ├── DialogHelper.cs
│ ├── Extensions/
│ │ ├── AvaloniaEditExtensions.cs
│ │ ├── BitmapExtensions.cs
│ │ ├── ClipboardExtensions.cs
│ │ ├── ComfyNodeBuilderExtensions.cs
│ │ ├── DataObjectExtensions.cs
│ │ ├── EnumExtensions.cs
│ │ ├── InferenceProjectTypeExtensions.cs
│ │ ├── NotificationLevelExtensions.cs
│ │ ├── NotificationServiceExtensions.cs
│ │ ├── RelayCommandExtensions.cs
│ │ ├── ServiceManagerExtensions.cs
│ │ ├── SkiaExtensions.cs
│ │ ├── TextMateExtensions.cs
│ │ └── VisualExtensions.cs
│ ├── ExternalAnnotations/
│ │ ├── Microsoft.Extensions.Logging.Abstractions.xml
│ │ └── System.Runtime.xml
│ ├── FallbackRamCachedWebImageLoader.cs
│ ├── Helpers/
│ │ ├── AttributeServiceInjector.Reflection.cs
│ │ ├── AttributeServiceInjector.cs
│ │ ├── ClipboardCommands.cs
│ │ ├── ConsoleProcessRunner.cs
│ │ ├── EnumHelpers.cs
│ │ ├── IOCommands.cs
│ │ ├── ImageProcessor.cs
│ │ ├── ImageSearcher.cs
│ │ ├── MarkdownSnippets.cs
│ │ ├── PngDataHelper.cs
│ │ ├── TagCsvParser.cs
│ │ ├── TextEditorConfigs.cs
│ │ ├── UnixPrerequisiteHelper.cs
│ │ ├── UriHandler.cs
│ │ ├── ViewModelSerializer.cs
│ │ ├── Win32ClipboardFormat.cs
│ │ ├── WindowsClipboard.cs
│ │ ├── WindowsElevated.cs
│ │ ├── WindowsPrerequisiteHelper.cs
│ │ └── WindowsShortcuts.cs
│ ├── Languages/
│ │ ├── Cultures.cs
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.cs-CZ.resx
│ │ ├── Resources.de.resx
│ │ ├── Resources.es.resx
│ │ ├── Resources.fr-FR.resx
│ │ ├── Resources.it-it.resx
│ │ ├── Resources.ja-JP.resx
│ │ ├── Resources.ko-KR.resx
│ │ ├── Resources.pt-BR.resx
│ │ ├── Resources.pt-PT.resx
│ │ ├── Resources.resx
│ │ ├── Resources.ru-ru.resx
│ │ ├── Resources.tr-TR.resx
│ │ ├── Resources.uk-UA.resx
│ │ ├── Resources.zh-Hans.resx
│ │ └── Resources.zh-Hant.resx
│ ├── Logging/
│ │ └── RichNLogTheme.cs
│ ├── MarkupExtensions/
│ │ ├── EnumValuesExtension.cs
│ │ └── TernaryExtension.cs
│ ├── Models/
│ │ ├── AdvancedObservableList.cs
│ │ ├── AppArgs.cs
│ │ ├── AvaloniaResource.cs
│ │ ├── CheckpointCategory.cs
│ │ ├── CommandItem.cs
│ │ ├── ContentDialogValueResult.cs
│ │ ├── DirectionalNavigationEventArgs.cs
│ │ ├── HuggingFace/
│ │ │ ├── HuggingFaceModelType.cs
│ │ │ └── HuggingfaceItem.cs
│ │ ├── IInfinitelyScroll.cs
│ │ ├── IJsonLoadableState.cs
│ │ ├── IParametersLoadableState.cs
│ │ ├── IPersistentViewProvider.cs
│ │ ├── IRemovableListItem.cs
│ │ ├── ITemplateKey.cs
│ │ ├── IconData.cs
│ │ ├── ImageCacheProviders.cs
│ │ ├── ImageSource.cs
│ │ ├── ImageSourceTemplateType.cs
│ │ ├── Inference/
│ │ │ ├── EditableModule.cs
│ │ │ ├── FileNameFormat.cs
│ │ │ ├── FileNameFormatPart.cs
│ │ │ ├── FileNameFormatProvider.cs
│ │ │ ├── FileNameFormatVar.cs
│ │ │ ├── GenerateFlags.cs
│ │ │ ├── GenerateOverrides.cs
│ │ │ ├── IComfyStep.cs
│ │ │ ├── IInputImageProvider.cs
│ │ │ ├── IValidatableModule.cs
│ │ │ ├── InferenceTextToImageModel.cs
│ │ │ ├── LatentType.cs
│ │ │ ├── LoadViewStateEventArgs.cs
│ │ │ ├── ModuleApplyStepEventArgs.cs
│ │ │ ├── NoiseType.cs
│ │ │ ├── Prompt.cs
│ │ │ ├── PromptAmplifierMode.cs
│ │ │ ├── PromptCardModel.cs
│ │ │ ├── SamplerCardModel.cs
│ │ │ ├── SaveViewStateEventArgs.cs
│ │ │ ├── SeedCardModel.cs
│ │ │ ├── StackCardModel.cs
│ │ │ ├── StackExpanderModel.cs
│ │ │ ├── UpscalerCardModel.cs
│ │ │ ├── VideoOutputMethod.cs
│ │ │ └── ViewState.cs
│ │ ├── InferenceProjectDocument.cs
│ │ ├── ObservableDictionary.cs
│ │ ├── OpenArtCustomNode.cs
│ │ ├── OpenArtMetadata.cs
│ │ ├── PackageManagerNavigationOptions.cs
│ │ ├── PackageSteps/
│ │ │ └── UnpackSiteCustomizeStep.cs
│ │ ├── PaintCanvasTool.cs
│ │ ├── PythonPackageSpecifiersItem.cs
│ │ ├── SelectableItem.cs
│ │ ├── SharedState.cs
│ │ ├── TagCompletion/
│ │ │ ├── CompletionProvider.cs
│ │ │ ├── CompletionType.cs
│ │ │ ├── EditorCompletionRequest.cs
│ │ │ ├── ICompletionProvider.cs
│ │ │ ├── ITokenizerProvider.cs
│ │ │ ├── ModelCompletionData.cs
│ │ │ ├── ModelTypeCompletionData.cs
│ │ │ ├── TagCompletionData.cs
│ │ │ ├── TagCsvEntry.cs
│ │ │ ├── TagType.cs
│ │ │ ├── TextCompletionRequest.cs
│ │ │ └── TokenizerProvider.cs
│ │ ├── TextEditorPreset.cs
│ │ ├── TreeFileExplorer/
│ │ │ ├── TreeFileExplorerDirectory.cs
│ │ │ ├── TreeFileExplorerFile.cs
│ │ │ ├── TreeFileExplorerItem.cs
│ │ │ ├── TreeFileExplorerOptions.cs
│ │ │ └── TreeFileExplorerType.cs
│ │ ├── TreeViewDirectory.cs
│ │ ├── TypedNavigationEventArgs.cs
│ │ ├── UpdateChannelCard.cs
│ │ └── ViewModelState.cs
│ ├── Program.cs
│ ├── Services/
│ │ ├── AccountsService.cs
│ │ ├── CivitBaseModelTypeService.cs
│ │ ├── ConnectedServiceManager.cs
│ │ ├── DiscordRichPresenceService.cs
│ │ ├── IAccountsService.cs
│ │ ├── ICivitBaseModelTypeService.cs
│ │ ├── IConnectedServiceManager.cs
│ │ ├── IDiscordRichPresenceService.cs
│ │ ├── IInferenceClientManager.cs
│ │ ├── IModelDownloadLinkHandler.cs
│ │ ├── IModelImportService.cs
│ │ ├── INavigationService.cs
│ │ ├── INotificationService.cs
│ │ ├── IServiceManager.cs
│ │ ├── IServiceManagerScope.cs
│ │ ├── InferenceClientManager.cs
│ │ ├── ModelDownloadLinkHandler.cs
│ │ ├── ModelImportService.cs
│ │ ├── NavigationService.cs
│ │ ├── NotificationService.cs
│ │ ├── RunningPackageService.cs
│ │ ├── ScopedServiceManager.cs
│ │ ├── ServiceManager.cs
│ │ ├── ServiceManagerScope.cs
│ │ └── TabContext.cs
│ ├── StabilityMatrix.Avalonia.csproj
│ ├── StabilityMatrix.Avalonia.csproj.DotSettings
│ ├── Styles/
│ │ ├── BorderStyles.axaml
│ │ ├── ButtonStyles.axaml
│ │ ├── Card.axaml
│ │ ├── CommandBarButtonStyles.axaml
│ │ ├── ContextMenuStyles.axaml
│ │ ├── ControlThemes/
│ │ │ ├── BetterComboBoxStyles.axaml
│ │ │ ├── ButtonStyles.Accelerator.axaml
│ │ │ ├── HyperlinkIconButtonStyles.axaml
│ │ │ ├── LabelStyles.Dark.axaml
│ │ │ ├── LabelStyles.axaml
│ │ │ ├── ListBoxStyles.axaml
│ │ │ └── _index.axaml
│ │ ├── DockStyles.axaml
│ │ ├── FAComboBoxStyles.axaml
│ │ ├── ListBoxStyles.axaml
│ │ ├── Markdown/
│ │ │ ├── MarkdownStyleFluentAvalonia.axaml
│ │ │ └── MarkdownStyleFluentAvalonia.axaml.cs
│ │ ├── ProgressRing.axaml
│ │ ├── SemiStyles.axaml
│ │ ├── SemiStyles.axaml.cs
│ │ ├── SplitButtonStyles.axaml
│ │ ├── TextBoxStyles.axaml
│ │ ├── ThemeColors.axaml
│ │ ├── ThemeColors.cs
│ │ ├── ThemeMaterials.axaml
│ │ └── ToggleButtonStyles.axaml
│ ├── ViewLocator.cs
│ ├── ViewModels/
│ │ ├── Base/
│ │ │ ├── ConsoleProgressViewModel.cs
│ │ │ ├── ContentDialogProgressViewModelBase.cs
│ │ │ ├── ContentDialogViewModelBase.cs
│ │ │ ├── DisposableLoadableViewModelBase.cs
│ │ │ ├── DisposableViewModelBase.cs
│ │ │ ├── InferenceGenerationViewModelBase.cs
│ │ │ ├── InferenceTabViewModelBase.cs
│ │ │ ├── LoadableViewModelBase.cs
│ │ │ ├── PageViewModelBase.cs
│ │ │ ├── PausableProgressItemViewModelBase.cs
│ │ │ ├── ProgressItemViewModelBase.cs
│ │ │ ├── ProgressViewModel.cs
│ │ │ ├── SelectableViewModelBase.cs
│ │ │ ├── TabViewModelBase.cs
│ │ │ ├── TaskDialogViewModelBase.cs
│ │ │ └── ViewModelBase.cs
│ │ ├── CheckpointBrowser/
│ │ │ ├── CheckpointBrowserCardViewModel.cs
│ │ │ ├── CivitAiBrowserViewModel.cs
│ │ │ ├── CivitDetailsPageViewModel.cs
│ │ │ ├── HuggingFacePageViewModel.cs
│ │ │ ├── OpenModelDbBrowserCardViewModel.cs
│ │ │ ├── OpenModelDbBrowserViewModel.Filters.cs
│ │ │ └── OpenModelDbBrowserViewModel.cs
│ │ ├── CheckpointBrowserViewModel.cs
│ │ ├── CheckpointManager/
│ │ │ ├── BaseModelOptionViewModel.cs
│ │ │ └── CheckpointFileViewModel.cs
│ │ ├── CheckpointsPageViewModel.cs
│ │ ├── ConsoleViewModel.cs
│ │ ├── Controls/
│ │ │ ├── GitVersionSelectorViewModel.cs
│ │ │ ├── PaintCanvasViewModel.Serializer.cs
│ │ │ └── PaintCanvasViewModel.cs
│ │ ├── Dialogs/
│ │ │ ├── AnalyticsOptInViewModel.cs
│ │ │ ├── CivitFileDisplayViewModel.cs
│ │ │ ├── CivitFileViewModel.cs
│ │ │ ├── CivitImageViewModel.cs
│ │ │ ├── ConfirmBulkDownloadDialogViewModel.cs
│ │ │ ├── ConfirmDeleteDialogViewModel.cs
│ │ │ ├── ConfirmPackageDeleteDialogViewModel.cs
│ │ │ ├── DownloadResourceViewModel.cs
│ │ │ ├── EnvVarsViewModel.cs
│ │ │ ├── ExceptionViewModel.cs
│ │ │ ├── ImageViewerViewModel.cs
│ │ │ ├── InferenceConnectionHelpViewModel.cs
│ │ │ ├── LaunchOptionsViewModel.cs
│ │ │ ├── LykosLoginViewModel.cs
│ │ │ ├── MaskEditorViewModel.cs
│ │ │ ├── ModelMetadataEditorDialogViewModel.cs
│ │ │ ├── ModelVersionViewModel.cs
│ │ │ ├── NewOneClickInstallViewModel.cs
│ │ │ ├── OAuthConnectViewModel.cs
│ │ │ ├── OAuthDeviceAuthViewModel.cs
│ │ │ ├── OAuthGoogleLoginViewModel.cs
│ │ │ ├── OAuthLoginViewModel.cs
│ │ │ ├── OneClickInstallViewModel.cs
│ │ │ ├── OpenArtWorkflowViewModel.cs
│ │ │ ├── OpenModelDbModelDetailsViewModel.cs
│ │ │ ├── PackageImportViewModel.cs
│ │ │ ├── PropertyGridViewModel.cs
│ │ │ ├── PythonPackageSpecifiersViewModel.cs
│ │ │ ├── PythonPackagesItemViewModel.cs
│ │ │ ├── PythonPackagesViewModel.cs
│ │ │ ├── RecommendedModelItemViewModel.cs
│ │ │ ├── RecommendedModelsViewModel.cs
│ │ │ ├── SafetensorMetadataViewModel.cs
│ │ │ ├── SelectDataDirectoryViewModel.cs
│ │ │ ├── SelectModelVersionViewModel.cs
│ │ │ ├── SponsorshipPromptViewModel.cs
│ │ │ └── UpdateViewModel.cs
│ │ ├── FirstLaunchSetupViewModel.cs
│ │ ├── HuggingFacePage/
│ │ │ ├── CategoryViewModel.cs
│ │ │ └── HuggingfaceItemViewModel.cs
│ │ ├── IDropTarget.cs
│ │ ├── Inference/
│ │ │ ├── BatchSizeCardViewModel.cs
│ │ │ ├── CfzCudnnToggleCardViewModel.cs
│ │ │ ├── ControlNetCardViewModel.cs
│ │ │ ├── DiscreteModelSamplingCardViewModel.cs
│ │ │ ├── ExtraNetworkCardViewModel.cs
│ │ │ ├── FaceDetailerViewModel.cs
│ │ │ ├── FreeUCardViewModel.cs
│ │ │ ├── IImageGalleryComponent.cs
│ │ │ ├── ImageFolderCardItemViewModel.cs
│ │ │ ├── ImageFolderCardViewModel.cs
│ │ │ ├── ImageGalleryCardViewModel.cs
│ │ │ ├── InferenceFluxTextToImageViewModel.cs
│ │ │ ├── InferenceImageToImageViewModel.cs
│ │ │ ├── InferenceImageToVideoViewModel.cs
│ │ │ ├── InferenceImageUpscaleViewModel.cs
│ │ │ ├── InferenceTextToImageViewModel.cs
│ │ │ ├── InferenceWanImageToVideoViewModel.cs
│ │ │ ├── InferenceWanTextToVideoViewModel.cs
│ │ │ ├── LayerDiffuseCardViewModel.cs
│ │ │ ├── ModelCardViewModel.cs
│ │ │ ├── Modules/
│ │ │ │ ├── CfzCudnnToggleModule.cs
│ │ │ │ ├── ControlNetModule.cs
│ │ │ │ ├── DiscreteModelSamplingModule.cs
│ │ │ │ ├── FaceDetailerModule.cs
│ │ │ │ ├── FluxGuidanceModule.cs
│ │ │ │ ├── FluxHiresFixModule.cs
│ │ │ │ ├── FreeUModule.cs
│ │ │ │ ├── HiresFixModule.cs
│ │ │ │ ├── LayerDiffuseModule.cs
│ │ │ │ ├── LoraModule.cs
│ │ │ │ ├── ModuleBase.cs
│ │ │ │ ├── NRSModule.cs
│ │ │ │ ├── PlasmaNoiseModule.cs
│ │ │ │ ├── PromptExpansionModule.cs
│ │ │ │ ├── RescaleCfgModule.cs
│ │ │ │ ├── SaveImageModule.cs
│ │ │ │ ├── TiledVAEModule.cs
│ │ │ │ └── UpscalerModule.cs
│ │ │ ├── NrsCardViewModel.cs
│ │ │ ├── PlasmaNoiseCardViewModel.cs
│ │ │ ├── PromptCardViewModel.cs
│ │ │ ├── PromptExpansionCardViewModel.cs
│ │ │ ├── RescaleCfgCardViewModel.cs
│ │ │ ├── SamplerCardViewModel.cs
│ │ │ ├── SeedCardViewModel.cs
│ │ │ ├── SelectImageCardViewModel.cs
│ │ │ ├── SharpenCardViewModel.cs
│ │ │ ├── StackCardViewModel.cs
│ │ │ ├── StackEditableCardViewModel.cs
│ │ │ ├── StackExpanderViewModel.cs
│ │ │ ├── StackViewModelBase.cs
│ │ │ ├── TiledVAECardViewModel.cs
│ │ │ ├── UnetModelCardViewModel.cs
│ │ │ ├── UpscalerCardViewModel.cs
│ │ │ ├── Video/
│ │ │ │ ├── ImgToVidModelCardViewModel.cs
│ │ │ │ ├── SvdImgToVidConditioningViewModel.cs
│ │ │ │ └── VideoOutputSettingsCardViewModel.cs
│ │ │ ├── WanModelCardViewModel.cs
│ │ │ └── WanSamplerCardViewModel.cs
│ │ ├── InferenceViewModel.cs
│ │ ├── InstalledWorkflowsViewModel.cs
│ │ ├── LaunchPageViewModel.cs
│ │ ├── MainWindowViewModel.cs
│ │ ├── OpenArtBrowserViewModel.cs
│ │ ├── OutputsPage/
│ │ │ └── OutputImageViewModel.cs
│ │ ├── OutputsPageViewModel.cs
│ │ ├── PackageManager/
│ │ │ ├── MainPackageManagerViewModel.cs
│ │ │ ├── PackageCardViewModel.cs
│ │ │ ├── PackageExtensionBrowserViewModel.cs
│ │ │ ├── PackageInstallBrowserViewModel.cs
│ │ │ └── PackageInstallDetailViewModel.cs
│ │ ├── PackageManagerViewModel.cs
│ │ ├── Progress/
│ │ │ ├── DownloadProgressItemViewModel.cs
│ │ │ ├── PackageInstallProgressItemViewModel.cs
│ │ │ ├── ProgressItemViewModel.cs
│ │ │ └── ProgressManagerViewModel.cs
│ │ ├── RefreshBadgeViewModel.cs
│ │ ├── RunningPackageViewModel.cs
│ │ ├── Settings/
│ │ │ ├── AccountSettingsViewModel.cs
│ │ │ ├── AnalyticsSettingsViewModel.cs
│ │ │ ├── InferenceSettingsViewModel.cs
│ │ │ ├── MainSettingsViewModel.cs
│ │ │ ├── NotificationSettingsItem.cs
│ │ │ ├── NotificationSettingsViewModel.cs
│ │ │ └── UpdateSettingsViewModel.cs
│ │ ├── SettingsViewModel.cs
│ │ └── WorkflowsPageViewModel.cs
│ ├── Views/
│ │ ├── CheckpointBrowserPage.axaml
│ │ ├── CheckpointBrowserPage.axaml.cs
│ │ ├── CheckpointsPage.axaml
│ │ ├── CheckpointsPage.axaml.cs
│ │ ├── CivitAiBrowserPage.axaml
│ │ ├── CivitAiBrowserPage.axaml.cs
│ │ ├── CivitDetailsPage.axaml
│ │ ├── CivitDetailsPage.axaml.cs
│ │ ├── ConsoleOutputPage.axaml
│ │ ├── ConsoleOutputPage.axaml.cs
│ │ ├── Dialogs/
│ │ │ ├── AnalyticsOptInDialog.axaml
│ │ │ ├── AnalyticsOptInDialog.axaml.cs
│ │ │ ├── ConfirmBulkDownloadDialog.axaml
│ │ │ ├── ConfirmBulkDownloadDialog.axaml.cs
│ │ │ ├── ConfirmDeleteDialog.axaml
│ │ │ ├── ConfirmDeleteDialog.axaml.cs
│ │ │ ├── ConfirmPackageDeleteDialog.axaml
│ │ │ ├── ConfirmPackageDeleteDialog.axaml.cs
│ │ │ ├── DownloadResourceDialog.axaml
│ │ │ ├── DownloadResourceDialog.axaml.cs
│ │ │ ├── EnvVarsDialog.axaml
│ │ │ ├── EnvVarsDialog.axaml.cs
│ │ │ ├── ExceptionDialog.axaml
│ │ │ ├── ExceptionDialog.axaml.cs
│ │ │ ├── ImageViewerDialog.axaml
│ │ │ ├── ImageViewerDialog.axaml.cs
│ │ │ ├── InferenceConnectionHelpDialog.axaml
│ │ │ ├── InferenceConnectionHelpDialog.axaml.cs
│ │ │ ├── LaunchOptionsDialog.axaml
│ │ │ ├── LaunchOptionsDialog.axaml.cs
│ │ │ ├── LykosLoginDialog.axaml
│ │ │ ├── LykosLoginDialog.axaml.cs
│ │ │ ├── MaskEditorDialog.axaml
│ │ │ ├── MaskEditorDialog.axaml.cs
│ │ │ ├── ModelMetadataEditorDialog.axaml
│ │ │ ├── ModelMetadataEditorDialog.axaml.cs
│ │ │ ├── NewOneClickInstallDialog.axaml
│ │ │ ├── NewOneClickInstallDialog.axaml.cs
│ │ │ ├── OAuthConnectDialog.axaml
│ │ │ ├── OAuthConnectDialog.axaml.cs
│ │ │ ├── OAuthDeviceAuthDialog.axaml
│ │ │ ├── OAuthDeviceAuthDialog.axaml.cs
│ │ │ ├── OAuthLoginDialog.axaml
│ │ │ ├── OAuthLoginDialog.axaml.cs
│ │ │ ├── OneClickInstallDialog.axaml
│ │ │ ├── OneClickInstallDialog.axaml.cs
│ │ │ ├── OpenArtWorkflowDialog.axaml
│ │ │ ├── OpenArtWorkflowDialog.axaml.cs
│ │ │ ├── OpenModelDbModelDetailsDialog.axaml
│ │ │ ├── OpenModelDbModelDetailsDialog.axaml.cs
│ │ │ ├── PackageImportDialog.axaml
│ │ │ ├── PackageImportDialog.axaml.cs
│ │ │ ├── PackageModificationDialog.axaml
│ │ │ ├── PackageModificationDialog.axaml.cs
│ │ │ ├── PropertyGridDialog.axaml
│ │ │ ├── PropertyGridDialog.axaml.cs
│ │ │ ├── PythonPackageSpecifiersDialog.axaml
│ │ │ ├── PythonPackageSpecifiersDialog.axaml.cs
│ │ │ ├── PythonPackagesDialog.axaml
│ │ │ ├── PythonPackagesDialog.axaml.cs
│ │ │ ├── RecommendedModelsDialog.axaml
│ │ │ ├── RecommendedModelsDialog.axaml.cs
│ │ │ ├── SafetensorMetadataDialog.axaml
│ │ │ ├── SafetensorMetadataDialog.axaml.cs
│ │ │ ├── SelectDataDirectoryDialog.axaml
│ │ │ ├── SelectDataDirectoryDialog.axaml.cs
│ │ │ ├── SelectModelVersionDialog.axaml
│ │ │ ├── SelectModelVersionDialog.axaml.cs
│ │ │ ├── SponsorshipPromptDialog.axaml
│ │ │ ├── SponsorshipPromptDialog.axaml.cs
│ │ │ ├── UpdateDialog.axaml
│ │ │ └── UpdateDialog.axaml.cs
│ │ ├── FirstLaunchSetupWindow.axaml
│ │ ├── FirstLaunchSetupWindow.axaml.cs
│ │ ├── HuggingFacePage.axaml
│ │ ├── HuggingFacePage.axaml.cs
│ │ ├── Inference/
│ │ │ ├── InferenceImageToImageView.axaml
│ │ │ ├── InferenceImageToImageView.axaml.cs
│ │ │ ├── InferenceImageToVideoView.axaml
│ │ │ ├── InferenceImageToVideoView.axaml.cs
│ │ │ ├── InferenceImageUpscaleView.axaml
│ │ │ ├── InferenceImageUpscaleView.axaml.cs
│ │ │ ├── InferenceTextToImageView.axaml
│ │ │ ├── InferenceTextToImageView.axaml.cs
│ │ │ ├── InferenceWanImageToVideoView.axaml
│ │ │ ├── InferenceWanImageToVideoView.axaml.cs
│ │ │ ├── InferenceWanTextToVideoView.axaml
│ │ │ └── InferenceWanTextToVideoView.axaml.cs
│ │ ├── InferencePage.axaml
│ │ ├── InferencePage.axaml.cs
│ │ ├── InstalledWorkflowsPage.axaml
│ │ ├── InstalledWorkflowsPage.axaml.cs
│ │ ├── LaunchPageView.axaml
│ │ ├── LaunchPageView.axaml.cs
│ │ ├── MainWindow.axaml
│ │ ├── MainWindow.axaml.cs
│ │ ├── OpenArtBrowserPage.axaml
│ │ ├── OpenArtBrowserPage.axaml.cs
│ │ ├── OpenModelDbBrowserPage.axaml
│ │ ├── OpenModelDbBrowserPage.axaml.cs
│ │ ├── OutputsPage.axaml
│ │ ├── OutputsPage.axaml.cs
│ │ ├── PackageManager/
│ │ │ ├── MainPackageManagerView.axaml
│ │ │ ├── MainPackageManagerView.axaml.cs
│ │ │ ├── PackageExtensionBrowserView.axaml
│ │ │ ├── PackageExtensionBrowserView.axaml.cs
│ │ │ ├── PackageInstallBrowserView.axaml
│ │ │ ├── PackageInstallBrowserView.axaml.cs
│ │ │ ├── PackageInstallDetailView.axaml
│ │ │ └── PackageInstallDetailView.axaml.cs
│ │ ├── PackageManagerPage.axaml
│ │ ├── PackageManagerPage.axaml.cs
│ │ ├── ProgressManagerPage.axaml
│ │ ├── ProgressManagerPage.axaml.cs
│ │ ├── Settings/
│ │ │ ├── AccountSettingsPage.axaml
│ │ │ ├── AccountSettingsPage.axaml.cs
│ │ │ ├── AnalyticsSettingsPage.axaml
│ │ │ ├── AnalyticsSettingsPage.axaml.cs
│ │ │ ├── InferenceSettingsPage.axaml
│ │ │ ├── InferenceSettingsPage.axaml.cs
│ │ │ ├── MainSettingsPage.axaml
│ │ │ ├── MainSettingsPage.axaml.cs
│ │ │ ├── NotificationSettingsPage.axaml
│ │ │ ├── NotificationSettingsPage.axaml.cs
│ │ │ ├── UpdateSettingsPage.axaml
│ │ │ └── UpdateSettingsPage.axaml.cs
│ │ ├── SettingsPage.axaml
│ │ ├── SettingsPage.axaml.cs
│ │ ├── WorkflowsPage.axaml
│ │ └── WorkflowsPage.axaml.cs
│ └── app.manifest
├── StabilityMatrix.Avalonia.Diagnostics/
│ ├── LogViewer/
│ │ ├── Controls/
│ │ │ ├── LogViewerControl.axaml
│ │ │ └── LogViewerControl.axaml.cs
│ │ ├── Converters/
│ │ │ ├── ChangeColorTypeConverter.cs
│ │ │ └── EventIdConverter.cs
│ │ ├── Core/
│ │ │ ├── Extensions/
│ │ │ │ └── LoggerExtensions.cs
│ │ │ ├── Logging/
│ │ │ │ ├── DataStoreLoggerConfiguration.cs
│ │ │ │ ├── ILogDataStore.cs
│ │ │ │ ├── ILogDataStoreImpl.cs
│ │ │ │ ├── LogDataStore.cs
│ │ │ │ ├── LogEntryColor.cs
│ │ │ │ └── LogModel.cs
│ │ │ └── ViewModels/
│ │ │ ├── LogViewerControlViewModel.cs
│ │ │ ├── ObservableObject.cs
│ │ │ └── ViewModel.cs
│ │ ├── DataStoreLoggerTarget.cs
│ │ ├── Extensions/
│ │ │ └── ServicesExtension.cs
│ │ ├── LICENSE
│ │ ├── Logging/
│ │ │ └── LogDataStore.cs
│ │ └── README.md
│ ├── StabilityMatrix.Avalonia.Diagnostics.csproj
│ ├── ViewModels/
│ │ └── LogWindowViewModel.cs
│ └── Views/
│ ├── LogWindow.axaml
│ └── LogWindow.axaml.cs
├── StabilityMatrix.Avalonia.pupnet.conf
├── StabilityMatrix.Core/
│ ├── Animation/
│ │ └── GifConverter.cs
│ ├── Api/
│ │ ├── A3WebApiManager.cs
│ │ ├── ApiFactory.cs
│ │ ├── CivitCompatApiManager.cs
│ │ ├── IA3WebApi.cs
│ │ ├── IA3WebApiManager.cs
│ │ ├── IApiFactory.cs
│ │ ├── ICivitApi.cs
│ │ ├── ICivitTRPCApi.cs
│ │ ├── IComfyApi.cs
│ │ ├── IHuggingFaceApi.cs
│ │ ├── IInvokeAiApi.cs
│ │ ├── ILykosAnalyticsApi.cs
│ │ ├── ILykosAuthApiV1.cs
│ │ ├── ILykosModelDiscoveryApi.cs
│ │ ├── IOpenArtApi.cs
│ │ ├── IOpenModelDbApi.cs
│ │ ├── IPyPiApi.cs
│ │ ├── ITokenProvider.cs
│ │ ├── LykosAuthApi/
│ │ │ ├── .refitter
│ │ │ ├── Generated/
│ │ │ │ └── Refitter.g.cs
│ │ │ └── IRecommendedModelsApi.cs
│ │ ├── LykosAuthTokenProvider.cs
│ │ ├── OpenIdClientConstants.cs
│ │ ├── PromptGen/
│ │ │ ├── .refitter
│ │ │ └── Generated/
│ │ │ └── Refitter.g.cs
│ │ └── TokenAuthHeaderHandler.cs
│ ├── Attributes/
│ │ ├── BoolStringMemberAttribute.cs
│ │ ├── ManagedServiceAttribute.cs
│ │ ├── PreloadAttribute.cs
│ │ ├── SingletonAttribute.cs
│ │ ├── TransientAttribute.cs
│ │ ├── TypedNodeOptionsAttribute.cs
│ │ └── ViewAttribute.cs
│ ├── Converters/
│ │ └── Json/
│ │ ├── AnalyticsRequestConverter.cs
│ │ ├── DefaultUnknownEnumConverter.cs
│ │ ├── LaunchOptionValueJsonConverter.cs
│ │ ├── NodeConnectionBaseJsonConverter.cs
│ │ ├── OneOfJsonConverter.cs
│ │ ├── ParsableStringValueJsonConverter.cs
│ │ ├── SKColorJsonConverter.cs
│ │ ├── SemVersionJsonConverter.cs
│ │ └── StringJsonConverter.cs
│ ├── Database/
│ │ ├── CivitModelQueryCacheEntry.cs
│ │ ├── ILiteDbContext.cs
│ │ └── LiteDbContext.cs
│ ├── Exceptions/
│ │ ├── AppException.cs
│ │ ├── CivitDownloadDisabledException.cs
│ │ ├── CivitLoginRequiredException.cs
│ │ ├── ComfyNodeException.cs
│ │ ├── EarlyAccessException.cs
│ │ ├── FileExistsException.cs
│ │ ├── HuggingFaceLoginRequiredException.cs
│ │ ├── MissingPrerequisiteException.cs
│ │ ├── ProcessException.cs
│ │ ├── PromptError.cs
│ │ ├── PromptSyntaxError.cs
│ │ ├── PromptUnknownModelError.cs
│ │ └── PromptValidationError.cs
│ ├── Extensions/
│ │ ├── DictionaryExtensions.cs
│ │ ├── DirectoryPathExtensions.cs
│ │ ├── DynamicDataExtensions.cs
│ │ ├── EnumAttributes.cs
│ │ ├── EnumConversion.cs
│ │ ├── EnumerableExtensions.cs
│ │ ├── HashExtensions.cs
│ │ ├── JsonObjectExtensions.cs
│ │ ├── LiteDBExtensions.cs
│ │ ├── NullableExtensions.cs
│ │ ├── ObjectExtensions.cs
│ │ ├── ProgressExtensions.cs
│ │ ├── SemVersionExtensions.cs
│ │ ├── ServiceProviderExtensions.cs
│ │ ├── SizeExtensions.cs
│ │ ├── StringExtensions.cs
│ │ ├── TypeExtensions.cs
│ │ └── UriExtensions.cs
│ ├── Git/
│ │ ├── CachedCommandGitVersionProvider.cs
│ │ ├── CommandGitVersionProvider.cs
│ │ └── IGitVersionProvider.cs
│ ├── Helper/
│ │ ├── Analytics/
│ │ │ ├── AnalyticsHelper.cs
│ │ │ └── IAnalyticsHelper.cs
│ │ ├── ArchiveHelper.cs
│ │ ├── Cache/
│ │ │ ├── GithubApiCache.cs
│ │ │ ├── IGithubApiCache.cs
│ │ │ ├── IPyPiCache.cs
│ │ │ ├── LRUCache.cs
│ │ │ └── PyPiCache.cs
│ │ ├── CodeTimer.cs
│ │ ├── Compat.cs
│ │ ├── EnumerationOptionConstants.cs
│ │ ├── EnvPathBuilder.cs
│ │ ├── EventManager.cs
│ │ ├── Factory/
│ │ │ ├── IPackageFactory.cs
│ │ │ └── PackageFactory.cs
│ │ ├── FileHash.cs
│ │ ├── FileTransfers.cs
│ │ ├── GenerationParametersConverter.cs
│ │ ├── HardwareInfo/
│ │ │ ├── CpuInfo.cs
│ │ │ ├── GpuInfo.cs
│ │ │ ├── HardwareHelper.cs
│ │ │ ├── MemoryInfo.cs
│ │ │ ├── MemoryLevel.cs
│ │ │ └── Win32MemoryStatusEx.cs
│ │ ├── IPrerequisiteHelper.cs
│ │ ├── ISharedFolders.cs
│ │ ├── ImageMetadata.cs
│ │ ├── LazyInstance.cs
│ │ ├── MinimumDelay.cs
│ │ ├── ModelCompatChecker.cs
│ │ ├── ModelFinder.cs
│ │ ├── MyTiffFile.cs
│ │ ├── ObjectHash.cs
│ │ ├── PlatformKind.cs
│ │ ├── ProcessTracker.cs
│ │ ├── PropertyComparer.cs
│ │ ├── ReaderWriterLockAdvanced.cs
│ │ ├── RemoteModels.cs
│ │ ├── SharedFolders.cs
│ │ ├── SharedFoldersConfigHelper.cs
│ │ ├── SharedFoldersConfigOptions.cs
│ │ ├── Size.cs
│ │ ├── SystemInfo.cs
│ │ ├── Utilities.cs
│ │ └── Webp/
│ │ └── WebpReader.cs
│ ├── Inference/
│ │ ├── ComfyClient.cs
│ │ ├── ComfyProgressUpdateEventArgs.cs
│ │ ├── ComfyTask.cs
│ │ └── InferenceClientBase.cs
│ ├── Models/
│ │ ├── Api/
│ │ │ ├── A3Options.cs
│ │ │ ├── CivitAccountStatusUpdateEventArgs.cs
│ │ │ ├── CivitBaseModelType.cs
│ │ │ ├── CivitCommercialUse.cs
│ │ │ ├── CivitCreator.cs
│ │ │ ├── CivitFile.cs
│ │ │ ├── CivitFileHashes.cs
│ │ │ ├── CivitFileMetadata.cs
│ │ │ ├── CivitFileType.cs
│ │ │ ├── CivitImage.cs
│ │ │ ├── CivitMetadata.cs
│ │ │ ├── CivitMode.cs
│ │ │ ├── CivitModel.cs
│ │ │ ├── CivitModelFormat.cs
│ │ │ ├── CivitModelFpType.cs
│ │ │ ├── CivitModelSize.cs
│ │ │ ├── CivitModelStats.cs
│ │ │ ├── CivitModelType.cs
│ │ │ ├── CivitModelVersion.cs
│ │ │ ├── CivitModelVersionResponse.cs
│ │ │ ├── CivitModelsRequest.cs
│ │ │ ├── CivitModelsResponse.cs
│ │ │ ├── CivitPeriod.cs
│ │ │ ├── CivitSortMode.cs
│ │ │ ├── CivitStats.cs
│ │ │ ├── CivitTRPC/
│ │ │ │ ├── CivitApiTokens.cs
│ │ │ │ ├── CivitGetUserByIdRequest.cs
│ │ │ │ ├── CivitGetUserByIdResponse.cs
│ │ │ │ ├── CivitImageGenerationDataResponse.cs
│ │ │ │ ├── CivitUserAccountResponse.cs
│ │ │ │ ├── CivitUserProfileRequest.cs
│ │ │ │ ├── CivitUserProfileResponse.cs
│ │ │ │ └── CivitUserToggleFavoriteModelRequest.cs
│ │ │ ├── Comfy/
│ │ │ │ ├── ComfyAuxPreprocessor.cs
│ │ │ │ ├── ComfyHistoryOutput.cs
│ │ │ │ ├── ComfyHistoryResponse.cs
│ │ │ │ ├── ComfyImage.cs
│ │ │ │ ├── ComfyInputInfo.cs
│ │ │ │ ├── ComfyObjectInfo.cs
│ │ │ │ ├── ComfyPromptRequest.cs
│ │ │ │ ├── ComfyPromptResponse.cs
│ │ │ │ ├── ComfySampler.cs
│ │ │ │ ├── ComfySamplerScheduler.cs
│ │ │ │ ├── ComfyScheduler.cs
│ │ │ │ ├── ComfyUploadImageResponse.cs
│ │ │ │ ├── ComfyUpscaler.cs
│ │ │ │ ├── ComfyUpscalerType.cs
│ │ │ │ ├── ComfyWebSocketResponse.cs
│ │ │ │ ├── ComfyWebSocketResponseType.cs
│ │ │ │ ├── ComfyWebSocketResponseUnion.cs
│ │ │ │ ├── NodeTypes/
│ │ │ │ │ ├── ConditioningConnections.cs
│ │ │ │ │ ├── ModelConnections.cs
│ │ │ │ │ ├── NodeConnectionBase.cs
│ │ │ │ │ ├── NodeConnections.cs
│ │ │ │ │ └── PrimaryNodeConnection.cs
│ │ │ │ ├── Nodes/
│ │ │ │ │ ├── ComfyNode.cs
│ │ │ │ │ ├── ComfyNodeBuilder.cs
│ │ │ │ │ ├── ComfyTypedNodeBase.cs
│ │ │ │ │ ├── IOutputNode.cs
│ │ │ │ │ ├── NamedComfyNode.cs
│ │ │ │ │ ├── NodeDictionary.cs
│ │ │ │ │ └── RerouteNode.cs
│ │ │ │ └── WebSocketData/
│ │ │ │ ├── ComfyStatus.cs
│ │ │ │ ├── ComfyStatusExecInfo.cs
│ │ │ │ ├── ComfyWebSocketExecutingData.cs
│ │ │ │ ├── ComfyWebSocketExecutionErrorData.cs
│ │ │ │ ├── ComfyWebSocketImageData.cs
│ │ │ │ ├── ComfyWebSocketProgressData.cs
│ │ │ │ └── ComfyWebSocketStatusData.cs
│ │ │ ├── HuggingFace/
│ │ │ │ └── HuggingFaceUser.cs
│ │ │ ├── HuggingFaceAccountStatusUpdateEventArgs.cs
│ │ │ ├── ImageResponse.cs
│ │ │ ├── Invoke/
│ │ │ │ ├── InstallModelRequest.cs
│ │ │ │ ├── ModelInstallResult.cs
│ │ │ │ └── ScanFolderResult.cs
│ │ │ ├── Lykos/
│ │ │ │ ├── Analytics/
│ │ │ │ │ ├── AnalyticsRequest.cs
│ │ │ │ │ ├── FirstTimeInstallAnalytics.cs
│ │ │ │ │ ├── LaunchAnalyticsRequest.cs
│ │ │ │ │ └── PackageInstallAnalyticsRequest.cs
│ │ │ │ ├── GetDownloadResponse.cs
│ │ │ │ ├── GetRecommendedModelsResponse.cs
│ │ │ │ ├── GetUserResponse.cs
│ │ │ │ ├── GoogleOAuthResponse.cs
│ │ │ │ ├── LykosAccount.cs
│ │ │ │ ├── LykosAccountStatusUpdateEventArgs.cs
│ │ │ │ ├── LykosAccountV1Tokens.cs
│ │ │ │ ├── LykosAccountV2Tokens.cs
│ │ │ │ ├── LykosRole.cs
│ │ │ │ ├── PostAccountRequest.cs
│ │ │ │ ├── PostLoginRefreshRequest.cs
│ │ │ │ ├── PostLoginRequest.cs
│ │ │ │ └── RecommendedModelsV2Response.cs
│ │ │ ├── OpenArt/
│ │ │ │ ├── NodesCount.cs
│ │ │ │ ├── OpenArtCreator.cs
│ │ │ │ ├── OpenArtDateTime.cs
│ │ │ │ ├── OpenArtDownloadRequest.cs
│ │ │ │ ├── OpenArtDownloadResponse.cs
│ │ │ │ ├── OpenArtFeedRequest.cs
│ │ │ │ ├── OpenArtSearchRequest.cs
│ │ │ │ ├── OpenArtSearchResponse.cs
│ │ │ │ ├── OpenArtSearchResult.cs
│ │ │ │ ├── OpenArtStats.cs
│ │ │ │ └── OpenArtThumbnail.cs
│ │ │ ├── OpenModelsDb/
│ │ │ │ ├── OpenModelDbArchitecture.cs
│ │ │ │ ├── OpenModelDbArchitecturesResponse.cs
│ │ │ │ ├── OpenModelDbImage.cs
│ │ │ │ ├── OpenModelDbKeyedModel.cs
│ │ │ │ ├── OpenModelDbModel.cs
│ │ │ │ ├── OpenModelDbModelsResponse.cs
│ │ │ │ ├── OpenModelDbResource.cs
│ │ │ │ ├── OpenModelDbTag.cs
│ │ │ │ └── OpenModelDbTagsResponse.cs
│ │ │ ├── ProgressRequest.cs
│ │ │ ├── ProgressResponse.cs
│ │ │ ├── Pypi/
│ │ │ │ ├── PyPiReleaseFile.cs
│ │ │ │ └── PyPiResponse.cs
│ │ │ └── TextToImageRequest.cs
│ │ ├── Base/
│ │ │ └── StringValue.cs
│ │ ├── CheckpointSortMode.cs
│ │ ├── CheckpointSortOptions.cs
│ │ ├── CivitPostDownloadContextAction.cs
│ │ ├── CivitaiResource.cs
│ │ ├── ComfyNodeMap.cs
│ │ ├── Configs/
│ │ │ ├── ApiOptions.cs
│ │ │ └── DebugOptions.cs
│ │ ├── ConnectedModelInfo.cs
│ │ ├── ConnectedModelSource.cs
│ │ ├── CustomVersion.cs
│ │ ├── Database/
│ │ │ ├── CivitBaseModelTypeCacheEntry.cs
│ │ │ ├── GitCommit.cs
│ │ │ ├── GithubCacheEntry.cs
│ │ │ ├── InferenceProjectEntry.cs
│ │ │ ├── LocalImageFile.cs
│ │ │ ├── LocalImageFileType.cs
│ │ │ ├── LocalModelFile.cs
│ │ │ ├── LocalModelFolder.cs
│ │ │ └── PyPiCacheEntry.cs
│ │ ├── DimensionStringComparer.cs
│ │ ├── DownloadPackageVersionOptions.cs
│ │ ├── EnvVarKeyPair.cs
│ │ ├── ExtraPackageCommand.cs
│ │ ├── FDS/
│ │ │ ├── ComfyUiSelfStartSettings.cs
│ │ │ └── StableSwarmSettings.cs
│ │ ├── FileInterfaces/
│ │ │ ├── DirectoryPath.cs
│ │ │ ├── FilePath.Fluent.cs
│ │ │ ├── FilePath.cs
│ │ │ ├── FileSystemPath.cs
│ │ │ ├── IPathObject.cs
│ │ │ └── TempDirectoryPath.cs
│ │ ├── FileSizeType.cs
│ │ ├── GenerationParameters.cs
│ │ ├── GitVersion.cs
│ │ ├── GlobalConfig.cs
│ │ ├── GlobalEncryptedSerializer.cs
│ │ ├── HybridModelFile.cs
│ │ ├── HybridModelType.cs
│ │ ├── IContextAction.cs
│ │ ├── IDownloadableResource.cs
│ │ ├── IHandleNavigation.cs
│ │ ├── ISearchText.cs
│ │ ├── IndexCollection.cs
│ │ ├── Inference/
│ │ │ ├── InferenceProjectType.cs
│ │ │ ├── LayerDiffuseMode.cs
│ │ │ ├── ModelLoader.cs
│ │ │ └── ModuleApplyStepTemporaryArgs.cs
│ │ ├── InferenceDefaults.cs
│ │ ├── InferenceRunCustomPromptEventArgs.cs
│ │ ├── InstalledPackage.cs
│ │ ├── InstalledPackageVersion.cs
│ │ ├── LaunchOption.cs
│ │ ├── LaunchOptionCard.cs
│ │ ├── LaunchOptionDefinition.cs
│ │ ├── LaunchOptionType.cs
│ │ ├── LicenseInfo.cs
│ │ ├── LoadState.cs
│ │ ├── ModelPostDownloadContextAction.cs
│ │ ├── ObservableHashSet.cs
│ │ ├── OrderedValue.cs
│ │ ├── PackageDifficulty.cs
│ │ ├── PackageModification/
│ │ │ ├── ActionPackageStep.cs
│ │ │ ├── AddInstalledPackageStep.cs
│ │ │ ├── DownloadOpenArtWorkflowStep.cs
│ │ │ ├── DownloadPackageVersionStep.cs
│ │ │ ├── ICancellablePackageStep.cs
│ │ │ ├── IPackageModificationRunner.cs
│ │ │ ├── ImportModelsStep.cs
│ │ │ ├── InstallExtensionStep.cs
│ │ │ ├── InstallNunchakuStep.cs
│ │ │ ├── InstallPackageStep.cs
│ │ │ ├── InstallSageAttentionStep.cs
│ │ │ ├── PackageModificationRunner.cs
│ │ │ ├── PackageStep.cs
│ │ │ ├── PipStep.cs
│ │ │ ├── ProcessStep.cs
│ │ │ ├── ScanMetadataStep.cs
│ │ │ ├── SetPackageInstallingStep.cs
│ │ │ ├── SetupModelFoldersStep.cs
│ │ │ ├── SetupOutputSharingStep.cs
│ │ │ ├── SetupPrerequisitesStep.cs
│ │ │ ├── UninstallExtensionStep.cs
│ │ │ ├── UpdateExtensionStep.cs
│ │ │ └── UpdatePackageStep.cs
│ │ ├── PackagePair.cs
│ │ ├── PackagePrerequisite.cs
│ │ ├── PackageType.cs
│ │ ├── PackageVersion.cs
│ │ ├── PackageVersionType.cs
│ │ ├── Packages/
│ │ │ ├── A3WebUI.cs
│ │ │ ├── AiToolkit.cs
│ │ │ ├── BaseGitPackage.cs
│ │ │ ├── BasePackage.cs
│ │ │ ├── Cogstudio.cs
│ │ │ ├── ComfyUI.cs
│ │ │ ├── ComfyZluda.cs
│ │ │ ├── Config/
│ │ │ │ ├── ConfigDefaultType.cs
│ │ │ │ ├── ConfigFileType.cs
│ │ │ │ ├── ConfigSharingOptions.cs
│ │ │ │ ├── FdsConfigSharingStrategy.cs
│ │ │ │ ├── IConfigSharingStrategy.cs
│ │ │ │ ├── JsonConfigSharingStrategy.cs
│ │ │ │ └── YamlConfigSharingStrategy.cs
│ │ │ ├── DankDiffusion.cs
│ │ │ ├── Extensions/
│ │ │ │ ├── A1111ExtensionManifest.cs
│ │ │ │ ├── ComfyExtensionManifest.cs
│ │ │ │ ├── ExtensionManifest.cs
│ │ │ │ ├── ExtensionPack.cs
│ │ │ │ ├── ExtensionSpecifier.cs
│ │ │ │ ├── GitPackageExtensionManager.cs
│ │ │ │ ├── IPackageExtensionManager.cs
│ │ │ │ ├── InstalledPackageExtension.cs
│ │ │ │ ├── PackageExtension.cs
│ │ │ │ ├── PackageExtensionVersion.cs
│ │ │ │ ├── SavedPackageExtension.cs
│ │ │ │ └── VladExtensionItem.cs
│ │ │ ├── FluxGym.cs
│ │ │ ├── FocusControlNet.cs
│ │ │ ├── Fooocus.cs
│ │ │ ├── FooocusMre.cs
│ │ │ ├── ForgeAmdGpu.cs
│ │ │ ├── ForgeClassic.cs
│ │ │ ├── ForgeNeo.cs
│ │ │ ├── FramePack.cs
│ │ │ ├── FramePackStudio.cs
│ │ │ ├── IArgParsable.cs
│ │ │ ├── InvokeAI.cs
│ │ │ ├── KohyaSs.cs
│ │ │ ├── Mashb1tFooocus.cs
│ │ │ ├── OneTrainer.cs
│ │ │ ├── Options/
│ │ │ │ ├── DownloadPackageOptions.cs
│ │ │ │ ├── InstallPackageOptions.cs
│ │ │ │ ├── PythonPackageOptions.cs
│ │ │ │ ├── RunPackageOptions.cs
│ │ │ │ └── UpdatePackageOptions.cs
│ │ │ ├── PackageVersionOptions.cs
│ │ │ ├── PackageVulnerability.cs
│ │ │ ├── PipInstallConfig.cs
│ │ │ ├── Reforge.cs
│ │ │ ├── RuinedFooocus.cs
│ │ │ ├── SDWebForge.cs
│ │ │ ├── Sdfx.cs
│ │ │ ├── SharedFolderLayout.cs
│ │ │ ├── SharedFolderLayoutRule.cs
│ │ │ ├── SimpleSDXL.cs
│ │ │ ├── StableDiffusionDirectMl.cs
│ │ │ ├── StableDiffusionUx.cs
│ │ │ ├── StableSwarm.cs
│ │ │ ├── UnknownPackage.cs
│ │ │ ├── VladAutomatic.cs
│ │ │ ├── VoltaML.cs
│ │ │ └── Wan2GP.cs
│ │ ├── Progress/
│ │ │ ├── ProgressItem.cs
│ │ │ ├── ProgressReport.cs
│ │ │ ├── ProgressState.cs
│ │ │ └── ProgressType.cs
│ │ ├── PromptSyntax/
│ │ │ ├── PromptNode.cs
│ │ │ ├── PromptSyntaxBuilder.cs
│ │ │ ├── PromptSyntaxTree.cs
│ │ │ └── TextSpan.cs
│ │ ├── RelayPropertyChangedEventArgs.cs
│ │ ├── RemoteResource.cs
│ │ ├── SafetensorMetadata.cs
│ │ ├── Secrets.cs
│ │ ├── Settings/
│ │ │ ├── AnalyticsSettings.cs
│ │ │ ├── GlobalSettings.cs
│ │ │ ├── HolidayMode.cs
│ │ │ ├── LastDownloadLocationInfo.cs
│ │ │ ├── LibrarySettings.cs
│ │ │ ├── ModelSearchOptions.cs
│ │ │ ├── NotificationKey.cs
│ │ │ ├── NotificationLevel.cs
│ │ │ ├── NotificationOption.cs
│ │ │ ├── NumberFormatMode.cs
│ │ │ ├── Settings.cs
│ │ │ ├── SettingsTransaction.cs
│ │ │ ├── Size.cs
│ │ │ ├── TeachingTip.cs
│ │ │ └── WindowSettings.cs
│ │ ├── SharedFolderMethod.cs
│ │ ├── SharedFolderType.cs
│ │ ├── SharedOutputType.cs
│ │ ├── StringValue.cs
│ │ ├── TaskResult.cs
│ │ ├── Tokens/
│ │ │ ├── PromptExtraNetwork.cs
│ │ │ └── PromptExtraNetworkType.cs
│ │ ├── TorchIndex.cs
│ │ ├── TrackedDownload.cs
│ │ ├── UnknownInstalledPackage.cs
│ │ └── Update/
│ │ ├── UpdateChannel.cs
│ │ ├── UpdateInfo.cs
│ │ ├── UpdateManifest.cs
│ │ ├── UpdatePlatforms.cs
│ │ └── UpdateType.cs
│ ├── Processes/
│ │ ├── AnsiCommand.cs
│ │ ├── AnsiParser.cs
│ │ ├── AnsiProcess.cs
│ │ ├── ApcMessage.cs
│ │ ├── ApcParser.cs
│ │ ├── ApcType.cs
│ │ ├── Argument.cs
│ │ ├── AsyncStreamReader.cs
│ │ ├── ProcessArgs.cs
│ │ ├── ProcessArgsBuilder.cs
│ │ ├── ProcessOutput.cs
│ │ ├── ProcessResult.cs
│ │ └── ProcessRunner.cs
│ ├── Python/
│ │ ├── ArgParser.cs
│ │ ├── IPyInstallationManager.cs
│ │ ├── IPyRunner.cs
│ │ ├── IPyVenvRunner.cs
│ │ ├── IUvManager.cs
│ │ ├── Interop/
│ │ │ └── PyIOStream.cs
│ │ ├── MajorMinorVersion.cs
│ │ ├── PipIndexResult.cs
│ │ ├── PipInstallArgs.cs
│ │ ├── PipPackageInfo.cs
│ │ ├── PipPackageSpecifier.cs
│ │ ├── PipPackageSpecifierOverride.cs
│ │ ├── PipPackageSpecifierOverrideAction.cs
│ │ ├── PipShowResult.cs
│ │ ├── PyBaseInstall.cs
│ │ ├── PyInstallation.cs
│ │ ├── PyInstallationManager.cs
│ │ ├── PyRunner.cs
│ │ ├── PyVenvRunner.cs
│ │ ├── PyVersion.cs
│ │ ├── QueryTclTkLibraryResult.cs
│ │ ├── UvInstallArgs.cs
│ │ ├── UvManager.cs
│ │ ├── UvPackageSpecifier.cs
│ │ ├── UvPackageSpecifierOverride.cs
│ │ ├── UvPackageSpecifierOverrideAction.cs
│ │ ├── UvPythonInfo.cs
│ │ ├── UvPythonListEntry.cs
│ │ └── UvVenvRunner.cs
│ ├── ReparsePoints/
│ │ ├── DeviceIoControlCode.cs
│ │ ├── Junction.cs
│ │ ├── ReparseDataBuffer.cs
│ │ ├── Win32CreationDisposition.cs
│ │ ├── Win32ErrorCode.cs
│ │ ├── Win32FileAccess.cs
│ │ ├── Win32FileAttribute.cs
│ │ └── Win32FileShare.cs
│ ├── Services/
│ │ ├── DownloadService.cs
│ │ ├── IDownloadService.cs
│ │ ├── IImageIndexService.cs
│ │ ├── IMetadataImportService.cs
│ │ ├── IModelIndexService.cs
│ │ ├── IPipWheelService.cs
│ │ ├── ISecretsManager.cs
│ │ ├── ISettingsManager.cs
│ │ ├── ITrackedDownloadService.cs
│ │ ├── ImageIndexService.cs
│ │ ├── MetadataImportService.cs
│ │ ├── ModelIndexService.cs
│ │ ├── OpenModelDbManager.cs
│ │ ├── PipWheelService.cs
│ │ ├── SecretsManager.cs
│ │ ├── SettingsManager.cs
│ │ └── TrackedDownloadService.cs
│ ├── StabilityMatrix.Core.csproj
│ ├── StabilityMatrix.Core.csproj.DotSettings
│ ├── Updater/
│ │ ├── IUpdateHelper.cs
│ │ ├── SignatureChecker.cs
│ │ ├── UpdateHelper.cs
│ │ └── UpdateStatusChangedEventArgs.cs
│ └── Validators/
│ └── RequiresMatchAttribute.cs
├── StabilityMatrix.Native/
│ ├── NativeFileOperations.cs
│ └── StabilityMatrix.Native.csproj
├── StabilityMatrix.Native.Abstractions/
│ ├── INativeRecycleBinProvider.cs
│ ├── NativeFileOperationFlags.cs
│ └── StabilityMatrix.Native.Abstractions.csproj
├── StabilityMatrix.Native.Windows/
│ ├── AssemblyInfo.cs
│ ├── FileOperations/
│ │ └── FileOperationWrapper.cs
│ ├── GlobalUsings.cs
│ ├── Interop/
│ │ ├── ComReleaser.cs
│ │ ├── FileOperationFlags.cs
│ │ ├── FileOperationProgressSinkTcs.cs
│ │ ├── IFileOperation.cs
│ │ ├── IFileOperationProgressSink.cs
│ │ ├── IShellItem.cs
│ │ ├── IShellItemArray.cs
│ │ └── SIGDN.cs
│ ├── NativeRecycleBinProvider.cs
│ └── StabilityMatrix.Native.Windows.csproj
├── StabilityMatrix.Native.macOS/
│ ├── AssemblyInfo.cs
│ ├── NativeRecycleBinProvider.cs
│ └── StabilityMatrix.Native.macOS.csproj
├── StabilityMatrix.Tests/
│ ├── Avalonia/
│ │ ├── CheckpointFileViewModelTests.cs
│ │ ├── Converters/
│ │ │ └── NullableDefaultNumericConverterTests.cs
│ │ ├── DesignDataTests.cs
│ │ ├── FileNameFormatProviderTests.cs
│ │ ├── FileNameFormatTests.cs
│ │ ├── LoadableViewModelBaseTests.cs
│ │ ├── PromptTests.cs
│ │ └── UpdateViewModelTests.cs
│ ├── Core/
│ │ ├── AnsiParserTests.cs
│ │ ├── AsyncStreamReaderTests.cs
│ │ ├── DefaultUnknownEnumConverterTests.cs
│ │ ├── FileSystemPathTests.cs
│ │ ├── GlobalEncryptedSerializerTests.cs
│ │ ├── ModelIndexServiceTests.cs
│ │ ├── PipInstallArgsTests.cs
│ │ ├── PipShowResultsTests.cs
│ │ └── ServiceProviderExtensionsTests.cs
│ ├── Helper/
│ │ ├── EventManagerTests.cs
│ │ ├── ImageProcessorTests.cs
│ │ └── PackageFactoryTests.cs
│ ├── Models/
│ │ ├── GenerationParametersTests.cs
│ │ ├── InstalledPackageTests.cs
│ │ ├── LocalModelFileTests.cs
│ │ ├── Packages/
│ │ │ ├── PackageHelper.cs
│ │ │ ├── PackageLinkTests.cs
│ │ │ └── SharedFolderConfigHelperTests.cs
│ │ ├── ProcessArgsTests.cs
│ │ ├── SafetensorMetadataTests.cs
│ │ └── SharedFoldersTests.cs
│ ├── Native/
│ │ └── NativeRecycleBinProviderTests.cs
│ ├── ReparsePoints/
│ │ └── JunctionTests.cs
│ ├── StabilityMatrix.Tests.csproj
│ ├── TempFiles.cs
│ └── Usings.cs
├── StabilityMatrix.UITests/
│ ├── Attributes/
│ │ └── TestPriorityAttribute.cs
│ ├── Extensions/
│ │ ├── VisualExtensions.cs
│ │ └── WindowExtensions.cs
│ ├── MainWindowTests.cs
│ ├── ModelBrowser/
│ │ └── CivitAiBrowserTests.cs
│ ├── ModuleInit.cs
│ ├── PriorityOrderer.cs
│ ├── Snapshots/
│ │ ├── MainWindowTests.MainWindowViewModel_ShouldOk.verified.txt
│ │ └── MainWindowTests.MainWindow_ShouldOpen.verified.txt
│ ├── StabilityMatrix.UITests.csproj
│ ├── TempDirFixture.cs
│ ├── TestAppBuilder.cs
│ ├── TestBase.cs
│ ├── Usings.cs
│ ├── VerifyConfig.cs
│ └── WaitHelper.cs
├── StabilityMatrix.sln
├── StabilityMatrix.sln.DotSettings
├── Tools/
│ ├── ConvertAttributes.csx
│ └── add_resx_strings.py
├── analyzers/
│ ├── StabilityMatrix.Analyzers/
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ ├── StabilityMatrix.Analyzers.csproj
│ │ └── ViewModelControlConventionAnalyzer.cs
│ └── StabilityMatrix.Analyzers.CodeFixes/
│ ├── ControlMustInheritBaseFixProvider.cs
│ ├── DocumentEditorExtensions.cs
│ ├── MissingViewAttributeFixProvider.cs
│ └── StabilityMatrix.Analyzers.CodeFixes.csproj
└── global.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .aiexclude
================================================
# Docs
LICENSE
CHANGELOG.md
# Legacy
StabilityMatrix/
# Tests
*.verified.*
# Misc projects
StabilityMatrix.Native/
StabilityMatrix.Native.*/
StabilityMatrix.Avalonia.Diagnostics/
StabilityMatrix.Avalonia.Diagnostics/
StabilityMatrix.UITests/
# Vendored
Avalonia.Gif/
# Configs
*.editorconfig
*.DotSettings
# Assets
*.svg
StabilityMatrix.Avalonia/Assets/Fonts/
StabilityMatrix.Avalonia/Assets/linux-x64/
StabilityMatrix.Avalonia/Assets/macos-arm64/
StabilityMatrix.Avalonia/Assets/win-x64/
================================================
FILE: .backportrc.json
================================================
{
"sourceBranch": "dev",
"targetBranch": "main",
"mainline": 1,
"fork": false,
"targetPRLabels": ["backport"],
"prTitle": "[{{sourceBranch}} to {{targetBranch}}] backport: {{sourcePullRequest.title}} ({{sourcePullRequest.number}})"
}
================================================
FILE: .config/.csharpierrc.json
================================================
{
"printWidth": 110,
"preprocessorSymbolSets": ["", "DEBUG", "DEBUG,CODE_STYLE"]
}
================================================
FILE: .config/dotnet-tools.json
================================================
{
"version": 1,
"isRoot": true,
"tools": {
"husky": {
"version": "0.7.2",
"commands": [
"husky"
],
"rollForward": false
},
"xamlstyler.console": {
"version": "3.2404.2",
"commands": [
"xstyler"
],
"rollForward": false
},
"csharpier": {
"version": "1.0.1",
"commands": [
"csharpier"
],
"rollForward": false
},
"refitter": {
"version": "1.4.1",
"commands": [
"refitter"
],
"rollForward": false
},
"dotnet-script": {
"version": "1.6.0",
"commands": [
"dotnet-script"
],
"rollForward": false
}
}
}
================================================
FILE: .csharpierrc.yaml
================================================
printWidth: 110
================================================
FILE: .editorconfig
================================================
root = true
[*.cs]
max_line_length = 120
csharp_style_var_for_built_in_types = true:suggestion
dotnet_sort_system_directives_first = true
# ReSharper properties
resharper_csharp_max_line_length = 120
resharper_place_field_attribute_on_same_line = false
# dotnet code quality
# noinspection EditorConfigKeyCorrectness
dotnet_code_quality.ca1826.exclude_ordefault_methods = true
# Microsoft .NET properties
csharp_new_line_before_members_in_object_initializers = false
csharp_preferred_modifier_order = public, private, protected, internal, file, static, new, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion
csharp_style_prefer_utf8_string_literals = true:suggestion
csharp_style_var_elsewhere = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
dotnet_naming_rule.private_constants_rule.import_to_resharper = True
dotnet_naming_rule.private_constants_rule.resharper_description = Constant fields (private)
dotnet_naming_rule.private_constants_rule.resharper_guid = 236f7aa5-7b06-43ca-bf2a-9b31bfcff09a
dotnet_naming_rule.private_constants_rule.severity = warning
dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style
dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols
dotnet_naming_rule.private_instance_fields_rule.import_to_resharper = True
dotnet_naming_rule.private_instance_fields_rule.resharper_description = Instance fields (private)
dotnet_naming_rule.private_instance_fields_rule.resharper_guid = 4a98fdf6-7d98-4f5a-afeb-ea44ad98c70c
dotnet_naming_rule.private_instance_fields_rule.resharper_style = aaBb, _ + aaBb
dotnet_naming_rule.private_instance_fields_rule.severity = warning
dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style_1
dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols
dotnet_naming_rule.private_static_fields_rule.import_to_resharper = True
dotnet_naming_rule.private_static_fields_rule.resharper_description = Static fields (private)
dotnet_naming_rule.private_static_fields_rule.resharper_guid = f9fce829-e6f4-4cb2-80f1-5497c44f51df
dotnet_naming_rule.private_static_fields_rule.severity = warning
dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style
dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols
dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = True
dotnet_naming_rule.private_static_readonly_rule.resharper_description = Static readonly fields (private)
dotnet_naming_rule.private_static_readonly_rule.resharper_guid = 15b5b1f1-457c-4ca6-b278-5615aedc07d3
dotnet_naming_rule.private_static_readonly_rule.severity = warning
dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style
dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols
dotnet_naming_style.lower_camel_case_style.capitalization = camel_case
dotnet_naming_style.lower_camel_case_style.required_prefix = _
dotnet_naming_style.lower_camel_case_style_1.capitalization = camel_case
dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case
dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private
dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field
dotnet_naming_symbols.private_constants_symbols.required_modifiers = const
dotnet_naming_symbols.private_constants_symbols.resharper_applicable_kinds = constant_field
dotnet_naming_symbols.private_constants_symbols.resharper_required_modifiers = any
dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private
dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field
dotnet_naming_symbols.private_instance_fields_symbols.resharper_applicable_kinds = field,readonly_field
dotnet_naming_symbols.private_instance_fields_symbols.resharper_required_modifiers = instance
dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private
dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field
dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static
dotnet_naming_symbols.private_static_fields_symbols.resharper_applicable_kinds = field
dotnet_naming_symbols.private_static_fields_symbols.resharper_required_modifiers = static
dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private
dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field
dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = readonly,static
dotnet_naming_symbols.private_static_readonly_symbols.resharper_applicable_kinds = readonly_field
dotnet_naming_symbols.private_static_readonly_symbols.resharper_required_modifiers = static
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
================================================
FILE: .github/FUNDING.yml
================================================
patreon: StabilityMatrix
ko_fi: StabilityMatrix
================================================
FILE: .github/ISSUE_TEMPLATE/1-bug.yml
================================================
name: Bug report
description: Submit a bug report
labels: ["bug", "triage"]
body:
- type: markdown
attributes:
value: |
**New to Stability Matrix?**
For help or advice on using Stability Matrix, try one of the following options instead of opening a GitHub issue:
- Asking on our [Discord server](https://link.lykos.ai/discord?ref=github-issue-template)
- Creating a post on [Discussions](https://github.com/LykosAI/StabilityMatrix/discussions)
This template is for reporting bugs experienced within the Stability Matrix app.
If your issue is regarding Package behavior when running it, or when installing or updating a specific Package, please use the [Package issue template](https://github.com/LykosAI/StabilityMatrix/issues/new/choose) instead.
Make sure to also search the [existing issues](https://github.com/LykosAI/StabilityMatrix/issues) to see if your issue has already been reported.
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Give a clear and concise description of what happened. Provide screenshots or videos of UI if necessary. Also tell us, what did you expect to happen?
placeholder: |
When dragging a model file into the ... page to import, I expected to see...
Instead, I saw...
validations:
required: true
- type: textarea
id: how-to-reproduce
attributes:
label: Steps to reproduce
description: Include a minimal step-by-step guide to reproduce the issue if possible.
placeholder: |
1. Open Stability Matrix
2. Go to the ... page
3. Click on the ... button
4. Expected to see ... open, but instead ...
- type: textarea
id: app-logs
attributes:
label: Relevant logs
description: Please copy and paste any relevant log output. (This will be automatically formatted, so no need for backticks.)
render: shell
- type: input
id: version
attributes:
label: Version
description: What version of Stability Matrix are you running? (Can be found at the bottom of the settings page)
placeholder: ex. v2.11.0
validations:
required: true
- type: dropdown
id: os-platform
attributes:
label: What Operating System are you using?
options:
- Windows
- macOS
- Linux
- Other
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/2-bug-crash.yml
================================================
name: Crash report
description: A crash of Stability Matrix, likely with the "An unexpected error occurred" dialog
labels: ["bug", "crash", "triage"]
body:
- type: markdown
attributes:
value: |
This template is for reporting crashes of Stability Matrix, likely with the "An unexpected error occurred" dialog.
If you are experiencing a different issue, please use the [Bug Report or Package Issue templates](https://github.com/LykosAI/StabilityMatrix/issues/new/choose).
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Give a clear and concise description of what happened. Include some minimal steps to reproducible the issue if possible.
placeholder: |
1. Open Stability Matrix
2. Go to the "..." page
3. Click on the "..." button
4. See the crash
validations:
required: true
- type: textarea
id: exception-details
attributes:
label: Exception Details
description: Please click the "Copy Details" button on the crash dialog and paste the details exactly as formatted here.
placeholder: |
## Exception
OperationCanceledException: Example Message
### Sentry ID
```
bc7da9b2fcc3e3568ceb81a72f3a128d
```
### Stack Trace
```
at StabilityMatrix.Avalonia.ViewModels.Settings.MainSettingsViewModel.DebugThrowException() in MainSettingsViewModel.cs:line 716
at CommunityToolkit.Mvvm.Input.RelayCommand.Execute(Object parameter)
...
```
- type: input
id: version
attributes:
label: Version
description: What version of Stability Matrix are you running? (Can be found at the bottom of the settings page)
placeholder: ex. v2.11.0
validations:
required: true
- type: dropdown
id: os-platform
attributes:
label: What Operating System are you using?
options:
- Windows
- macOS
- Linux
- Other
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/3-bug-package.yml
================================================
name: Package issue
description: Report an issue with installing, updating, or running a Package
labels: ["bug", "area: package", "triage"]
body:
- type: markdown
attributes:
value: |
**Experiencing an issue while running a Package?**
Make sure to also search the GitHub issues of the Package, to see if your issue has already been reported and being worked on by upstream authors.
- type: textarea
id: package-details
attributes:
label: Package
description: Provide the name of the Package you are experiencing issues with
placeholder: ex. `ComfyUI`
validations:
required: true
- type: dropdown
id: package-issue-phase
attributes:
label: When did the issue occur?
options:
- Installing the Package
- Updating the Package
- Running the Package
- Other
validations:
required: true
- type: input
id: hardware
attributes:
label: What GPU / hardware type are you using?
description: Installed dependencies and Package features often depend on the GPU or hardware type you are using.
placeholder: ex. Nvidia 2080 Super with CUDA, AMD Radeon VII, etc.
validations:
required: true
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Give a clear and concise description of what happened. Provide screenshots if necessary. Also tell us, what did you expect to happen?
validations:
required: true
- type: textarea
id: console-output
attributes:
label: Console output
description: Please copy and paste any console output or error messages. For failed install or updates, locate the progress on the bottom left, open the dialog, and click on "More Details" to copy the full console output.
placeholder: |
```
Unpacking...
Successfully built lycoris_lora
Installing collected packages: library, tomlkit, onnx, ml-dtypes, onnxruntime-gpu
Running setup.py develop for library
Attempting uninstall: onnx
Found existing installation: onnx 1.14.1
...
```
- type: input
id: version
attributes:
label: Version
description: What version of Stability Matrix are you running? (Can be found at the bottom of the settings page)
placeholder: ex. v2.11.0
validations:
required: true
- type: dropdown
id: os-platform
attributes:
label: What Operating System are you using?
options:
- Windows
- macOS
- Linux
- Other
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/4-feature-request.yml
================================================
name: Feature or enhancement
description: Submit a proposal for a new Stability Matrix feature or enhancement
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Consider first discussing your idea on our [Discord server](https://link.lykos.ai/discord?ref=github-issue-template) to get feedback from the developers and the community.
- type: textarea
id: proposal
attributes:
label: Proposal
description: Explain your idea for a new feature or enhancement. Include any relevant details or links to resources like Package documentation.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Getting help
url: https://link.lykos.ai/discord?ref=github-issue-template
about: Ask questions about using Stability Matrix and get tips on using Packages on our Discord server
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
================================================
FILE: .github/workflows/backport.yml
================================================
name: Automatic Backport
on:
pull_request:
types: ["closed", "labeled"]
jobs:
backport:
if: ${{ (github.event.pull_request.merged == true) && (contains(github.event.pull_request.labels.*.name, 'backport-to-main') == true) }}
name: Backport PR
runs-on: ubuntu-latest
steps:
# Get the merge target branch to decide mainline number
# git cherry-pick mainline is 1 for merge to 'dev', else 2
- name: Get target branch
run: echo "CP_MAINLINE=$(if [ '${{ github.event.pull_request.base.ref }}' == 'dev' ]; then echo 1; else echo 2; fi)" >> $GITHUB_ENV
- name: Write json
id: create-json
uses: jsdaniell/create-json@v1.2.3
with:
name: ".backportrc.json"
json: |
{
"targetPRLabels": ["backport"],
"mainline": ${{ env.CP_MAINLINE }},
"commitConflicts": "true",
"prTitle": "[{{sourceBranch}} to {{targetBranch}}] backport: {{sourcePullRequest.title}} ({{sourcePullRequest.number}})"
}
- name: Backport Action
uses: sorenlouv/backport-github-action@v9.5.1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
auto_backport_label_prefix: backport-to-
- name: Info log
if: ${{ success() }}
run: cat ~/.backport/backport.info.log
- name: Debug log
if: ${{ failure() }}
run: cat ~/.backport/backport.debug.log
================================================
FILE: .github/workflows/build.yml
================================================
name: Build
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
concurrency:
group: build-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
if: github.repository == 'LykosAI/StabilityMatrix'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '9.0.x'
- name: Install dependencies
run: dotnet restore
- name: Test
run: dotnet test StabilityMatrix.Tests
- name: Build
run: >
dotnet publish ./StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
-o out -c Release -r linux-x64
--self-contained
================================================
FILE: .github/workflows/cla.yml
================================================
name: "CLA Assistant"
on:
issue_comment:
types: [created]
pull_request_target:
types: [opened,closed,synchronize]
# explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings
permissions:
actions: write
contents: write
pull-requests: write
statuses: write
jobs:
CLAAssistant:
if: github.repository == 'LykosAI/StabilityMatrix'
runs-on: ubuntu-latest
steps:
- name: "CLA Assistant"
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
uses: contributor-assistant/github-action@v2.3.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# the below token should have repo scope and must be manually added by you in the repository's secret
# This token is required only if you have configured to store the signatures in a remote repository/organization
PERSONAL_ACCESS_TOKEN: ${{ secrets.CLA_CONFIG_ACCESS_TOKEN }}
with:
path-to-signatures: 'signatures/version1/cla.json'
path-to-document: 'https://lykos.ai/cla'
# branch should not be protected
branch: 'main'
allowlist: ionite34,mohnjiles,bot*
# the followings are the optional inputs - If the optional inputs are not given, then default values will be taken
remote-organization-name: LykosAI
remote-repository-name: clabot-config
custom-allsigned-prcomment: '**CLA Assistant bot** All Contributors have signed the CLA.'
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
permissions:
contents: write
on:
workflow_dispatch:
inputs:
version:
type: string
required: true
description: Version (Semver without leading v)
sentry-release:
type: boolean
description: Make Sentry Release?
default: true
github-release:
type: boolean
description: Make GitHub Release?
default: true
github-release-draft:
type: boolean
description: Mark GitHub Release as Draft?
default: false
github-release-prerelease:
type: boolean
description: Mark GitHub Release as Prerelease?
default: false
auto-update-release:
type: boolean
description: Release auto-update?
default: false
auto-update-release-mode:
type: choice
description: Release auto-update mode
options:
- github url
- upload to b2
auto-update-release-channel:
type: choice
description: Release auto-update channel
options:
- stable
- preview
- development
test-release-artifacts:
type: boolean
description: "[Debug] Test release artifacts?"
default: false
jobs:
release-linux:
name: Release (linux-x64)
env:
platform-id: linux-x64
out-name: StabilityMatrix.AppImage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: olegtarasov/get-tag@v2.1.2
if: github.event_name == 'release'
id: tag_name
with:
tagRegex: "v(.*)"
- name: Set Version from Tag
if: github.event_name == 'release'
run: |
echo "Using tag ${{ env.GIT_TAG_NAME }}"
echo "RELEASE_VERSION=${{ env.GIT_TAG_NAME }}" >> $GITHUB_ENV
- name: Set Version from manual input
if: github.event_name == 'workflow_dispatch'
run: |
echo "Using version ${{ github.event.inputs.version }}"
echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
- name: Set up .NET 9
uses: actions/setup-dotnet@v3
with:
# Net 8 needed for PupNet
dotnet-version: |
8.0.x
9.0.x
- name: Install PupNet
run: |
sudo apt-get -y install libfuse2
dotnet tool install -g KuiperZone.PupNet --version 1.8.0
- name: PupNet Build
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: pupnet -r linux-x64 -c Release --kind appimage --app-version $RELEASE_VERSION --clean -y
- name: Post Build
run: mv ./Release/linux-x64/StabilityMatrix.x86_64.AppImage ${{ env.out-name }}
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: StabilityMatrix-${{ env.platform-id }}
path: ${{ env.out-name }}
retention-days: 1
if-no-files-found: error
- name: Create Sentry release
if: ${{ github.event.inputs.sentry-release == 'true' }}
uses: getsentry/action-release@v1
env:
MAKE_SENTRY_RELEASE: ${{ secrets.SENTRY_PROJECT != '' }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
with:
environment: production
ignore_missing: true
ignore_empty: true
version: StabilityMatrix.Avalonia@${{ github.event.inputs.version }}
release-windows:
name: Release (win-x64)
env:
platform-id: win-x64
out-name: StabilityMatrix.exe
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- uses: olegtarasov/get-tag@v2.1.2
if: github.event_name == 'release'
id: tag_name
with:
tagRegex: "v(.*)"
- name: Set Version from Tag
if: github.event_name == 'release'
run: |
echo "Using tag ${{ env.GIT_TAG_NAME }}"
echo "RELEASE_VERSION=${{ env.GIT_TAG_NAME }}" >> $env:GITHUB_ENV
- name: Set Version from manual input
if: github.event_name == 'workflow_dispatch'
run: |
echo "Using version ${{ github.event.inputs.version }}"
echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> $env:GITHUB_ENV
- name: Set up .NET 9
uses: actions/setup-dotnet@v3
with:
dotnet-version: '9.0.x'
- name: Install dependencies
run: dotnet restore
- name: .NET Publish
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: >
dotnet publish ./StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
-o out -c Release -r ${{ env.platform-id }}
-p:Version=$env:RELEASE_VERSION
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
-p:PublishReadyToRun=true
-p:SentryOrg=${{ secrets.SENTRY_ORG }} -p:SentryProject=${{ secrets.SENTRY_PROJECT }}
-p:SentryUploadSymbols=true -p:SentryUploadSources=true
- name: Post Build
run: mv ./out/StabilityMatrix.Avalonia.exe ./out/${{ env.out-name }}
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: StabilityMatrix-${{ env.platform-id }}
path: ./out/${{ env.out-name }}
retention-days: 1
if-no-files-found: error
release-macos:
name: Release (macos-arm64)
env:
platform-id: osx-arm64
app-name: "Stability Matrix.app"
out-name: "StabilityMatrix-macos-arm64.dmg"
runs-on: macos-14
steps:
- uses: actions/checkout@v3
- uses: olegtarasov/get-tag@v2.1.2
if: github.event_name == 'release'
id: tag_name
with:
tagRegex: "v(.*)"
- name: Set Version from Tag
if: github.event_name == 'release'
run: |
echo "Using tag ${{ env.GIT_TAG_NAME }}"
echo "RELEASE_VERSION=${{ env.GIT_TAG_NAME }}" >> $GITHUB_ENV
- name: Set Version from manual input
if: github.event_name == 'workflow_dispatch'
run: |
echo "Using version ${{ github.event.inputs.version }}"
echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
- name: Set up .NET 9
uses: actions/setup-dotnet@v3
with:
dotnet-version: '9.0.x'
- name: Install dependencies
run: dotnet restore -p:PublishReadyToRun=true
- name: Check Version
run: echo $RELEASE_VERSION
- name: .NET Msbuild (App)
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: >
dotnet msbuild ./StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
-t:BundleApp -p:UseAppHost=true -p:SelfContained=true
-p:Configuration=Release -p:RuntimeIdentifier=${{ env.platform-id }}
-p:Version=$RELEASE_VERSION
-p:PublishDir=out
-p:PublishReadyToRun=true
-p:CFBundleShortVersionString=$RELEASE_VERSION
-p:CFBundleName="Stability Matrix"
-p:CFBundleDisplayName="Stability Matrix"
-p:CFBundleVersion=$RELEASE_VERSION
-p:SentryOrg=${{ secrets.SENTRY_ORG }} -p:SentryProject=${{ secrets.SENTRY_PROJECT }}
-p:SentryUploadSymbols=true -p:SentryUploadSources=true
- name: Post Build (App)
run: mkdir -p signing && mv "./StabilityMatrix.Avalonia/out/Stability Matrix.app" "./signing/${{ env.app-name }}"
- name: Codesign app bundle
env:
MACOS_CERTIFICATE: ${{ secrets.PROD_MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}
MACOS_CERTIFICATE_NAME: ${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}
MACOS_CI_KEYCHAIN_PWD: ${{ secrets.PROD_MACOS_CI_KEYCHAIN_PWD }}
run: ./Build/codesign_macos.sh "./signing/${{ env.app-name }}"
- name: Notarize app bundle
env:
MACOS_NOTARIZATION_APPLE_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}
MACOS_NOTARIZATION_TEAM_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}
MACOS_NOTARIZATION_PWD: ${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}
run: ./Build/notarize_macos.sh "./signing/${{ env.app-name }}"
- name: Zip Artifact (App)
working-directory: signing
run: zip -r -y "../StabilityMatrix-${{ env.platform-id }}-app.zip" "${{ env.app-name }}"
- name: Upload Artifact (App)
uses: actions/upload-artifact@v4
with:
name: StabilityMatrix-${{ env.platform-id }}-app
path: StabilityMatrix-${{ env.platform-id }}-app.zip
retention-days: 1
if-no-files-found: error
- uses: actions/setup-node@v4
with:
node-version: '20.11.x'
- name: Install dependencies for dmg creation
run: brew install graphicsmagick imagemagick && npm install --global create-dmg
- name: Create dmg
working-directory: signing
run: >
create-dmg "${{ env.app-name }}" --overwrite --identity "${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}"
- name: Rename dmg
working-directory: signing
run: mv "$(find . -type f -name "*.dmg")" "${{ env.out-name }}"
- name: Zip Artifact (dmg)
working-directory: signing
run: zip -r -y "../StabilityMatrix-${{ env.platform-id }}-dmg.zip" "${{ env.out-name }}"
- name: Upload Artifact (dmg)
uses: actions/upload-artifact@v4
with:
name: StabilityMatrix-${{ env.platform-id }}-dmg
path: StabilityMatrix-${{ env.platform-id }}-dmg.zip
retention-days: 1
if-no-files-found: error
publish-release:
name: Publish GitHub Release
needs: [ release-linux, release-windows, release-macos ]
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.github-release == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Extract Release Notes
id: release_notes
run: |
RELEASE_NOTES="$(awk -v version="${{ github.event.inputs.version }}" '/## v/{if(p) exit; if($0 ~ version) p=1}; p' CHANGELOG.md)"
RELEASE_NOTES="${RELEASE_NOTES//'%'/'%25'}"
RELEASE_NOTES="${RELEASE_NOTES//$'\n'/'%0A'}"
RELEASE_NOTES="${RELEASE_NOTES//$'\r'/'%0D'}"
echo "::set-output name=release_notes::$RELEASE_NOTES"
# Downloads all previous artifacts to the current working directory
- name: Download Artifacts
uses: actions/download-artifact@v4
# Zip each build (except macos which is already dmg)
- name: Zip Artifacts
run: |
cd StabilityMatrix-win-x64 && zip -r ../StabilityMatrix-win-x64.zip ./. && cd $OLDPWD
cd StabilityMatrix-linux-x64 && zip -r ../StabilityMatrix-linux-x64.zip ./. && cd $OLDPWD
unzip "StabilityMatrix-osx-arm64-dmg/StabilityMatrix-osx-arm64-dmg.zip"
- name: Create Github Release
id: create_release
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
files: |
StabilityMatrix-win-x64.zip
StabilityMatrix-linux-x64.zip
StabilityMatrix-macos-arm64.dmg
fail_on_unmatched_files: true
tag_name: v${{ github.event.inputs.version }}
body: ${{ steps.release_notes.outputs.release_notes }}
draft: ${{ github.event.inputs.github-release-draft == 'true' }}
prerelease: ${{ github.event.inputs.github-release-prerelease == 'true' }}
test-artifacts:
name: Test Release Artifacts
needs: [ release-linux, release-windows, release-macos ]
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.test-release-artifacts == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Extract Release Notes
id: release_notes
run: |
RELEASE_NOTES="$(awk -v version="${{ github.event.inputs.version }}" '/## v/{if(p) exit; if($0 ~ version) p=1}; p' CHANGELOG.md)"
RELEASE_NOTES="${RELEASE_NOTES//'%'/'%25'}"
RELEASE_NOTES="${RELEASE_NOTES//$'\n'/'%0A'}"
RELEASE_NOTES="${RELEASE_NOTES//$'\r'/'%0D'}"
echo "::set-output name=release_notes::$RELEASE_NOTES"
echo "Release Notes:"
echo "$RELEASE_NOTES"
# Downloads all previous artifacts to the current working directory
- name: Download Artifacts
uses: actions/download-artifact@v4
# Zip each build (except macos which is already dmg)
- name: Zip Artifacts
run: |
cd StabilityMatrix-win-x64 && zip -r ../StabilityMatrix-win-x64.zip ./. && cd $OLDPWD
cd StabilityMatrix-linux-x64 && zip -r ../StabilityMatrix-linux-x64.zip ./. && cd $OLDPWD
unzip "StabilityMatrix-osx-arm64-dmg/StabilityMatrix-osx-arm64-dmg.zip"
# Check that the zips and CHANGELOG.md are in the current working directory
- name: Check files
run: |
if [ ! -f StabilityMatrix-win-x64.zip ]; then
echo "StabilityMatrix-win-x64.zip not found"
exit 1
else
echo "StabilityMatrix-win-x64.zip found"
sha256sum StabilityMatrix-win-x64.zip
fi
if [ ! -f StabilityMatrix-linux-x64.zip ]; then
echo "StabilityMatrix-linux-x64.zip not found"
exit 1
else
echo "StabilityMatrix-linux-x64.zip found"
sha256sum StabilityMatrix-linux-x64.zip
fi
if [ ! -f StabilityMatrix-macos-arm64.dmg ]; then
echo "StabilityMatrix-macos-arm64.dmg not found"
exit 1
else
echo "StabilityMatrix-macos-arm64.dmg found"
sha256sum StabilityMatrix-macos-arm64.dmg
fi
if [ ! -f CHANGELOG.md ]; then
echo "CHANGELOG.md not found"
exit 1
fi
publish-auto-update-github:
name: Publish Auto-Update Release (GitHub)
needs: [ release-linux, release-windows, release-macos, publish-release ]
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.auto-update-release == 'true' && github.event.inputs.auto-update-release-mode == 'github url' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set Version from manual input
run: |
echo "Using version ${{ github.event.inputs.version }}"
echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> $env:GITHUB_ENV
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Python Dependencies
run: pip install stability-matrix-tools>=0.3.0 --upgrade
- name: Publish Auto-Update Release
env:
SM_B2_API_ID: ${{ secrets.SM_B2_API_ID }}
SM_B2_API_KEY: ${{ secrets.SM_B2_API_KEY }}
SM_CF_CACHE_PURGE_TOKEN: ${{ secrets.SM_CF_CACHE_PURGE_TOKEN }}
SM_CF_ZONE_ID: ${{ secrets.SM_CF_ZONE_ID }}
SM_SIGNING_PRIVATE_KEY: ${{ secrets.SM_SIGNING_PRIVATE_KEY }}
run: sm-tools updates publish-matrix-v3 -v ${{ github.event.inputs.version }} -y
publish-auto-update-b2:
name: Publish Auto-Update Release (B2)
needs: [ release-linux, release-windows, release-macos ]
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.auto-update-release == 'true' && github.event.inputs.auto-update-release-mode == 'upload to b2' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set Version from manual input
run: |
echo "Using version ${{ github.event.inputs.version }}"
echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> $env:GITHUB_ENV
# Downloads all previous artifacts to the current working directory
- name: Download Artifacts
uses: actions/download-artifact@v4
# Zip each build (except macos which is already dmg)
- name: Zip Artifacts
run: |
cd StabilityMatrix-win-x64 && zip -r ../StabilityMatrix-win-x64.zip ./. && cd $OLDPWD
cd StabilityMatrix-linux-x64 && zip -r ../StabilityMatrix-linux-x64.zip ./. && cd $OLDPWD
unzip "StabilityMatrix-osx-arm64-dmg/StabilityMatrix-osx-arm64-dmg.zip"
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Python Dependencies
run: pip install stability-matrix-tools>=0.3.0 --upgrade
# Check that the zips and CHANGELOG.md are in the current working directory
- name: Check files
run: |
if [ ! -f StabilityMatrix-win-x64.zip ]; then
echo "StabilityMatrix-win-x64.zip not found"
exit 1
fi
if [ ! -f StabilityMatrix-linux-x64.zip ]; then
echo "StabilityMatrix-linux-x64.zip not found"
exit 1
fi
if [ ! -f StabilityMatrix-macos-arm64.dmg ]; then
echo "StabilityMatrix-macos-arm64.dmg not found"
exit 1
fi
if [ ! -f CHANGELOG.md ]; then
echo "CHANGELOG.md not found"
exit 1
fi
- name: Publish Auto-Update Release
env:
SM_B2_API_ID: ${{ secrets.SM_B2_API_ID }}
SM_B2_API_KEY: ${{ secrets.SM_B2_API_KEY }}
SM_CF_CACHE_PURGE_TOKEN: ${{ secrets.SM_CF_CACHE_PURGE_TOKEN }}
SM_CF_ZONE_ID: ${{ secrets.SM_CF_ZONE_ID }}
SM_SIGNING_PRIVATE_KEY: ${{ secrets.SM_SIGNING_PRIVATE_KEY }}
run: >
sm-tools updates publish-files-v3 -v ${{ github.event.inputs.version }}
--channel ${{ github.event.inputs.auto-update-release-channel }}
--changelog CHANGELOG.md
--win-x64 StabilityMatrix-win-x64.zip
--linux-x64 StabilityMatrix-linux-x64.zip
--macos-arm64 StabilityMatrix-macos-arm64.dmg
-y
================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues'
permissions:
issues: write
pull-requests: write
on:
workflow_dispatch:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is pending because it has been awaiting a response for 30 days with no activity. Remove the pending label or comment, else this will be closed in 7 days.'
close-issue-message: 'This issue was closed because it has been pending for 7 days with no activity.'
only-labels: 'awaiting-feedback'
stale-issue-label: 'pending'
exempt-issue-labels: 'planned,milestone,work-in-progress,enhancement,crash'
days-before-issue-stale: 30
days-before-issue-close: 7
days-before-pr-close: -1
days-before-pr-stale: -1
operations-per-run: 45
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Remove the stale label or comment, else this will be closed in 7 days.'
close-issue-message: 'This issue was closed because it has been stale for 7 days with no activity.'
stale-issue-label: 'stale'
exempt-issue-labels: 'planned,milestone,work-in-progress,enhancement,crash'
days-before-issue-stale: 60
days-before-issue-close: 7
days-before-pr-close: -1
days-before-pr-stale: -1
operations-per-run: 45
================================================
FILE: .github/workflows/test-ui.yml
================================================
name: UI Tests
on:
workflow_dispatch:
concurrency:
group: build-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
if: github.repository == 'LykosAI/StabilityMatrix' || github.event_name == 'workflow_dispatch'
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Set up .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '9.0.x'
- name: Install dependencies
run: dotnet restore
- name: Test
run: dotnet test StabilityMatrix.UITests
================================================
FILE: .github/workflows/version-bump.yml
================================================
name: Version Bump
on:
workflow_dispatch:
inputs:
version_mask:
type: string
description: Version Bump Mask
default: "0.0.1.0"
required: false
version_overwrite:
type: string
description: Version Overwrite Mask
default: "*.*.*.*"
required: false
jobs:
version-bump:
name: Version Bump
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET Core
uses: actions/setup-dotnet@v2
with:
dotnet-version: '8.0.x'
- name: Bump versions
uses: SiqiLu/dotnet-bump-version@2.0.0
with:
version_files: "**/*.csproj"
version_mask: ${{ github.event.inputs.version_mask }}
version_overwrite: ${{ github.event.inputs.version_overwrite }}
github_token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Rider
.idea/
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
[Oo]ut/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
!**/Models/Packages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
.husky/pre-commit
================================================
FILE: .husky/task-runner.json
================================================
{
"tasks": [
{
"name": "Run csharpier",
"group": "pre-commit",
"command": "dotnet",
"args": [ "csharpier", "format", "${staged}" ],
"include": [ "**/*.cs" ]
},
{
"name": "Run xamlstyler",
"group": "pre-commit",
"command": "dotnet",
"args": [ "xstyler", "-f", "${staged}" ],
"include": [ "**/*.axaml" ]
},
{
"name": "Run refitter for LykosAuthApi",
"group": "generate-openapi",
"command": "dotnet",
"args": ["refitter", "--settings-file", "./StabilityMatrix.Core/Api/LykosAuthApi/.refitter"]
},
{
"name": "Run refitter for PromptGenApi",
"group": "generate-promptgen-openapi",
"command": "dotnet",
"args": ["refitter", "--settings-file", "./StabilityMatrix.Core/Api/PromptGen/.refitter"]
}
]
}
================================================
FILE: Avalonia.Gif/Avalonia.Gif.csproj
================================================
latesttruetruetrue$(NoWarn);CS8765;CS8618;CS8625;CS0169
================================================
FILE: Avalonia.Gif/BgWorkerCommand.cs
================================================
namespace Avalonia.Gif
{
internal enum BgWorkerCommand
{
Null,
Play,
Pause,
Dispose
}
}
================================================
FILE: Avalonia.Gif/BgWorkerState.cs
================================================
namespace Avalonia.Gif
{
internal enum BgWorkerState
{
Null,
Start,
Running,
Paused,
Complete,
Dispose
}
}
================================================
FILE: Avalonia.Gif/Decoding/BlockTypes.cs
================================================
namespace Avalonia.Gif.Decoding
{
internal enum BlockTypes
{
Empty = 0,
Extension = 0x21,
ImageDescriptor = 0x2C,
Trailer = 0x3B,
}
}
================================================
FILE: Avalonia.Gif/Decoding/ExtensionType.cs
================================================
namespace Avalonia.Gif.Decoding
{
internal enum ExtensionType
{
GraphicsControl = 0xF9,
Application = 0xFF
}
}
================================================
FILE: Avalonia.Gif/Decoding/FrameDisposal.cs
================================================
namespace Avalonia.Gif.Decoding
{
public enum FrameDisposal
{
Unknown = 0,
Leave = 1,
Background = 2,
Restore = 3
}
}
================================================
FILE: Avalonia.Gif/Decoding/GifColor.cs
================================================
using System.Runtime.InteropServices;
namespace Avalonia.Gif
{
[StructLayout(LayoutKind.Explicit)]
public readonly struct GifColor
{
[FieldOffset(3)]
public readonly byte A;
[FieldOffset(2)]
public readonly byte R;
[FieldOffset(1)]
public readonly byte G;
[FieldOffset(0)]
public readonly byte B;
///
/// A struct that represents a ARGB color and is aligned as
/// a BGRA bytefield in memory.
///
/// Red
/// Green
/// Blue
/// Alpha
public GifColor(byte r, byte g, byte b, byte a = byte.MaxValue)
{
A = a;
R = r;
G = g;
B = b;
}
}
}
================================================
FILE: Avalonia.Gif/Decoding/GifDecoder.cs
================================================
// This source file's Lempel-Ziv-Welch algorithm is derived from Chromium's Android GifPlayer
// as seen here (https://github.com/chromium/chromium/blob/master/third_party/gif_player/src/jp/tomorrowkey/android/gifplayer)
// Licensed under the Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
// Copyright (C) 2015 The Gifplayer Authors. All Rights Reserved.
// The rest of the source file is licensed under MIT License.
// Copyright (C) 2018 Jumar A. Macato, All Rights Reserved.
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using Avalonia;
using Avalonia.Media.Imaging;
using static Avalonia.Gif.Extensions.StreamExtensions;
namespace Avalonia.Gif.Decoding
{
public sealed class GifDecoder : IDisposable
{
private static readonly ReadOnlyMemory G87AMagic = "GIF87a"u8.ToArray().AsMemory();
private static readonly ReadOnlyMemory G89AMagic = "GIF89a"u8.ToArray().AsMemory();
private static readonly ReadOnlyMemory NetscapeMagic = "NETSCAPE2.0"u8.ToArray().AsMemory();
private static readonly TimeSpan FrameDelayThreshold = TimeSpan.FromMilliseconds(10);
private static readonly TimeSpan FrameDelayDefault = TimeSpan.FromMilliseconds(100);
private static readonly GifColor TransparentColor = new(0, 0, 0, 0);
private static readonly int MaxTempBuf = 768;
private static readonly int MaxStackSize = 4096;
private static readonly int MaxBits = 4097;
private readonly Stream _fileStream;
private readonly CancellationToken _currentCtsToken;
private readonly bool _hasFrameBackups;
private int _gctSize,
_bgIndex,
_prevFrame = -1,
_backupFrame = -1;
private bool _gctUsed;
private GifRect _gifDimensions;
// private ulong _globalColorTable;
private readonly int _backBufferBytes;
private GifColor[] _bitmapBackBuffer;
private short[] _prefixBuf;
private byte[] _suffixBuf;
private byte[] _pixelStack;
private byte[] _indexBuf;
private byte[] _backupFrameIndexBuf;
private volatile bool _hasNewFrame;
public GifHeader Header { get; private set; }
public readonly List Frames = new();
public PixelSize Size => new PixelSize(Header.Dimensions.Width, Header.Dimensions.Height);
public GifDecoder(Stream fileStream, CancellationToken currentCtsToken)
{
_fileStream = fileStream;
_currentCtsToken = currentCtsToken;
ProcessHeaderData();
ProcessFrameData();
Header.IterationCount = Header.Iterations switch
{
-1 => new GifRepeatBehavior { Count = 1 },
0 => new GifRepeatBehavior { LoopForever = true },
> 0 => new GifRepeatBehavior { Count = Header.Iterations },
_ => Header.IterationCount
};
var pixelCount = _gifDimensions.TotalPixels;
_hasFrameBackups = Frames.Any(f => f.FrameDisposalMethod == FrameDisposal.Restore);
_bitmapBackBuffer = new GifColor[pixelCount];
_indexBuf = new byte[pixelCount];
if (_hasFrameBackups)
_backupFrameIndexBuf = new byte[pixelCount];
_prefixBuf = new short[MaxStackSize];
_suffixBuf = new byte[MaxStackSize];
_pixelStack = new byte[MaxStackSize + 1];
_backBufferBytes = pixelCount * Marshal.SizeOf(typeof(GifColor));
}
public void Dispose()
{
Frames.Clear();
_bitmapBackBuffer = null;
_prefixBuf = null;
_suffixBuf = null;
_pixelStack = null;
_indexBuf = null;
_backupFrameIndexBuf = null;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private int PixCoord(int x, int y) => x + y * _gifDimensions.Width;
static readonly (int Start, int Step)[] Pass = { (0, 8), (4, 8), (2, 4), (1, 2) };
private void ClearImage()
{
Array.Fill(_bitmapBackBuffer, TransparentColor);
//ClearArea(_gifDimensions);
_prevFrame = -1;
_backupFrame = -1;
}
public void RenderFrame(int fIndex, WriteableBitmap writeableBitmap, bool forceClear = false)
{
if (_currentCtsToken.IsCancellationRequested)
return;
if (fIndex < 0 | fIndex >= Frames.Count)
return;
if (_prevFrame == fIndex)
return;
if (fIndex == 0 || forceClear || fIndex < _prevFrame)
ClearImage();
DisposePreviousFrame();
_prevFrame++;
// render intermediate frame
for (int idx = _prevFrame; idx < fIndex; ++idx)
{
var prevFrame = Frames[idx];
if (prevFrame.FrameDisposalMethod == FrameDisposal.Restore)
continue;
if (prevFrame.FrameDisposalMethod == FrameDisposal.Background)
{
ClearArea(prevFrame.Dimensions);
continue;
}
RenderFrameAt(idx, writeableBitmap);
}
RenderFrameAt(fIndex, writeableBitmap);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void RenderFrameAt(int idx, WriteableBitmap writeableBitmap)
{
var tmpB = ArrayPool.Shared.Rent(MaxTempBuf);
var curFrame = Frames[idx];
DecompressFrameToIndexBuffer(curFrame, _indexBuf, tmpB);
if (_hasFrameBackups & curFrame.ShouldBackup)
{
Buffer.BlockCopy(_indexBuf, 0, _backupFrameIndexBuf, 0, curFrame.Dimensions.TotalPixels);
_backupFrame = idx;
}
DrawFrame(curFrame, _indexBuf);
_prevFrame = idx;
_hasNewFrame = true;
using var lockedBitmap = writeableBitmap.Lock();
WriteBackBufToFb(lockedBitmap.Address);
ArrayPool.Shared.Return(tmpB);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void DrawFrame(GifFrame curFrame, Memory frameIndexSpan)
{
var activeColorTable = curFrame.IsLocalColorTableUsed
? curFrame.LocalColorTable
: Header.GlobarColorTable;
var cX = curFrame.Dimensions.X;
var cY = curFrame.Dimensions.Y;
var cH = curFrame.Dimensions.Height;
var cW = curFrame.Dimensions.Width;
var tC = curFrame.TransparentColorIndex;
var hT = curFrame.HasTransparency;
if (curFrame.IsInterlaced)
{
for (var i = 0; i < 4; i++)
{
var curPass = Pass[i];
var y = curPass.Start;
while (y < cH)
{
DrawRow(y);
y += curPass.Step;
}
}
}
else
{
for (var i = 0; i < cH; i++)
DrawRow(i);
}
//for (var row = 0; row < cH; row++)
void DrawRow(int row)
{
// Get the starting point of the current row on frame's index stream.
var indexOffset = row * cW;
// Get the target backbuffer offset from the frames coords.
var targetOffset = PixCoord(cX, row + cY);
var len = _bitmapBackBuffer.Length;
for (var i = 0; i < cW; i++)
{
var indexColor = frameIndexSpan.Span[indexOffset + i];
if (
activeColorTable == null
|| targetOffset >= len
|| indexColor > activeColorTable.Length
)
return;
if (!(hT & indexColor == tC))
_bitmapBackBuffer[targetOffset] = activeColorTable[indexColor];
targetOffset++;
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void DisposePreviousFrame()
{
if (_prevFrame == -1)
return;
var prevFrame = Frames[_prevFrame];
switch (prevFrame.FrameDisposalMethod)
{
case FrameDisposal.Background:
ClearArea(prevFrame.Dimensions);
break;
case FrameDisposal.Restore:
if (_hasFrameBackups && _backupFrame != -1)
DrawFrame(Frames[_backupFrame], _backupFrameIndexBuf);
else
ClearArea(prevFrame.Dimensions);
break;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ClearArea(GifRect area)
{
for (var y = 0; y < area.Height; y++)
{
var targetOffset = PixCoord(area.X, y + area.Y);
for (var x = 0; x < area.Width; x++)
_bitmapBackBuffer[targetOffset + x] = TransparentColor;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void DecompressFrameToIndexBuffer(GifFrame curFrame, Span indexSpan, byte[] tempBuf)
{
_fileStream.Position = curFrame.LzwStreamPosition;
var totalPixels = curFrame.Dimensions.TotalPixels;
// Initialize GIF data stream decoder.
var dataSize = curFrame.LzwMinCodeSize;
var clear = 1 << dataSize;
var endOfInformation = clear + 1;
var available = clear + 2;
var oldCode = -1;
var codeSize = dataSize + 1;
var codeMask = (1 << codeSize) - 1;
for (var code = 0; code < clear; code++)
{
_prefixBuf[code] = 0;
_suffixBuf[code] = (byte)code;
}
// Decode GIF pixel stream.
int bits,
first,
top,
pixelIndex;
var datum = bits = first = top = pixelIndex = 0;
while (pixelIndex < totalPixels)
{
var blockSize = _fileStream.ReadBlock(tempBuf);
if (blockSize == 0)
break;
var blockPos = 0;
while (blockPos < blockSize)
{
datum += tempBuf[blockPos] << bits;
blockPos++;
bits += 8;
while (bits >= codeSize)
{
// Get the next code.
var code = datum & codeMask;
datum >>= codeSize;
bits -= codeSize;
// Interpret the code
if (code == clear)
{
// Reset decoder.
codeSize = dataSize + 1;
codeMask = (1 << codeSize) - 1;
available = clear + 2;
oldCode = -1;
continue;
}
// Check for explicit end-of-stream
if (code == endOfInformation)
return;
if (oldCode == -1)
{
indexSpan[pixelIndex++] = _suffixBuf[code];
oldCode = code;
first = code;
continue;
}
var inCode = code;
if (code >= available)
{
_pixelStack[top++] = (byte)first;
code = oldCode;
if (top == MaxBits)
ThrowException();
}
while (code >= clear)
{
if (code >= MaxBits || code == _prefixBuf[code])
ThrowException();
_pixelStack[top++] = _suffixBuf[code];
code = _prefixBuf[code];
if (top == MaxBits)
ThrowException();
}
first = _suffixBuf[code];
_pixelStack[top++] = (byte)first;
// Add new code to the dictionary
if (available < MaxStackSize)
{
_prefixBuf[available] = (short)oldCode;
_suffixBuf[available] = (byte)first;
available++;
if ((available & codeMask) == 0 && available < MaxStackSize)
{
codeSize++;
codeMask += available;
}
}
oldCode = inCode;
// Drain the pixel stack.
do
{
indexSpan[pixelIndex++] = _pixelStack[--top];
} while (top > 0);
}
}
}
while (pixelIndex < totalPixels)
indexSpan[pixelIndex++] = 0; // clear missing pixels
void ThrowException() => throw new LzwDecompressionException();
}
///
/// Directly copies the struct array to a bitmap IntPtr.
///
private void WriteBackBufToFb(IntPtr targetPointer)
{
if (_currentCtsToken.IsCancellationRequested)
return;
if (!(_hasNewFrame & _bitmapBackBuffer != null))
return;
unsafe
{
fixed (void* src = &_bitmapBackBuffer[0])
Buffer.MemoryCopy(
src,
targetPointer.ToPointer(),
(uint)_backBufferBytes,
(uint)_backBufferBytes
);
_hasNewFrame = false;
}
}
///
/// Processes GIF Header.
///
[MemberNotNull(nameof(Header))]
private void ProcessHeaderData()
{
var str = _fileStream;
var tmpB = ArrayPool.Shared.Rent(MaxTempBuf);
var tempBuf = tmpB.AsSpan();
var _ = str.Read(tmpB, 0, 6);
if (!tempBuf[..3].SequenceEqual(G87AMagic[..3].Span))
throw new InvalidGifStreamException("Not a GIF stream.");
if (!(tempBuf[..6].SequenceEqual(G87AMagic.Span) | tempBuf[..6].SequenceEqual(G89AMagic.Span)))
throw new InvalidGifStreamException(
"Unsupported GIF Version: " + Encoding.ASCII.GetString(tempBuf[..6].ToArray())
);
ProcessScreenDescriptor(tmpB);
Header = new GifHeader
{
Dimensions = _gifDimensions,
HasGlobalColorTable = _gctUsed,
// GlobalColorTableCacheID = _globalColorTable,
GlobarColorTable = ProcessColorTable(ref str, tmpB, _gctSize),
GlobalColorTableSize = _gctSize,
BackgroundColorIndex = _bgIndex,
HeaderSize = _fileStream.Position
};
ArrayPool.Shared.Return(tmpB);
}
///
/// Parses colors from file stream to target color table.
///
private static GifColor[] ProcessColorTable(ref Stream stream, byte[] rawBufSpan, int nColors)
{
var nBytes = 3 * nColors;
var target = new GifColor[nColors];
var n = stream.Read(rawBufSpan, 0, nBytes);
if (n < nBytes)
throw new InvalidOperationException("Wrong color table bytes.");
int i = 0,
j = 0;
while (i < nColors)
{
var r = rawBufSpan[j++];
var g = rawBufSpan[j++];
var b = rawBufSpan[j++];
target[i++] = new GifColor(r, g, b);
}
return target;
}
///
/// Parses screen and other GIF descriptors.
///
private void ProcessScreenDescriptor(byte[] tempBuf)
{
var width = _fileStream.ReadUShortS(tempBuf);
var height = _fileStream.ReadUShortS(tempBuf);
var packed = _fileStream.ReadByteS(tempBuf);
_gctUsed = (packed & 0x80) != 0;
_gctSize = 2 << (packed & 7);
_bgIndex = _fileStream.ReadByteS(tempBuf);
_gifDimensions = new GifRect(0, 0, width, height);
_fileStream.Skip(1);
}
///
/// Parses all frame data.
///
private void ProcessFrameData()
{
_fileStream.Position = Header.HeaderSize;
var tempBuf = ArrayPool.Shared.Rent(MaxTempBuf);
var terminate = false;
var curFrame = 0;
Frames.Add(new GifFrame());
do
{
var blockType = (BlockTypes)_fileStream.ReadByteS(tempBuf);
switch (blockType)
{
case BlockTypes.Empty:
break;
case BlockTypes.Extension:
ProcessExtensions(ref curFrame, tempBuf);
break;
case BlockTypes.ImageDescriptor:
ProcessImageDescriptor(ref curFrame, tempBuf);
_fileStream.SkipBlocks(tempBuf);
break;
case BlockTypes.Trailer:
Frames.RemoveAt(Frames.Count - 1);
terminate = true;
break;
default:
_fileStream.SkipBlocks(tempBuf);
break;
}
// Break the loop when the stream is not valid anymore.
if (_fileStream.Position >= _fileStream.Length & terminate == false)
throw new InvalidProgramException(
"Reach the end of the filestream without trailer block."
);
} while (!terminate);
ArrayPool.Shared.Return(tempBuf);
}
///
/// Parses GIF Image Descriptor Block.
///
private void ProcessImageDescriptor(ref int curFrame, byte[] tempBuf)
{
var str = _fileStream;
var currentFrame = Frames[curFrame];
// Parse frame dimensions.
var frameX = str.ReadUShortS(tempBuf);
var frameY = str.ReadUShortS(tempBuf);
var frameW = str.ReadUShortS(tempBuf);
var frameH = str.ReadUShortS(tempBuf);
frameW = (ushort)Math.Min(frameW, _gifDimensions.Width - frameX);
frameH = (ushort)Math.Min(frameH, _gifDimensions.Height - frameY);
currentFrame.Dimensions = new GifRect(frameX, frameY, frameW, frameH);
// Unpack interlace and lct info.
var packed = str.ReadByteS(tempBuf);
currentFrame.IsInterlaced = (packed & 0x40) != 0;
currentFrame.IsLocalColorTableUsed = (packed & 0x80) != 0;
currentFrame.LocalColorTableSize = (int)Math.Pow(2, (packed & 0x07) + 1);
if (currentFrame.IsLocalColorTableUsed)
currentFrame.LocalColorTable = ProcessColorTable(
ref str,
tempBuf,
currentFrame.LocalColorTableSize
);
currentFrame.LzwMinCodeSize = str.ReadByteS(tempBuf);
currentFrame.LzwStreamPosition = str.Position;
curFrame += 1;
Frames.Add(new GifFrame());
}
///
/// Parses GIF Extension Blocks.
///
private void ProcessExtensions(ref int curFrame, byte[] tempBuf)
{
var extType = (ExtensionType)_fileStream.ReadByteS(tempBuf);
switch (extType)
{
case ExtensionType.GraphicsControl:
_fileStream.ReadBlock(tempBuf);
var currentFrame = Frames[curFrame];
var packed = tempBuf[0];
currentFrame.FrameDisposalMethod = (FrameDisposal)((packed & 0x1c) >> 2);
if (
currentFrame.FrameDisposalMethod != FrameDisposal.Restore
&& currentFrame.FrameDisposalMethod != FrameDisposal.Background
)
currentFrame.ShouldBackup = true;
currentFrame.HasTransparency = (packed & 1) != 0;
currentFrame.FrameDelay = TimeSpan.FromMilliseconds(SpanToShort(tempBuf.AsSpan(1)) * 10);
if (currentFrame.FrameDelay <= FrameDelayThreshold)
currentFrame.FrameDelay = FrameDelayDefault;
currentFrame.TransparentColorIndex = tempBuf[3];
break;
case ExtensionType.Application:
var blockLen = _fileStream.ReadBlock(tempBuf);
var _ = tempBuf.AsSpan(0, blockLen);
var blockHeader = tempBuf.AsSpan(0, NetscapeMagic.Length);
if (blockHeader.SequenceEqual(NetscapeMagic.Span))
{
var count = 1;
while (count > 0)
count = _fileStream.ReadBlock(tempBuf);
var iterationCount = SpanToShort(tempBuf.AsSpan(1));
Header.Iterations = iterationCount;
}
else
_fileStream.SkipBlocks(tempBuf);
break;
default:
_fileStream.SkipBlocks(tempBuf);
break;
}
}
}
}
================================================
FILE: Avalonia.Gif/Decoding/GifFrame.cs
================================================
using System;
namespace Avalonia.Gif.Decoding
{
public class GifFrame
{
public bool HasTransparency,
IsInterlaced,
IsLocalColorTableUsed;
public byte TransparentColorIndex;
public int LzwMinCodeSize,
LocalColorTableSize;
public long LzwStreamPosition;
public TimeSpan FrameDelay;
public FrameDisposal FrameDisposalMethod;
public bool ShouldBackup;
public GifRect Dimensions;
public GifColor[] LocalColorTable;
}
}
================================================
FILE: Avalonia.Gif/Decoding/GifHeader.cs
================================================
// Licensed under the MIT License.
// Copyright (C) 2018 Jumar A. Macato, All Rights Reserved.
namespace Avalonia.Gif.Decoding
{
public class GifHeader
{
public bool HasGlobalColorTable;
public int GlobalColorTableSize;
public ulong GlobalColorTableCacheId;
public int BackgroundColorIndex;
public long HeaderSize;
internal int Iterations = -1;
public GifRepeatBehavior IterationCount;
public GifRect Dimensions;
private GifColor[] _globarColorTable;
public GifColor[] GlobarColorTable;
}
}
================================================
FILE: Avalonia.Gif/Decoding/GifRect.cs
================================================
namespace Avalonia.Gif.Decoding
{
public readonly struct GifRect
{
public int X { get; }
public int Y { get; }
public int Width { get; }
public int Height { get; }
public int TotalPixels { get; }
public GifRect(int x, int y, int width, int height)
{
X = x;
Y = y;
Width = width;
Height = height;
TotalPixels = width * height;
}
public static bool operator ==(GifRect a, GifRect b)
{
return a.X == b.X && a.Y == b.Y && a.Width == b.Width && a.Height == b.Height;
}
public static bool operator !=(GifRect a, GifRect b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
return this == (GifRect)obj;
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() | Width.GetHashCode() ^ Height.GetHashCode();
}
}
}
================================================
FILE: Avalonia.Gif/Decoding/GifRepeatBehavior.cs
================================================
namespace Avalonia.Gif.Decoding
{
public class GifRepeatBehavior
{
public bool LoopForever { get; set; }
public int? Count { get; set; }
}
}
================================================
FILE: Avalonia.Gif/Decoding/InvalidGifStreamException.cs
================================================
// Licensed under the MIT License.
// Copyright (C) 2018 Jumar A. Macato, All Rights Reserved.
namespace Avalonia.Gif.Decoding
{
[Serializable]
public class InvalidGifStreamException : Exception
{
public InvalidGifStreamException() { }
public InvalidGifStreamException(string message)
: base(message) { }
public InvalidGifStreamException(string message, Exception innerException)
: base(message, innerException) { }
}
}
================================================
FILE: Avalonia.Gif/Decoding/LzwDecompressionException.cs
================================================
// Licensed under the MIT License.
// Copyright (C) 2018 Jumar A. Macato, All Rights Reserved.
namespace Avalonia.Gif.Decoding
{
[Serializable]
public class LzwDecompressionException : Exception
{
public LzwDecompressionException() { }
public LzwDecompressionException(string message)
: base(message) { }
public LzwDecompressionException(string message, Exception innerException)
: base(message, innerException) { }
}
}
================================================
FILE: Avalonia.Gif/Extensions/StreamExtensions.cs
================================================
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
namespace Avalonia.Gif.Extensions
{
[DebuggerStepThrough]
internal static class StreamExtensions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ushort SpanToShort(Span b) => (ushort)(b[0] | (b[1] << 8));
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Skip(this Stream stream, long count)
{
stream.Position += count;
}
///
/// Read a Gif block from stream while advancing the position.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int ReadBlock(this Stream stream, byte[] tempBuf)
{
stream.Read(tempBuf, 0, 1);
var blockLength = (int)tempBuf[0];
if (blockLength > 0)
stream.Read(tempBuf, 0, blockLength);
// Guard against infinite loop.
if (stream.Position >= stream.Length)
throw new InvalidGifStreamException("Reach the end of the filestream without trailer block.");
return blockLength;
}
///
/// Skips GIF blocks until it encounters an empty block.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SkipBlocks(this Stream stream, byte[] tempBuf)
{
int blockLength;
do
{
stream.Read(tempBuf, 0, 1);
blockLength = tempBuf[0];
stream.Position += blockLength;
// Guard against infinite loop.
if (stream.Position >= stream.Length)
throw new InvalidGifStreamException("Reach the end of the filestream without trailer block.");
} while (blockLength > 0);
}
///
/// Read a from stream by providing a temporary buffer.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ushort ReadUShortS(this Stream stream, byte[] tempBuf)
{
stream.Read(tempBuf, 0, 2);
return SpanToShort(tempBuf);
}
///
/// Read a from stream by providing a temporary buffer.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static byte ReadByteS(this Stream stream, byte[] tempBuf)
{
stream.Read(tempBuf, 0, 1);
var finalVal = tempBuf[0];
return finalVal;
}
}
}
================================================
FILE: Avalonia.Gif/GifImage.cs
================================================
using System;
using System.IO;
using System.Numerics;
using Avalonia;
using Avalonia.Animation;
using Avalonia.Controls;
using Avalonia.Logging;
using Avalonia.Media;
using Avalonia.Rendering.Composition;
using Avalonia.VisualTree;
namespace Avalonia.Gif
{
public class GifImage : Control
{
public static readonly StyledProperty SourceUriRawProperty = AvaloniaProperty.Register<
GifImage,
string
>("SourceUriRaw");
public static readonly StyledProperty SourceUriProperty = AvaloniaProperty.Register<
GifImage,
Uri
>("SourceUri");
public static readonly StyledProperty SourceStreamProperty = AvaloniaProperty.Register<
GifImage,
Stream
>("SourceStream");
public static readonly StyledProperty IterationCountProperty =
AvaloniaProperty.Register("IterationCount", IterationCount.Infinite);
private IGifInstance? _gifInstance;
public static readonly StyledProperty StretchDirectionProperty =
AvaloniaProperty.Register("StretchDirection");
public static readonly StyledProperty StretchProperty = AvaloniaProperty.Register<
GifImage,
Stretch
>("Stretch");
private CompositionCustomVisual? _customVisual;
private object? _initialSource = null;
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
switch (change.Property.Name)
{
case nameof(SourceUriRaw):
case nameof(SourceUri):
case nameof(SourceStream):
SourceChanged(change);
break;
case nameof(Stretch):
case nameof(StretchDirection):
InvalidateArrange();
InvalidateMeasure();
Update();
break;
case nameof(IterationCount):
IterationCountChanged(change);
break;
case nameof(Bounds):
Update();
break;
}
base.OnPropertyChanged(change);
}
public string SourceUriRaw
{
get => GetValue(SourceUriRawProperty);
set => SetValue(SourceUriRawProperty, value);
}
public Uri SourceUri
{
get => GetValue(SourceUriProperty);
set => SetValue(SourceUriProperty, value);
}
public Stream SourceStream
{
get => GetValue(SourceStreamProperty);
set => SetValue(SourceStreamProperty, value);
}
public IterationCount IterationCount
{
get => GetValue(IterationCountProperty);
set => SetValue(IterationCountProperty, value);
}
public StretchDirection StretchDirection
{
get => GetValue(StretchDirectionProperty);
set => SetValue(StretchDirectionProperty, value);
}
public Stretch Stretch
{
get => GetValue(StretchProperty);
set => SetValue(StretchProperty, value);
}
private static void IterationCountChanged(AvaloniaPropertyChangedEventArgs e)
{
var image = e.Sender as GifImage;
if (image is null || e.NewValue is not IterationCount iterationCount)
return;
image.IterationCount = iterationCount;
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
var compositor = ElementComposition.GetElementVisual(this)?.Compositor;
if (compositor == null || _customVisual?.Compositor == compositor)
return;
_customVisual = compositor.CreateCustomVisual(new CustomVisualHandler());
ElementComposition.SetElementChildVisual(this, _customVisual);
_customVisual.SendHandlerMessage(CustomVisualHandler.StartMessage);
if (_initialSource is not null)
{
UpdateGifInstance(_initialSource);
_initialSource = null;
}
Update();
base.OnAttachedToVisualTree(e);
}
private void Update()
{
if (_customVisual is null || _gifInstance is null)
return;
var dpi = this.GetVisualRoot()?.RenderScaling ?? 1.0;
var sourceSize = _gifInstance.GifPixelSize.ToSize(dpi);
var viewPort = new Rect(Bounds.Size);
var scale = Stretch.CalculateScaling(Bounds.Size, sourceSize, StretchDirection);
var scaledSize = sourceSize * scale;
var destRect = viewPort.CenterRect(new Rect(scaledSize)).Intersect(viewPort);
if (Stretch == Stretch.None)
{
_customVisual.Size = new Vector2((float)sourceSize.Width, (float)sourceSize.Height);
}
else
{
_customVisual.Size = new Vector2((float)destRect.Size.Width, (float)destRect.Size.Height);
}
_customVisual.Offset = new Vector3((float)destRect.Position.X, (float)destRect.Position.Y, 0);
}
private class CustomVisualHandler : CompositionCustomVisualHandler
{
private TimeSpan _animationElapsed;
private TimeSpan? _lastServerTime;
private IGifInstance? _currentInstance;
private bool _running;
public static readonly object StopMessage = new(),
StartMessage = new();
public override void OnMessage(object message)
{
if (message == StartMessage)
{
_running = true;
_lastServerTime = null;
RegisterForNextAnimationFrameUpdate();
}
else if (message == StopMessage)
{
_running = false;
}
else if (message is IGifInstance instance)
{
_currentInstance?.Dispose();
_currentInstance = instance;
}
}
public override void OnAnimationFrameUpdate()
{
if (!_running)
return;
Invalidate();
RegisterForNextAnimationFrameUpdate();
}
public override void OnRender(ImmediateDrawingContext drawingContext)
{
if (_running)
{
if (_lastServerTime.HasValue)
_animationElapsed += (CompositionNow - _lastServerTime.Value);
_lastServerTime = CompositionNow;
}
try
{
if (_currentInstance is null || _currentInstance.IsDisposed)
return;
var bitmap = _currentInstance.ProcessFrameTime(_animationElapsed);
if (bitmap is not null)
{
drawingContext.DrawBitmap(
bitmap,
new Rect(_currentInstance.GifPixelSize.ToSize(1)),
GetRenderBounds()
);
}
}
catch (Exception e)
{
Logger.Sink?.Log(LogEventLevel.Error, "GifImage Renderer ", this, e.ToString());
}
}
}
///
/// Measures the control.
///
/// The available size.
/// The desired size of the control.
protected override Size MeasureOverride(Size availableSize)
{
var result = new Size();
var scaling = this.GetVisualRoot()?.RenderScaling ?? 1.0;
if (_gifInstance != null)
{
result = Stretch.CalculateSize(
availableSize,
_gifInstance.GifPixelSize.ToSize(scaling),
StretchDirection
);
}
return result;
}
///
protected override Size ArrangeOverride(Size finalSize)
{
if (_gifInstance is null)
return new Size();
var scaling = this.GetVisualRoot()?.RenderScaling ?? 1.0;
var sourceSize = _gifInstance.GifPixelSize.ToSize(scaling);
var result = Stretch.CalculateSize(finalSize, sourceSize);
return result;
}
private void SourceChanged(AvaloniaPropertyChangedEventArgs e)
{
if (
e.NewValue is null
|| (e.NewValue is string value && !Uri.IsWellFormedUriString(value, UriKind.Absolute))
)
{
return;
}
if (_customVisual is null)
{
_initialSource = e.NewValue;
return;
}
UpdateGifInstance(e.NewValue);
InvalidateArrange();
InvalidateMeasure();
Update();
}
private void UpdateGifInstance(object source)
{
_gifInstance?.Dispose();
try
{
_gifInstance = new WebpInstance(source);
// _gifInstance = new GifInstance(source);
_gifInstance.IterationCount = IterationCount;
_customVisual?.SendHandlerMessage(_gifInstance);
}
catch (Exception e)
{
Logger.Sink?.Log(LogEventLevel.Warning, "GifImage Update Source ", this, e.ToString());
}
}
}
}
================================================
FILE: Avalonia.Gif/GifInstance.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using Avalonia;
using Avalonia.Animation;
using Avalonia.Gif.Decoding;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using SkiaSharp;
namespace Avalonia.Gif
{
public class GifInstance : IGifInstance
{
public IterationCount IterationCount { get; set; }
public bool AutoStart { get; private set; } = true;
private readonly GifDecoder _gifDecoder;
private readonly WriteableBitmap? _targetBitmap;
private TimeSpan _totalTime;
private readonly List _frameTimes;
private uint _iterationCount;
private int _currentFrameIndex;
private readonly List _colorTableIdList;
public CancellationTokenSource CurrentCts { get; }
internal GifInstance(object newValue)
: this(
newValue switch
{
Stream s => s,
Uri u => GetStreamFromUri(u),
string str => GetStreamFromString(str),
_ => throw new InvalidDataException("Unsupported source object")
}
) { }
public GifInstance(string uri)
: this(GetStreamFromString(uri)) { }
public GifInstance(Uri uri)
: this(GetStreamFromUri(uri)) { }
public GifInstance(Stream currentStream)
{
if (!currentStream.CanSeek)
throw new InvalidDataException("The provided stream is not seekable.");
if (!currentStream.CanRead)
throw new InvalidOperationException("Can't read the stream provided.");
currentStream.Seek(0, SeekOrigin.Begin);
CurrentCts = new CancellationTokenSource();
_gifDecoder = new GifDecoder(currentStream, CurrentCts.Token);
var pixSize = new PixelSize(
_gifDecoder.Header.Dimensions.Width,
_gifDecoder.Header.Dimensions.Height
);
// Different on os: https://github.com/mono/SkiaSharp/issues/1492#issuecomment-689015409
// ReSharper disable once SwitchExpressionHandlesSomeKnownEnumValuesWithExceptionInDefault
var format = SKImageInfo.PlatformColorType switch
{
SKColorType.Bgra8888 => PixelFormat.Bgra8888,
SKColorType.Rgba8888 => PixelFormat.Rgba8888,
_
=> throw new NotSupportedException(
$"Unsupported color type: {SKImageInfo.PlatformColorType}"
)
};
_targetBitmap = new WriteableBitmap(pixSize, new Vector(96, 96), format, AlphaFormat.Opaque);
GifPixelSize = pixSize;
_totalTime = TimeSpan.Zero;
_frameTimes = _gifDecoder
.Frames.Select(frame =>
{
_totalTime = _totalTime.Add(frame.FrameDelay);
return _totalTime;
})
.ToList();
_gifDecoder.RenderFrame(0, _targetBitmap);
}
private static Stream GetStreamFromString(string str)
{
if (!Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out var res))
{
throw new InvalidCastException("The string provided can't be converted to URI.");
}
return GetStreamFromUri(res);
}
private static Stream GetStreamFromUri(Uri uri)
{
var uriString = uri.OriginalString.Trim();
if (!uriString.StartsWith("resm") && !uriString.StartsWith("avares"))
{
return new FileStream(uriString, FileMode.Open, FileAccess.Read);
}
return AssetLoader.Open(uri);
}
public int GifFrameCount => _frameTimes.Count;
public PixelSize GifPixelSize { get; }
public void Dispose()
{
IsDisposed = true;
CurrentCts.Cancel();
_targetBitmap?.Dispose();
}
public bool IsDisposed { get; private set; }
public WriteableBitmap? ProcessFrameTime(TimeSpan stopwatchElapsed)
{
if (!IterationCount.IsInfinite && _iterationCount > IterationCount.Value)
{
return null;
}
if (CurrentCts.IsCancellationRequested || _targetBitmap is null)
{
return null;
}
var elapsedTicks = stopwatchElapsed.Ticks;
var timeModulus = TimeSpan.FromTicks(elapsedTicks % _totalTime.Ticks);
var targetFrame = _frameTimes.FirstOrDefault(x => timeModulus < x);
var currentFrame = _frameTimes.IndexOf(targetFrame);
if (currentFrame == -1)
currentFrame = 0;
if (_currentFrameIndex == currentFrame)
return _targetBitmap;
_iterationCount = (uint)(elapsedTicks / _totalTime.Ticks);
return ProcessFrameIndex(currentFrame);
}
internal WriteableBitmap ProcessFrameIndex(int frameIndex)
{
_gifDecoder.RenderFrame(frameIndex, _targetBitmap!);
_currentFrameIndex = frameIndex;
return _targetBitmap!;
}
}
}
================================================
FILE: Avalonia.Gif/IGifInstance.cs
================================================
using Avalonia.Animation;
using Avalonia.Media.Imaging;
namespace Avalonia.Gif;
public interface IGifInstance : IDisposable
{
IterationCount IterationCount { get; set; }
bool AutoStart { get; }
CancellationTokenSource CurrentCts { get; }
int GifFrameCount { get; }
PixelSize GifPixelSize { get; }
bool IsDisposed { get; }
WriteableBitmap? ProcessFrameTime(TimeSpan stopwatchElapsed);
}
================================================
FILE: Avalonia.Gif/InvalidGifStreamException.cs
================================================
namespace Avalonia.Gif
{
[Serializable]
internal class InvalidGifStreamException : Exception
{
public InvalidGifStreamException() { }
public InvalidGifStreamException(string message)
: base(message) { }
public InvalidGifStreamException(string message, Exception innerException)
: base(message, innerException) { }
}
}
================================================
FILE: Avalonia.Gif/WebpInstance.cs
================================================
using Avalonia.Animation;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using SkiaSharp;
namespace Avalonia.Gif;
public class WebpInstance : IGifInstance
{
public IterationCount IterationCount { get; set; }
public bool AutoStart { get; private set; } = true;
private readonly WriteableBitmap? _targetBitmap;
private TimeSpan _totalTime;
private readonly List _frameTimes;
private uint _iterationCount;
private int _currentFrameIndex;
private SKCodec? _codec;
public CancellationTokenSource CurrentCts { get; }
internal WebpInstance(object newValue)
: this(
newValue switch
{
Stream s => s,
Uri u => GetStreamFromUri(u),
string str => GetStreamFromString(str),
_ => throw new InvalidDataException("Unsupported source object")
}
) { }
public WebpInstance(string uri)
: this(GetStreamFromString(uri)) { }
public WebpInstance(Uri uri)
: this(GetStreamFromUri(uri)) { }
public WebpInstance(Stream currentStream)
{
if (!currentStream.CanSeek)
throw new InvalidDataException("The provided stream is not seekable.");
if (!currentStream.CanRead)
throw new InvalidOperationException("Can't read the stream provided.");
currentStream.Seek(0, SeekOrigin.Begin);
CurrentCts = new CancellationTokenSource();
var managedStream = new SKManagedStream(currentStream);
_codec = SKCodec.Create(managedStream);
var pixSize = new PixelSize(_codec.Info.Width, _codec.Info.Height);
// Different on os: https://github.com/mono/SkiaSharp/issues/1492#issuecomment-689015409
// ReSharper disable once SwitchExpressionHandlesSomeKnownEnumValuesWithExceptionInDefault
var format = SKImageInfo.PlatformColorType switch
{
SKColorType.Bgra8888 => PixelFormat.Bgra8888,
SKColorType.Rgba8888 => PixelFormat.Rgba8888,
_ => throw new NotSupportedException($"Unsupported color type: {SKImageInfo.PlatformColorType}")
};
_targetBitmap = new WriteableBitmap(pixSize, new Vector(96, 96), format, AlphaFormat.Opaque);
GifPixelSize = pixSize;
_totalTime = TimeSpan.Zero;
_frameTimes = _codec
.FrameInfo.Select(frame =>
{
_totalTime = _totalTime.Add(TimeSpan.FromMilliseconds(frame.Duration));
return _totalTime;
})
.ToList();
RenderFrame(_codec, _targetBitmap, 0);
}
private static void RenderFrame(SKCodec codec, WriteableBitmap targetBitmap, int index)
{
codec.GetFrameInfo(index, out var frameInfo);
var info = new SKImageInfo(codec.Info.Width, codec.Info.Height);
var decodeInfo = info.WithAlphaType(frameInfo.AlphaType);
using var frameBuffer = targetBitmap.Lock();
var result = codec.GetPixels(decodeInfo, frameBuffer.Address, new SKCodecOptions(index));
if (result != SKCodecResult.Success)
throw new InvalidDataException($"Could not decode frame {index} of {codec.FrameCount}.");
}
private static void RenderFrame(SKCodec codec, WriteableBitmap targetBitmap, int index, int priorIndex)
{
codec.GetFrameInfo(index, out var frameInfo);
var info = new SKImageInfo(codec.Info.Width, codec.Info.Height);
var decodeInfo = info.WithAlphaType(frameInfo.AlphaType);
using var frameBuffer = targetBitmap.Lock();
var result = codec.GetPixels(decodeInfo, frameBuffer.Address, new SKCodecOptions(index, priorIndex));
if (result != SKCodecResult.Success)
throw new InvalidDataException($"Could not decode frame {index} of {codec.FrameCount}.");
}
private static Stream GetStreamFromString(string str)
{
if (!Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out var res))
{
throw new InvalidCastException("The string provided can't be converted to URI.");
}
return GetStreamFromUri(res);
}
private static Stream GetStreamFromUri(Uri uri)
{
var uriString = uri.OriginalString.Trim();
if (!uriString.StartsWith("resm") && !uriString.StartsWith("avares"))
{
// Local file
using var fs = new FileStream(uriString, FileMode.Open, FileAccess.Read);
// Copy to memory stream then return
var memoryStream = new MemoryStream();
fs.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
return memoryStream;
}
// Internal Avalonia resources
return AssetLoader.Open(uri);
}
public int GifFrameCount => _frameTimes.Count;
public PixelSize GifPixelSize { get; }
public void Dispose()
{
IsDisposed = true;
CurrentCts.Cancel();
_targetBitmap?.Dispose();
_codec?.Dispose();
}
public bool IsDisposed { get; private set; }
public WriteableBitmap? ProcessFrameTime(TimeSpan stopwatchElapsed)
{
if (!IterationCount.IsInfinite && _iterationCount > IterationCount.Value)
{
return null;
}
if (CurrentCts.IsCancellationRequested || _targetBitmap is null)
{
return null;
}
var elapsedTicks = stopwatchElapsed.Ticks;
var timeModulus = TimeSpan.FromTicks(elapsedTicks % _totalTime.Ticks);
var targetFrame = _frameTimes.FirstOrDefault(x => timeModulus < x);
var currentFrame = _frameTimes.IndexOf(targetFrame);
if (currentFrame == -1)
currentFrame = 0;
if (_currentFrameIndex == currentFrame)
return _targetBitmap;
_iterationCount = (uint)(elapsedTicks / _totalTime.Ticks);
return ProcessFrameIndex(currentFrame);
}
internal WriteableBitmap ProcessFrameIndex(int frameIndex)
{
if (_codec is null)
throw new InvalidOperationException("The codec is null.");
if (_targetBitmap is null)
throw new InvalidOperationException("The target bitmap is null.");
RenderFrame(_codec, _targetBitmap, frameIndex, _currentFrameIndex);
_currentFrameIndex = frameIndex;
return _targetBitmap;
}
}
================================================
FILE: Build/AppEntitlements.entitlements
================================================
com.apple.security.cs.allow-jit
================================================
FILE: Build/EmbeddedEntitlements.entitlements
================================================
com.apple.security.cs.allow-jitcom.apple.security.cs.allow-unsigned-executable-memorycom.apple.security.cs.disable-library-validation
================================================
FILE: Build/_utils.sh
================================================
#!/bin/bash
print_hyperlink() {
local url="$1"
local text="$2"
# macOS Terminal supports clickable links in the following format
printf "\033]8;;%s\a%s\033]8;;\a" "$url" "$text"
}
================================================
FILE: Build/build_macos_app.sh
================================================
#!/bin/bash
output_dir="$(pwd)/out/osx-arm64/"
app_name="Stability Matrix.app"
. "./_utils.sh" > /dev/null 2>&1 || . "${BASH_SOURCE%/*}/_utils.sh"
# Parse args
while getopts v: flag
do
case "${flag}" in
v)
version=${OPTARG}
;;
*)
echo "Invalid option: -$OPTARG" >&2
exit 2
;;
esac
done
shift $((OPTIND - 1))
echo $"Passing extra args to msbuild: $@"
set -e
# Build the app
dotnet \
msbuild \
StabilityMatrix.Avalonia \
-t:BundleApp \
-p:RuntimeIdentifier=osx-arm64 \
-p:UseAppHost=true \
-p:Configuration=Release \
-p:SelfContained=true \
-p:CFBundleName="Stability Matrix" \
-p:CFBundleDisplayName="Stability Matrix" \
-p:CFBundleVersion="$version" \
-p:CFBundleShortVersionString="$version" \
-p:PublishDir="${output_dir:?}/bin" \
"$@"
target_plist_path="${output_dir:?}/bin/${app_name:?}/Contents/Info.plist"
echo "> Checking Info.plist..."
file "${target_plist_path:?}"
plutil -lint "${target_plist_path:?}"
echo "> Copying app to output..."
# Delete existing file
rm -rf "${output_dir:?}/${app_name:?}"
# Copy the app out of bin
cp -r "${output_dir:?}/bin/${app_name:?}" "${output_dir:?}/${app_name:?}"
# Print output location
echo "[App Build Completed]"
print_hyperlink "file:///${output_dir:?}" "${output_dir:?}"
print_hyperlink "file:///${output_dir:?}/${app_name:?}" "${app_name:?}"
echo ""
================================================
FILE: Build/codesign_embedded_macos.sh
================================================
#!/bin/sh
echo "Signing file: $1"
# Setup keychain in CI
if [ -n "$CI" ]; then
# Turn our base64-encoded certificate back to a regular .p12 file
echo "$MACOS_CERTIFICATE" | base64 --decode -o certificate.p12
# We need to create a new keychain, otherwise using the certificate will prompt
# with a UI dialog asking for the certificate password, which we can't
# use in a headless CI environment
security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" build.keychain
security import certificate.p12 -k build.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_CI_KEYCHAIN_PWD" build.keychain
fi
# Sign all files
PARENT_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" || return ; pwd -P )
ENTITLEMENTS="$PARENT_PATH/EmbeddedEntitlements.entitlements"
echo "Using entitlements file: $ENTITLEMENTS"
# App
if [ "$1" == "*.app" ]; then
echo "[INFO] Signing app contents"
find "$1/Contents/MacOS/"|while read fname; do
if [[ -f $fname ]]; then
echo "[INFO] Signing $fname"
codesign --force --timestamp -s "$MACOS_CERTIFICATE_NAME" --options=runtime --entitlements "$ENTITLEMENTS" "$fname"
fi
done
echo "[INFO] Signing app file"
codesign --force --timestamp -s "$MACOS_CERTIFICATE_NAME" --options=runtime --entitlements "$ENTITLEMENTS" "$1" -v
# Directory
elif [ -d "$1" ]; then
echo "[INFO] Signing directory contents"
find "$1"|while read fname; do
if [[ -f $fname ]] && [[ ! $fname =~ /(*.(py|msg|enc))/ ]]; then
echo "[INFO] Signing $fname"
codesign --force --timestamp -s "$MACOS_CERTIFICATE_NAME" --options=runtime --entitlements "$ENTITLEMENTS" "$fname"
fi
done
# File
elif [ -f "$1" ]; then
echo "[INFO] Signing file"
codesign --force --timestamp -s "$MACOS_CERTIFICATE_NAME" --options=runtime --entitlements "$ENTITLEMENTS" "$1" -v
# Not matched
else
echo "[ERROR] Unknown file type"
exit 1
fi
================================================
FILE: Build/codesign_macos.sh
================================================
#!/bin/sh
echo "Signing file: $1"
# Setup keychain in CI
if [ -n "$CI" ]; then
# Turn our base64-encoded certificate back to a regular .p12 file
echo "$MACOS_CERTIFICATE" | base64 --decode -o certificate.p12
# We need to create a new keychain, otherwise using the certificate will prompt
# with a UI dialog asking for the certificate password, which we can't
# use in a headless CI environment
security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" build.keychain
security import certificate.p12 -k build.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_CI_KEYCHAIN_PWD" build.keychain
fi
# Sign all files
PARENT_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" || return ; pwd -P )
ENTITLEMENTS="$PARENT_PATH/AppEntitlements.entitlements"
echo "Using entitlements file: $ENTITLEMENTS"
find "$1/Contents/MacOS/"|while read fname; do
if [[ -f $fname ]]; then
echo "[INFO] Signing $fname"
codesign --force --timestamp -s "$MACOS_CERTIFICATE_NAME" --options=runtime --entitlements "$ENTITLEMENTS" "$fname"
fi
done
echo "[INFO] Signing app file"
codesign --force --timestamp -s "$MACOS_CERTIFICATE_NAME" --options=runtime --entitlements "$ENTITLEMENTS" "$1" -v
================================================
FILE: Build/notarize_macos.sh
================================================
#!/bin/sh
echo "Notarizing file: $1"
# Store the notarization credentials so that we can prevent a UI password dialog
# from blocking the CI
echo "Create keychain profile"
xcrun notarytool store-credentials "notarytool-profile" \
--apple-id "$MACOS_NOTARIZATION_APPLE_ID" \
--team-id "$MACOS_NOTARIZATION_TEAM_ID" \
--password "$MACOS_NOTARIZATION_PWD"
# We can't notarize an app bundle directly, but we need to compress it as an archive.
# Therefore, we create a zip file containing our app bundle, so that we can send it to the
# notarization service
echo "Creating temp notarization archive"
ditto -c -k --keepParent "$1" "notarization.zip"
# Here we send the notarization request to the Apple's Notarization service, waiting for the result.
# This typically takes a few seconds inside a CI environment, but it might take more depending on the App
# characteristics. Visit the Notarization docs for more information and strategies on how to optimize it if
# you're curious
echo "Notarize app"
xcrun notarytool submit "notarization.zip" --keychain-profile "notarytool-profile" --wait
# Finally, we need to "attach the staple" to our executable, which will allow our app to be
# validated by macOS even when an internet connection is not available.
echo "Attach staple"
xcrun stapler staple "$1"
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to Stability Matrix will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html).
## v2.15.6
### Added
- Added NVIDIA driver version warning when launching ComfyUI with CUDA 13.0 (cu130) and driver versions below 580.x
- Added legacy Python warning when launching InvokeAI installations using Python 3.10.11
- Added Tiled VAE Decode to the Inference video workflows - thanks to @NeuralFault!
### Changed
- Disabled update checking for legacy InvokeAI installations using Python 3.10.11
- Hide rating stars in the Civitai browser page if no rating is available
- Updated uv to v0.9.30
- Updated PortableGit to v2.52.0.windows.1
- Updated Sage/Triton/Nunchaku installers to use GitHub API to fetch latest releases
- Updated ComfyUI installations and updates to automatically install ComfyUI Manager
- Updated gfx110X Windows ROCm nightly index - thanks to @NeuralFault!
- Updated ComfyUI-Zluda install to more closely match the author's intended installation method - thanks to @NeuralFault!
- Updated Forge Classic installs/updates to use the upstream install script for better version compatibility with torch/sage/triton/nunchaku
- Backslashes can now be escaped in Inference prompts via `\\`
### Fixed
- Fixed parsing of escape sequences in Inference such as `\\`
- Fixed [#1546](https://github.com/LykosAI/StabilityMatrix/issues/1546), [#1541](https://github.com/LykosAI/StabilityMatrix/issues/1541) - "No module named 'pkg_resources'" error when installing Automatic1111/Forge/reForge packages
- Fixed [#1545](https://github.com/LykosAI/StabilityMatrix/issues/1545), [#1518](https://github.com/LykosAI/StabilityMatrix/issues/1518), [#1513](https://github.com/LykosAI/StabilityMatrix/issues/1513), [#1488](https://github.com/LykosAI/StabilityMatrix/issues/1488) - Forge Neo update breaking things
- Fixed [#1529](https://github.com/LykosAI/StabilityMatrix/issues/1529) - "Selected commit is null" error when installing packages and rate limited by GitHub
- Fixed [#1525](https://github.com/LykosAI/StabilityMatrix/issues/1525) - Crash after downloading a model
- Fixed [#1523](https://github.com/LykosAI/StabilityMatrix/issues/1523), [#1499](https://github.com/LykosAI/StabilityMatrix/issues/1499), [#1494](https://github.com/LykosAI/StabilityMatrix/issues/1494) - Automatic1111 using old stable diffusion repo
- Fixed [#1505](https://github.com/LykosAI/StabilityMatrix/issues/1505) - incorrect port argument for Wan2GP
- Possibly fix [#1502](https://github.com/LykosAI/StabilityMatrix/issues/1502) - English fonts not displaying correctly on Linux in Chinese environments
- Fixed [#1476](https://github.com/LykosAI/StabilityMatrix/issues/1476) - Incorrect shared output folder for Forge Classic/Neo
- Fixed [#1466](https://github.com/LykosAI/StabilityMatrix/issues/1466) - crash after moving portable install
- Fixed [#1445](https://github.com/LykosAI/StabilityMatrix/issues/1445) - Linux app updates not actually updating - thanks to @NeuralFault!
### Supporters
#### 🌟 Visionaries
To our stellar Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your generosity keeps this project thriving and gives us the confidence to tackle the big challenges. Thank you for being the foundation that makes it all possible!
#### 🚀 Pioneers
Shoutout to our incredible Pioneer crew for keeping the momentum going! Thank you to: **Szir777**, **Noah M**, **[USA]TechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Adam**, **Droolguy**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, **robek**, **Ghislain G**, **Phil R**, **Tundra Everquill**, and a warm welcome to our newest Pioneers: **Andrew B**, **snotty**, **Miguel A**, **SinthCore**, and **Ahmed S**!
## v2.15.5
### Added
- Added new package - [Wan2GP](https://github.com/deepbeepmeep/Wan2GP)
- Added [Stable Diffusion WebUI Forge - Neo](https://github.com/Haoming02/sd-webui-forge-classic/tree/neo) as a separate package for convenience
- Added Tiled VAE decoding as an Inference addon thanks to @NeuralFault!
- Added togglable `--uv` argument to the SD.Next launch options
### Changed
- Moved the original Stable Diffusion WebUI Forge to the "Legacy" packages tab due to inactivity
- Updated to cu130 torch index for ComfyUI installs with Nvidia GPUs
- Consolidated and fixed AMD GPU architecture detection
- Updated SageAttention installer to latest v2.2.0-windows.post4 version
- Updated torch index for Forge-based UIs to rocm6.4 / cu128 depending on GPU - thanks to @NeuralFault!
### Fixed
- Fixed [#1450](https://github.com/LykosAI/StabilityMatrix/issues/1450) - Older SD.Next not launching due to forced `--uv` argument
- Fixed duplicate custom node installations when installing workflows from the Workflow Browser - thanks again to @NeuralFault!
#### 🌟 Visionaries
To our incredible Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your generosity drives this project forward and helps us turn ideas into reality. Thank you for being such a vital part of Stability Matrix!
#### 🚀 Pioneers
A massive thank you to our Pioneer crew! Your support keeps the lights on and the updates flowing. Shoutout to: **Szir777**, **Noah M**, **[USA]TechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Adam**, **Droolguy**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, **robek**, **Phil R**, **Tundra Everquill**, **TheTekknician**, and a warm welcome to our new Pioneers, **Benjamin M** and **Ghislain G**!
## v2.15.4
### Changed
- Updated Early Access indicators in the Civitai Details page to be more visible
- Updated error message when attempting to download a website-generation-only model from Civitai
- Updated nunchaku installer to 1.0.2
- Updated Package Import dialog to have Python version selector
### Fixed
- Fixed [#1435](https://github.com/LykosAI/StabilityMatrix/issues/1435) - SwarmUI not launching due to missing dotnet
- Fixed various install and Inference issues with ComfyUI-Zluda - big thanks to @neural_fault for the PRs!
- Fixed sageattention version getting out of sync after torch updates in ComfyUI
- Potentially fixed issue where uv-managed Python versions would not appear in the version selector
### Supporters
#### 🌟 Visionaries
Our heartfelt thanks to the driving force behind our progress, our Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your incredible support is the fuel that powers our development, allowing us to tackle bugs and push forward with confidence.
#### 🚀 Pioneers
A huge shoutout to our amazing Pioneers, who keep the momentum going strong! Thank you for being our trusted crew on this journey: **Szir777**, **Noah M**, **USATechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Tundra Everquill**, **Adam**, **Droolguy**, **Philip R.**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, and **robek**!
## v2.15.3
### Changed
- Updated fallback rocm index for InvokeAI to rocm6.3
- Updated SwarmUI to launch via the launch script for better compatibility
### Fixed
- Fixed cuDNN frontend error on ComfyUI-Zluda startup (thanks @neural_fault!)
- Maybe finally actually fixed threading issue with the Python Packages dialog search box for real this time? (may fix [#1392](https://github.com/LykosAI/StabilityMatrix/issues/1392))
- Fixed potential install failures when moving duplicate files into shared model folders (may fix [#1393](https://github.com/LykosAI/StabilityMatrix/issues/1393))
- Fixed potential threading issues with the Inference image gallery (may fix [#1408](https://github.com/LykosAI/StabilityMatrix/issues/1408))
- Fixed [#1424](https://github.com/LykosAI/StabilityMatrix/issues/1424) - Civitai account 401 error when connecting accounts, updated for new API changes
### Supporters
#### 🌟 Visionaries
Our deepest gratitude to our Visionaries for their foundational support: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your commitment allows us to focus on the essential work of squashing bugs and improving stability, ensuring a rock-solid experience for everyone.
#### 🚀 Pioneers
A huge thank you to our incredible Pioneers for keeping the project on track! Your support is vital for these important refinement updates. Thank you to **Szir777**, **Noah M**, **USATechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Tundra Everquill**, **Adam**, **Droolguy**, **Philip R.**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, and a warm welcome to our newest Pioneer, **robek**!
## v2.15.2
### Changed
- Updated Avalonia to 11.3.7
### Fixed
- Fixed [#1409](https://github.com/LykosAI/StabilityMatrix/issues/1409) - incorrect triton version installed during FramePack install on non-Windows systems
- Fixed [#1410](https://github.com/LykosAI/StabilityMatrix/issues/1410) - crash when resizing Civitai model details page
- Fixed [#1417](https://github.com/LykosAI/StabilityMatrix/issues/1417), [#1419](https://github.com/LykosAI/StabilityMatrix/issues/1419) - unable to connect Inference to ComfyUI after updating to latest ComfyUI
- Fixed missing dependencies for ComfyUI API nodes
### Supporters
#### 🌟 Visionaries
Huge thanks to our incredible Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, **Ibixat**, and **whudunit**! You’re the reason Stability Matrix keeps pushing forward. Your support lights the path and keeps the dream alive.
#### 🚀 Pioneers
Shoutout to our amazing Pioneer crew: **Szir777**, **Tigon**, **Noah M**, **USATechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Tundra Everquill**, **Adam**, **Droolguy**, **Philip R.**, **ACTUALLY_the_Real_Willem_Dafoe**, and **takyamtom**! You help keep the gears turning and the magic flowing.
## v2.15.1
### Changed
- Upgraded ComfyUI-Zluda and Stable Diffusion WebUI AMDGPU Forge packages to install and use HIP SDK 6.4.2
- Changed ComfyUI torch index from `cu129` back to `cu128` for better compatibility with custom nodes
- Updated SageAttention installer to install v2.2.0-windows.post3
- Updated Nunchaku installer to install v1.0.1
- Updated Windows ROCm ComfyUI installs to use recommended environment variables by default
### Fixed
- Fixed [#1372](https://github.com/LykosAI/StabilityMatrix/issues/1372), [#1399](https://github.com/LykosAI/StabilityMatrix/issues/1399) - LiteAsyncException upon starting Stability Matrix v2.15.0
- Fixed [#1391](https://github.com/LykosAI/StabilityMatrix/issues/1391) - "Failed to parse" error when upgrading pip packages with extra index url
- Fixed [#1401](https://github.com/LykosAI/StabilityMatrix/issues/1401) - "Python was not found and/or failed to install" errors when path contains special characters
- Fixed [#1403](https://github.com/LykosAI/StabilityMatrix/issues/1403) - Checkpoint Manager filters not being saved correctly
- Fixed [#1411](https://github.com/LykosAI/StabilityMatrix/issues/1411) - SD.Next installs not using correct torch version
- Fixed "cannot access local variable 'job' where it is not associated with a value" error when running jobs in AI Toolkit
- Fixed Civitai browser not always returning at least 30 results when possible on initial search
- Fixed model browser crashing when downloading a file with invalid characters in the name
- Fixed model browser crashing when no author exists for a model
### Supporters
#### 🌟 Visionaries
To our guiding stars, the Visionaries! Thank you **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, **Ibixat**, and **whudunit**! While this release is focused on fixes and stability, your foundational support is what empowers us to build a reliable and robust platform for everyone.
#### 🚀 Pioneers
A huge round of applause for our fantastic Pioneers! Your steady support helps us smooth out the rough edges and deliver a better experience with every update. Our deepest thanks to: **Szir777**, **Tigon**, **Noah M**, **USATechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Tundra Everquill**, **Adam**, and **Droolguy**. We're also thrilled to welcome our newest Pioneers to the crew: **Philip R.**, **ACTUALLY_the_Real_Willem_Dafoe**, and **takyamtom**!
## v2.15.0
### Added
- Added new package - [AI Toolkit](https://github.com/ostris/ai-toolkit/)
- Added new package - [FramePack](https://github.com/lllyasviel/FramePack)
- Added new package - [FramePack Studio](https://github.com/colinurbs/FramePack-Studio)
- Added Python Version selector for all new package installs
- Added the ability to rename packages
- Added support for authenticated model downloads in the HuggingFace model browser. Visit Settings → Accounts to add your HuggingFace token.
- Added support for dragging-and-dropping Civitai-generated images into Inference to load metadata
- Added the ability to search by pasting an entire Civitai model URL into the search bar in the Civitai model browser
- Added "Clear Pip Cache" and "Clear uv Cache" commands to the Settings -> Embedded Python section
- Added settings to disable base models from appearing in the Checkpoint Manager and Civitai Model Browser base model selectors
- Added Inference "Favorite Dimensions" quick selector - editable in Settings → Inference, or click the 💾 button inside the dropdown
- Added setting for Inference dimension step change - the value the dimensions increase or decrease by when using the step buttons or scroll wheel in Inference
- Added "Install Nunchaku" option to the ComfyUI Package Commands menu
- Added "Select All" button to the Installed Extensions page
- Added experimental ROCm pytorch install for ComfyUI (non-Zluda) on Windows - requires a compatible AMD GPU
- Added base model type labels (SD1.5, SDXL, Flux, etc.) to Inference model selection boxes
- Added UNET shared folder link for SD.Next
- Added Manual Install button for installing Package extensions that aren't in the indexes
- Added Next and Previous buttons to the Civitai details page to navigate between results
- Added Negative Rejection Steering (NRS) by @reithan to Inference
- Added Wan 2.2 models to the HuggingFace tab of the model browser
- Added Tiled Encode/Decode options to FaceDetailer in Inference
- Added Ukrainian translation thanks to @r0ddty!
- Added Czech translation thanks to @PEKArt!
### Changed
🌟 Civitai Model Details: A Grand Reimagining! 🌟
- No more peering through a tiny window! Introducing a massive overhaul of the Civitai Model Details page, transforming it from a cramped dialog into a spacious, feature-rich hub for all your model exploration needs.
- We've listened to your howls for more, and now you can dive deep into every aspect of your favorite models with unprecedented clarity and control:
- Expansive View: The new full-page layout means all essential information, descriptions, and previews are laid out beautifully, banishing the old, restrictive dialog forever.
- Rich Details at a Glance: Author, base model, last updated, SHA hashes, file name overrides/patterns – everything you need, perfectly organized and always accessible.
- Overhauled Image Viewer: Enjoy a sleek, modern image viewer that includes Civitai metadata and supports zooming, panning, and full-screen viewing. No more squinting at tiny thumbnails!
- Integrated Inference Options: For supported models, adjust sampler, scheduler, steps, CFG Scale, width, and height directly from the details page, streamlining your workflow like never before!
----
- Updated all Python version management, virtual environment creation, and pip installs to use `uv` for improved reliability, compatibility, and speed
- You can now select release versions when installing ComfyUI
- You can no longer select branches when installing InvokeAI
- Updated InvokeAI install to use the intended install method (resolves [#1329](https://github.com/LykosAI/StabilityMatrix/issues/1329))
- Updated ComfyUI installs for AMD users on Linux to use the latest rocm6.3 torch index
- Updated ComfyUI-Zluda installs to use the newer install-n method (fixes [#1347](https://github.com/LykosAI/StabilityMatrix/issues/1347))
- Removed disclaimer from reForge since the author is now active again
- Updated git operations to better avoid conflicts
- Updated Japanese translation
- Civitai model browser image loading now uses dynamic resizing for better performance and a smoother scrolling experience
- Undo ComfyUI process tracking changes for now due to causing more issues than it solved
- Updated GPU parsing fallback on Linux systems to use the method provided by @irql-notlessorequal
- New installs of ComfyUI, SD.Next, and InvokeAI will now use Python 3.12, unless otherwise specified in the Advanced Options during installation
- New installs of all other packages will now use Python 3.10.18, unless otherwise specified in the Advanced Options during installation
- Updated ComfyUI installs for AMD users on Linux to use the latest rocm6.4 torch index
- Updated package delete confirmation dialog
### Fixed
- Fixed an error when packages and other processes exit before process tracking on windows can initialize
- Fixed "none" appearing in wildcard field when using Face Detailer in Inference
- Fixed [#1254](https://github.com/LykosAI/StabilityMatrix/issues/1254) - Unable to scroll samplers in Inference
- Fixed [#1294](https://github.com/LykosAI/StabilityMatrix/issues/1294) - Improper sorting of output folders in Output Browser
- Fixed [#1300](https://github.com/LykosAI/StabilityMatrix/issues/1300) - Git errors when installing Extension Packs
- Fixed [#1317](https://github.com/LykosAI/StabilityMatrix/issues/1317) - Inference missing GGUF text encoders
- Fixed [#1324](https://github.com/LykosAI/StabilityMatrix/issues/1324) - Window height slightly increasing every launch
- Fixed [#1357](https://github.com/LykosAI/StabilityMatrix/issues/1357) - Case insensitivity causing duplicate key exceptions on non-Windows systems
- Fixed [#1360](https://github.com/LykosAI/StabilityMatrix/issues/1360) - A1111 install not using correct torch for 5000-series GPUs
- Fixed [#1361](https://github.com/LykosAI/StabilityMatrix/issues/1361) - numpy and other Forge startup
- Fixed [#1365](https://github.com/LykosAI/StabilityMatrix/issues/1365) - Output folder list not updating when Refresh button clicked
### Supporters
#### 🌟 Visionaries
To our incredible Visionaries, the architects of our ambition: Your profound support is the powerhouse behind this massive v2.15.0 release. You don't just light the path; you fuel the entire journey, allowing us to build bigger, move faster, and turn bold ideas into reality. Our deepest gratitude to: **Waterclouds**, **Corey T**, **bluepopsicle**, **Bob S**, **Ibixat**, **whudunit**, and **TheTekknician**! We are immensely grateful for your trust and partnership in shaping the future of Stability Matrix. Thank you for everything!
#### 🚀 Pioneers
A heartfelt salute to our trailblazing Pioneers! Your consistent support helps us navigate the development landscape, ensuring we stay on the right track and can explore new frontiers. A huge thanks to: **tankfox**, **Mr. Unknown**, **Szir777**, **Tigon**, **Noah M**, **USATechDude**, **Thom**, **SeraphOfSalem**, and a special welcome to our newest Pioneers - **Desert Viber**, **Tundra Everquill**, **Adam**, and **Droolguy**! Thank you for being the vanguard of our community!
## v2.15.0-pre.2
### Added
- Added new package - [AI Toolkit](https://github.com/ostris/ai-toolkit/)
- Added Manual Install button for installing Package extensions that aren't in the indexes
- Added Next and Previous buttons to the Civitai details page to navigate between results
- Added Negative Rejection Steering (NRS) by @reithan to Inference
- Added Czech translation thanks to @PEKArt!
- Added Wan 2.2 models to the HuggingFace tab of the model browser
- Added Tiled Encode/Decode options to FaceDetailer in Inference
### Changed
- Brought back the "size remaining after download" tooltip in the new Civitai details page
- Updated ComfyUI installs for AMD users on Linux to use the latest rocm6.4 torch index
- Updated package delete confirmation dialog
### Fixed
- Fixed Inference custom step (e.g. HiresFix) Samplers potentially sharing state with other card UIs like model browser.
- Fixed extension manager failing to install extensions due to incorrect clone directory
- Fixed duplicate Python versions appearing in the Advanced Options when installing a package
- Fixed an error when packages and other processes exit before process tracking on windows can initialize
- Fixed "none" appearing in wildcard field when using Face Detailer in Inference
- Fixed [#1254](https://github.com/LykosAI/StabilityMatrix/issues/1254) - Unable to scroll samplers in Inference
- Fixed [#1294](https://github.com/LykosAI/StabilityMatrix/issues/1294) - Improper sorting of output folders in Output Browser
- Fixed [#1300](https://github.com/LykosAI/StabilityMatrix/issues/1300) - Git errors when installing Extension Packs
- Fixed [#1317](https://github.com/LykosAI/StabilityMatrix/issues/1317) - Inference missing GGUF text encoders
- Fixed [#1324](https://github.com/LykosAI/StabilityMatrix/issues/1324) - Window height slightly increasing every launch
- Fixed [#1360](https://github.com/LykosAI/StabilityMatrix/issues/1360) - A1111 install not using correct torch for 5000-series GPUs
- Fixed [#1361](https://github.com/LykosAI/StabilityMatrix/issues/1361) - numpy and other Forge startup
### Supporters
#### 🌟 Visionaries
A huge thank-you to our incredible Visionary-tier supporters: **Waterclouds**, **Corey T**, **bluepopsicle**, **Bob S**, **Ibixat**, **whudunit**, and **Akiro_Senkai**! Your continued support lights the way for Stability Matrix and helps us keep building features like these. We couldn’t do it without you.
## v2.15.0-pre.1
### Added
- Added settings to disable base models from appearing in the Checkpoint Manager and Civitai Model Browser base model selectors
- Added Inference "Favorite Dimensions" quick selector - editable in Settings → Inference, or click the 💾 button inside the dropdown
- Added setting for Inference dimension step change - the value the dimensions increase or decrease by when using the step buttons or scroll wheel in Inference
- Added "Install Nunchaku" option to the ComfyUI Package Commands menu
- Added "Select All" button to the Installed Extensions page
- Added experimental ROCm pytorch install for ComfyUI (non-Zluda) on Windows - requires a compatible AMD GPU
- Added base model type labels (SD1.5, SDXL, Flux, etc.) to Inference model selection boxes
- Added UNET shared folder link for SD.Next
- Added Ukrainian translation thanks to @r0ddty!
### Changed
🌟 Civitai Model Details: A Grand Reimagining! 🌟
- No more peering through a tiny window! Introducing a massive overhaul of the Civitai Model Details page, transforming it from a cramped dialog into a spacious, feature-rich hub for all your model exploration needs.
- We've listened to your howls for more, and now you can dive deep into every aspect of your favorite models with unprecedented clarity and control:
- Expansive View: The new full-page layout means all essential information, descriptions, and previews are laid out beautifully, banishing the old, restrictive dialog forever.
- Rich Details at a Glance: Author, base model, last updated, SHA hashes, file name overrides/patterns – everything you need, perfectly organized and always accessible.
- Overhauled Image Viewer: Enjoy a sleek, modern image viewer that includes Civitai metadata and supports zooming, panning, and full-screen viewing. No more squinting at tiny thumbnails!
- Integrated Inference Options: For supported models, adjust sampler, scheduler, steps, CFG Scale, width, and height directly from the details page, streamlining your workflow like never before!
----
- You can now select release versions when installing ComfyUI
- You can no longer select branches when installing InvokeAI
- Updated InvokeAI install to use pinned torch index from release tag
- Updated ComfyUI installs for AMD users on Linux to use the latest rocm6.3 torch index
- Updated ComfyUI-Zluda installs to use the newer install-n method (fixes [#1347](https://github.com/LykosAI/StabilityMatrix/issues/1347))
- Updated uv to 0.8.4
- Removed disclaimer from reForge since the author is now active again
- Updated git operations to better avoid conflicts
- Updated Japanese translation
- Undo ComfyUI process tracking changes for now due to causing more issues than it solved
- Updated GPU parsing fallback on Linux systems to use the method provided by @irql-notlessorequal
### Fixed
- Fixed Civitai-generated image parsing in Inference
- Fixed some first-time setup crashes from missing prerequisites
- Fixed one-click installer not using default preferred Python version
- Fixed updating from old installs of InvokeAI using old frontend
- Fixed [#1357](https://github.com/LykosAI/StabilityMatrix/issues/1357) - Case insensitivity causing duplicate key exceptions on non-Windows systems
### Supporters
#### 🌟 Visionaries
To our brilliant Visionary-tier Patrons: **Waterclouds**, **Corey T**, **bluepopsicle**, **Bob S**, **Ibixat**, and **whudunit** — your support is the spark that keeps Stability Matrix blazing forward. Thanks to you, we can explore bolder features, tackle complex challenges, and keep making the impossible feel effortless. Thank you all so very much! 🚀
## v2.15.0-dev.2
### Added
- Added new package - [FramePack](https://github.com/lllyasviel/FramePack)
- Added new package - [FramePack Studio](https://github.com/colinurbs/FramePack-Studio)
- Added support for authenticated model downloads in the HuggingFace model browser. Visit Settings → Accounts to add your HuggingFace token.
- Added support for dragging-and-dropping Civitai-generated images into Inference to load metadata
- Added the ability to search by pasting an entire Civitai model URL into the search bar in the Civitai model browser (when the Civitai API gets fixed)
- Added "Clear Pip Cache" and "Clear uv Cache" commands to the Settings -> Embedded Python section
### Changed
- Civitai model browser image loading now uses dynamic resizing for better performance and a smoother scrolling experience
- Detailed notifications for Civitai model browser api errors
- The main sidebar now remembers whether it was collapsed or expanded between restarts
- Updated pre-selected download locations for certain model types in the Civitai model browser
- Updated uv to 0.7.19
- Changed InvokeAI update process to no longer clone the repo
### Fixed
- Fixed missing .NET 8 dependency for SwarmUI installs in certain cases
- Fixed [#1291](https://github.com/LykosAI/StabilityMatrix/issues/1291) - Certain GPUs not being detected on Linux
- Fixed [#1284](https://github.com/LykosAI/StabilityMatrix/issues/1284) - Output browser not ignoring InvokeAI thumbnails folders
- Fixed [#1305](https://github.com/LykosAI/StabilityMatrix/issues/1305) - FluxGym installing incorrect packages for Blackwell GPUs
- Fixed [#1316](https://github.com/LykosAI/StabilityMatrix/issues/1316) - Errors when installing Triton & SageAttention
- Fixed "directory is not empty" error when updating packages with symlinks
- Fixed missing base model types in the Checkpoint Manager & Civitai Model Browser
### Supporters
#### 🌟 Visionaries
A huge thank you to our amazing Visionary-tier Patrons: **Waterclouds**, **Corey T**, **bluepopsicle**, **Bob S**, **Ibixat**, and our newest Visionary, **whudunit**! 🚀 Your generous support enables Stability Matrix to grow faster and tackle ambitious new ideas. You're truly making all the magic happen!
## v2.15.0-dev.1
### Added
- Added Python Version selector for all new package installs
- Added the ability to rename packages
### Changed
- Updated all Python version management, virtual environment creation, and pip installs to use `uv` for improved reliability, compatibility, and speed
- The Civitai model browser Download Location selector will now remember the last location used based on the model type
- New installs of ComfyUI, SD.Next, and InvokeAI will now use Python 3.12.10, unless otherwise specified in the Advanced Options during installation
- New installs of all other packages will now use Python 3.10.17, unless otherwise specified in the Advanced Options during installation
### Supporters
#### 🌟 Visionaries
A massive thank you to our esteemed Visionary-tier Patrons: **Waterclouds**, **bluepopsicle**, **Bob S**, **Ibixat**, and **Corey T**! Your exceptional commitment propels Stability Matrix to new heights and allows us to push the boundaries of innovation. We're incredibly grateful for your foundational support! 🚀
## v2.14.3
### Added
- Added the ability to search by pasting an entire Civitai model URL into the search bar in the Civitai model browser
### Changed
- The main sidebar now remembers whether it was collapsed or expanded between restarts.
- Inference is now able to load image metadata from Civitai generated images via drag & drop
- Updated process tracking for ComfyUI to help mitigate restart issues when using Comfy Manager
- Updated pre-selected download locations for certain model types in the Civitai model browser
- Updated nodejs to v20.19.3 to support newer InvokeAI versions
### Fixed
- Fixed missing .NET 8 dependency for SwarmUI installs in certain cases
- Fixed ComfyUI-Zluda not being recognized as a valid Comfy install for the workflow browser
- Fixed [#1291](https://github.com/LykosAI/StabilityMatrix/issues/1291) - Certain GPUs not being detected on Linux
- Fixed [#1284](https://github.com/LykosAI/StabilityMatrix/issues/1284) - Output browser not ignoring InvokeAI thumbnails folders
- Fixed [#1301](https://github.com/LykosAI/StabilityMatrix/issues/1301) - Error when installing kohya_ss
- Fixed [#1305](https://github.com/LykosAI/StabilityMatrix/issues/1305) - FluxGym installing incorrect packages for Blackwell GPUs
- Fixed [#1316](https://github.com/LykosAI/StabilityMatrix/issues/1316) - Errors when installing Triton & SageAttention
- Fixed "directory is not empty" error when updating packages with symlinks
- Fixed missing base model types in the Checkpoint Manager & Civitai Model Browser
### Supporters
#### 🌟 Visionaries
Big heartfelt thanks to our stellar Visionary-tier Patrons: **Waterclouds**, **Corey T**, **bluepopsicle**, **Bob S**, **Ibixat**, and **whudunit**! 🌟 Your extraordinary generosity continues to fuel Stability Matrix’s journey toward innovation and excellence. We appreciate you immensely!
#### 🚀 Pioneers
Massive thanks to our fantastic Pioneer-tier Patrons: **tankfox**, **Mr. Unknown**, **Szir777**, **Tigon**, **Noah M**, **USATechDude**, **Thom**, and **SeraphOfSalem**! Your unwavering support keeps our community thriving and inspires us to push even further. You’re all awesome!
## v2.14.2
### Changed
- Changed Nvidia GPU detection to use compute capability level instead of the GPU name for certain feature gates / torch indexes
### Fixed
- Fixed [#1266](https://github.com/LykosAI/StabilityMatrix/issues/1266) - crash when moving or deleting Lora models in the Checkpoint Manager
- Fixed [#1268](https://github.com/LykosAI/StabilityMatrix/issues/1268) - wrong torch index used for Nvidia 1000-series GPUs and older
- Fixed [#1269](https://github.com/LykosAI/StabilityMatrix/issues/1269), [#1257](https://github.com/LykosAI/StabilityMatrix/issues/1257), [#1234](https://github.com/LykosAI/StabilityMatrix/issues/1234) - "no such file or directory" errors when updating certain packages after folder migration
- Fixed [#1274](https://github.com/LykosAI/StabilityMatrix/issues/1274), [#1276](https://github.com/LykosAI/StabilityMatrix/issues/1276) - incorrect torch installed when updating to InvokeAI v5.12+
- Fixed missing shared folder links for SwarmUI's diffusion_models and clip folders
### Supporters
#### 🌟 Visionaries
Our deepest gratitude to the brilliant Visionary-tier Patrons: **Waterclouds**, **bluepopsicle**, **Bob S**, **Ibixat**, and **Corey T**! Your incredible backing is instrumental in shaping the future of Stability Matrix and empowering us to deliver cutting-edge features. Thank you for believing in our vision! 🙏
#### 🚀 Pioneers
A huge shout-out to our fantastic Pioneer-tier Patrons: **Mr. Unknown**, **tankfox**, **Szir777**, **Noah M**, **USATechDude**, **Thom**, **TheTekknician**, and **SeraphOfSalem**! Your consistent support and active engagement are vital to our community's growth and our ongoing development efforts. You truly make a difference! ✨
## v2.14.1
### Changed
- Updated Inference Extra Networks (Lora / LyCORIS) base model filtering to consider SDXL variations (e.g., Noob AI / Illustrious) as compatible, unrecognized models or models with no base model will be considered compatible.
- Changed hotkey for Inference prompt weight adjustment to (`⌘+Up`/`⌘+Down`) on macOS
- Improved style consistency of Inference Prompt action buttons on top right
- (Internal) Improved log console formatting & colorization for development
### Fixed
- Fixed Inference hotkey weight adjustment multi-line behavior, now works as expected like the first line.
- Fixed updates to versions with commit hash version parts not being recognized when the current version has no commit hash part.
- Fixed Inference Extra Networks card not updating with newly added model files.
- Fixed incorrect ROCmLibs being installed for RX 6800/6800XT users of Comfy-Zluda or AMDGPU-Forge
- Fixed missing text when missing localized versions for Italian and Chinese languages
- Fixed Python Packages dialog errors and potentially other issues due to concurrent OnLoaded events
### Supporters
#### 🌟 Visionaries
Big cheers to our incredible Visionary-tier Patrons: **bluepopsicle**, **Bob S**, **Ibixat**, **Waterclouds**, and **Corey T**! 🚀 Your amazing support lets us dream bigger and reach further every single month. Thanks for being the driving force behind Stability Matrix - we genuinely couldn't do it without you!
#### 🚀 Pioneers
Huge thanks to our fantastic Pioneer-tier Patrons: **tankfox**, **Mr. Unknown**, **Szir777**, **Tigon**, and **Noah M**! Special shoutout and welcome back to **TheTekknician**, and a warm welcome aboard to our newest Pioneers: **USATechDude**, **SeraphOfSalem**, and **Thom**! ✨ Your continued support keeps our community vibrant and pushes us to keep creating. You all rock!
## v2.14.0
### Added
#### New Packages & Integrations
- Added new package - [Stable Diffusion WebUI AMDGPU Forge](https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu-forge)
- Added new package - [Stable Diffusion WebUI Forge - Classic](https://github.com/Haoming02/sd-webui-forge-classic)
- Added new Package Command (in the 3-dots menu) for installing Triton & SageAttention in ComfyUI
#### Inference Features
- Added Prompt Amplifier to Inference - click the magic wand 🪄 in the prompt editor to expand and enrich your ideas. Tailor the vibe with the ‘Feel’ selector and watch as your generations come to life with extra detail, coherence, and flair!
- Added support for HiDream in Inference - see [ComfyUI Examples](https://comfyanonymous.github.io/ComfyUI_examples/hidream/) for more details
- Added toggle for filtering Inference Extra Networks by base model
- Added Rescale CFG addon to Inference
- Added Swap Dimensions button between the width/height input in Inference
- Added Ctrl+Tab/Ctrl+Shift+Tab shortcuts for navigating between Inference tabs
- Added Align Your Steps scheduler to Inference
- Added wildcards to Inference prompts, e.g. `{blue|green|red}` will randomly select one of the colors
- Added Wan 2.1 Text to Video and Text to Image project types for Inference
- Added new autocomplete tag source to Inference - [Danbooru/e621 merged tags](https://civitai.com/models/950325?modelVersionId=1419692)
- Added Abstract Syntax Tree (AST) parsing for Inference prompts. This provides a more robust internal understanding of prompt structure, paving the way for future enhancements.
- Added hotkey (`Ctrl+Up`/`Ctrl+Down`) in Inference prompt editors to adjust the weight emphasis of the token under the caret or the currently selected text.
- This automatically wraps the token/selection in parentheses `()` if it's not already weighted.
- It modifies existing weights within parentheses or adds weights if none exist (e.g. `(word:1.1)`).
- Handles selection spanning multiple tokens intelligently.
- Added Plasma Noise addon to Inference for text to image workflows
#### Model Management & Discovery
- Added Accelerated Model Discovery (Beta) (⚡ icon in Civitai Browser) for Insider+ supporters. Utilizes an optimized connection for dramatically faster, more responsive browsing of online model repositories.
- Added OpenModelDB tab to the Model Browser
- Added Wan 2.1 files to the HuggingFace model browser
#### User Interface & Experience (UI/UX)
- Added Undo/Redo commands to text editor context menus
#### Internal / Developer Changes
- (Internal) Introduced unified strategy pattern (`IConfigSharingStrategy`) to for handling different config file formats (JSON, YAML, FDS).
- Added support for configuring nested paths in JSON and YAML files (e.g. `paths.models.vae`) via dot-notation in `SharedFolderLayoutRule.ConfigDocumentPaths`.
- Packages can now use the `SharedFolderLayout` property to define a `ConfigFileType` and `ConfigSharingOptions` (like `RootKey`), without needing to implement custom configuration logic.
### Changed
#### Inference Features
- Improved the quality of Inference inpainting by upgrading the workflow behind the scenes. The workflow remains the same for you — just better results!
- FaceDetailers in Inference will now inherit the primary sampler/scheduler/etc. by default. You can still manually set these by enabling the options via the ⚙️ button on the FaceDetailer card
- Slightly rearranged the FaceDetailer card layout due to the above change
- Inference "Extra Networks" selector now filters extra networks based on the selected base model
- Merged Inference GGUF workflows into the UNet model loader option (no longer need to choose GGUF separately)
#### Model Management & Discovery
- Changed the names of some of the shared model folders to better reflect their contents
- Improved Checkpoint Manager memory usage (thanks to @FireGeek for the profiling assistance!)
- Performance optimizations for Checkpoint Manager (progress indicators now fully uses Compiled Bindings)
#### Package Management & Compatibility
- Upgraded HIP SDK installs to 6.2.4 for ComfyUI-Zluda and AMDGPU-Forge
- Updated install for kohya_ss to support RTX 5000-series GPUs
#### User Interface & Experience (UI/UX)
- Improved window state handling
- Updated some date strings to take into account the user's locale
#### Localization
- Updated Japanese, Brazilian Portuguese, Chinese, and Russian translations
#### Internal / Developer Changes
- (Internal) Upgraded FluentAvalonia to 2.3.0
- (Internal) Refactored configuration-based shared folder logic: Centralized handling into `SharedFoldersConfigHelper` and format-specific strategies, removing custom file I/O logic from individual package classes for improved consistency and maintainability.
- Migrated packages ComfyUI (incl. Zluda), VladAutomatic (SD.Next), Sdfx, and StableSwarm to use the unified system for configuration and symlink based sharing.
### Fixed
#### Installation, Compatibility & Core Functionality
- Fixed RTX 5000-series GPU detection in certain cases
- Fixed Package Updates and Change Version not using stored PyTorch index and instead using the default recommended index.
- Fixed ComfyUI-Zluda not being recognized as an option for Inference or SwarmUI (for real this time)
- Fixed errors from invalid pip specifiers in requirements files
#### User Interface & Experience (UI/UX)
- Fixed Image Viewer animation loader keeping file handles open, which resolves 2 different issues (OSes are fun):
- (macOS) Fixed `FileNotFoundException` crash when navigating to Inference tab after deleting a Webp animation file previously opened in the Image Viewer Dialog.
- (Windows) Fixed Webp animation files unable to be deleted without closing the app first.
- Fixed Image Viewer `FileNotFoundException` on fetching image size, if navigating to a deleted image file.
- (macOS) Fixed Webp / Gif animations RGB colors flipped.
- Fixed window disappearing on macOS when the saved window size is very small
- Fixed large white boxes appearing when tooltips are visible on macOS/Linux
- Fixed package images sometimes showing as blank due to concurrent image caching. Requests to same image resources are now de-duplicated
- Reduced memory usage from `ShowDisabledTooltipExtension`
#### Inference & Workflows
- Fixed some cases of missing custom nodes in SwarmUI
- Fixed Inference ControlNet Preprocessors using incorrect resolution and increased maximum of smallest dimension to 16384
- Fixed Inference Extra Networks card not allowing for more than one model at a time
#### Model Management & Discovery
- Fixed missing base model options in the Metadata Editor
- Fixed some crashes when using Accelerated Model Discovery
### Supporters
#### Visionaries
Our heartfelt gratitude goes out to our amazing Visionary-tier Patrons: **Waterclouds**, **Corey T**, **bluepopsicle**, **Bob S**, **Akiro_Senkai**, and **Ibixat**! Your exceptional support is fundamental to the ongoing development and success of Stability Matrix. We are immensely grateful for your partnership and belief in the project! 🙏
#### Pioneers
We also want to give a huge thank you to our dedicated Pioneer-tier Patrons: **tankfox**, **Mr. Unknown**, **Szir777**, **Tigon**, **NowFallenAngel**, **Al Gorithm**, and welcome to our newest Pioneer, **Noah M.**! Your consistent support and enthusiasm keep the momentum going. Thank you all for being such an important part of our community! ✨
## v2.14.0-pre.2
### Added
- Added new package - [Stable Diffusion WebUI Forge - Classic](https://github.com/Haoming02/sd-webui-forge-classic)
- Added Accelerated Model Discovery (Beta) (⚡ icon in Civitai Browser) for Insider+ supporters. Utilizes an optimized connection for dramatically faster, more responsive browsing of online model repositories.
- Added Undo/Redo commands to text editor context menus
- Added Prompt Amplifier to Inference - click the magic wand 🪄 in the prompt editor to expand and enrich your ideas. Tailor the vibe with the ‘Feel’ selector and watch as your generations come to life with extra detail, coherence, and flair!
- (pre.2 re-release) Added support for HiDream in Inference - see [ComfyUI Examples](https://comfyanonymous.github.io/ComfyUI_examples/hidream/) for more details
- (pre.2 re-release) Added toggle for filtering Inference Extra Networks by base model
### Changed
- Updated install for kohya_ss to support RTX 5000-series GPUs
- (pre.2 re-release) Merged Inference GGUF workflows into the UNet model loader option (no longer need to choose GGUF separately)
- (pre.2 re-release) Updated some date strings to take into account the user's locale
- (pre.2 re-release) Fixed some crashes when using Accelerated Model Discovery
- (pre.2 re-release) Performance optimizations for Checkpoint Manager (progress indicators now fully uses Compiled Bindings)
### Fixed
- Fixed Inference ControlNet Preprocessors using incorrect resolution and increased maximum of smallest dimension to 16384
- Fixed Triton/Sage install option showing for incompatible GPUs
- Fixed errors from invalid pip specifiers in requirements files
- Fixed package images sometimes showing as blank due to concurrent image caching. Requests to same image resources are now de-duplicated
- (pre.2 re-release) Fixed Inference Extra Networks card not allowing for more than one model at a time
- (pre.2 re-release) Reduced memory usage from `ShowDisabledTooltipExtension`
### Supporters
#### Visionaries
- Big shout-out to our Visionary-tier patrons: Waterclouds, Corey T, bluepopsicle, and Bob S! Your steadfast support keeps Stability Matrix moving forward, and we couldn’t do it without you. 🚀 Thank you!
## v2.14.0-pre.1
### Added
- Added new Package Command (in the 3-dots menu) for installing Triton & SageAttention in ComfyUI
- Added Abstract Syntax Tree (AST) parsing for Inference prompts. This provides a more robust internal understanding of prompt structure, paving the way for future enhancements.
- Added hotkey (`Ctrl+Up`/`Ctrl+Down`) in Inference prompt editors to adjust the weight emphasis of the token under the caret or the currently selected text.
- This automatically wraps the token/selection in parentheses `()` if it's not already weighted.
- It modifies existing weights within parentheses or adds weights if none exist (e.g. `(word:1.1)`).
- Handles selection spanning multiple tokens intelligently.
- Added Plasma Noise addon to Inference for text to image workflows
- (Internal) Introduced unified strategy pattern (`IConfigSharingStrategy`) to for handling different config file formats (JSON, YAML, FDS).
- Added support for configuring nested paths in JSON and YAML files (e.g. `paths.models.vae`) via dot-notation in `SharedFolderLayoutRule.ConfigDocumentPaths`.
- Packages can now use the `SharedFolderLayout` property to define a `ConfigFileType` and `ConfigSharingOptions` (like `RootKey`), without needing to implement custom configuration logic.
### Changed
- Changed the names of some of the shared model folders to better reflect their contents
- Improved window state handling
- Improved Checkpoint Manager memory usage (thanks to @FireGeek for the profiling assistance!)
- Upgraded HIP SDK installs to 6.2.4 for ComfyUI-Zluda and AMDGPU-Forge
- (Internal) Upgraded FluentAvalonia to 2.3.0
- (Internal) Refactored configuration-based shared folder logic: Centralized handling into `SharedFoldersConfigHelper` and format-specific strategies, removing custom file I/O logic from individual package classes for improved consistency and maintainability.
- Migrated packages ComfyUI (incl. Zluda), VladAutomatic (SD.Next), Sdfx, and StableSwarm to use the unified system for configuration and symlink based sharing.
### Fixed
- Fixed RTX 5000-series GPU detection in certain cases
- Fixed Image Viewer animation loader keeping file handles open, which resolves 2 different issues (OSes are fun):
- (macOS) Fixed `FileNotFoundException` crash when navigating to Inference tab after deleting a Webp animation file previously opened in the Image Viewer Dialog.
- (Windows) Fixed Webp animation files unable to be deleted without closing the app first.
- Fixed Image Viewer `FileNotFoundException` on fetching image size, if navigating to a deleted image file.
- (macOS) Fixed Webp / Gif animations RGB colors flipped.
- Fixed Package Updates and Change Version not using stored PyTorch index and instead using the default recommended index.
- Fixed some cases of missing custom nodes in SwarmUI
- Fixed window disappearing on macOS when the saved window size is very small
- Fixed ComfyUI-Zluda not being recognized as an option for Inference or SwarmUI (for real this time)
- Fixed missing base model options in the Metadata Editor
- Fixed large white boxes appearing when tooltips are visible on macOS/Linux
### Supporters
#### Visionaries
- A special shout-out to our fantastic Visionary-tier Patreon supporters: Waterclouds, Corey T, and our newest Visionaries, bluepopsicle and Bob S! Your continued generosity powers the future of Stability Matrix—thank you so much!
## v2.14.0-dev.3
### Added
- Added Wan 2.1 Text to Video and Text to Image project types for Inference
- Added Wan 2.1 files to the HuggingFace model browser
- Added new package - [Stable Diffusion WebUI AMDGPU Forge](https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu-forge)
- Added support for RTX 5000-series GPUs in ComfyUI, Forge, and reForge
- Added "Rebuild .NET Project" command to SwarmUI installs - available via the 3-dots menu -> Package Commands -> Rebuild .NET Project
- Added new autocomplete tag source to Inference - [Danbooru/e621 merged tags](https://civitai.com/models/950325?modelVersionId=1419692)
### Changed
- Upgraded ComfyUI CUDA torch to 12.6
- Upgraded Lykos account connection to use OAuth 2.0 device flow
- (Internal) Updated Avalonia to 11.2.5
### Fixed
- Fixed [#1128](https://github.com/LykosAI/StabilityMatrix/issues/1128) - overwriting models when downloading multiple with the same name
- Fixed ROCm torch indexes for ComfyUI & Forge
- Fixed model browser sometimes downloading to `ModelsLora` or `ModelsStableDiffusion` folders instead of the correct folder
- Fixed incorrect Unet folder path for ComfyUI users on Linux/macOS
- Fixed [#1157](https://github.com/LykosAI/StabilityMatrix/issues/1157) - crash when broken symlinks exist in model directories
- Fixed [#1154](https://github.com/LykosAI/StabilityMatrix/issues/1154) - increased width for package name on the package cards
- Fixed ComfyUI-Zluda not being recognized as an option for Inference or SwarmUI
- Fixed SwarmUI showing Python options in the 3-dots menu
- Fixed SD.Next install failures in certain cases when using Zluda
### Supporters
#### Visionaries
- Many thanks to our amazing Visionary-tier Patreon supporters, **Waterclouds**, **TheTekknician**, and **Corey T**! Your unwavering support is very much appreciated!
## v2.14.0-dev.2
### Added
- Added Align Your Steps scheduler to Inference
- Added wildcards to Inference prompts, e.g. `{blue|green|red}` will randomly select one of the colors
- Added Safetensor Metadata viewer to the Checkpoint Manager context menu - thanks to @genteure!
### Changed
- Updated the Civitai Model Browser base model selector to match the new Checkpoint Manager filter UI
- FaceDetailers in Inference will now inherit the primary sampler/scheduler/etc. by default. You can still manually set these by enabling the options via the ⚙️ button on the FaceDetailer card
- Slightly rearranged the FaceDetailer card layout due to the above change
- "Remove symbolic links on shutdown" option now also removes links from Output Sharing
- Inference "Extra Networks" selector now filters extra networks based on the selected base model
- Updated Japanese, Brazilian Portuguese, Chinese, and Russian translations
### Fixed
- Fixed crash when dragging & dropping images in Inference (hopefully)
- Fixed HiresFix Inference addon not inheriting sampler/scheduler properly
- Fixed some plus (+) buttons getting cut off in the Inference UI
- Fixed CFG Rescale addon interfering with refiner model in Inference
- Fixed [#1083](https://github.com/LykosAI/StabilityMatrix/issues/1083) - "Show Nested Models" incorrectly displaying models from some non-nested folders
- Fixed issue with InvokeAI model sharing when the host address is set to 0.0.0.0
- Fixed issue when parsing index URLs in Python Dependencies Override menu
- Fixed ComfyUI-Zluda not respecting pip user overrides
- Fixed issue with Checkpoint Manager not displaying any models
- (dev.2 re-release) Fixed autocomplete not showing in certain cases when using wildcards
- (dev.2 re-release) Fixed package restart button not working
- (dev.2 re-release) Fixed [#1120](https://github.com/LykosAI/StabilityMatrix/issues/1120) - crash when right clicking in the console after restarting a package
### Supporters
#### Visionaries
- A huge thank you to our incredible Visionary-tier Patreon supporters, **Waterclouds**, **TheTekknician**, and our newest Visionary, **Corey**! Your generous support is greatly appreciated!
## v2.14.0-dev.1
### Added
- Added Rescale CFG addon to Inference
- Added Swap Dimensions button between the width/height input in Inference
- Added Ctrl+Tab/Ctrl+Shift+Tab shortcuts for navigating between Inference tabs
- Added OpenModelDB tab to the Model Browser
### Changed
- Improved the quality of Inference inpainting by upgrading the workflow behind the scenes. The workflow remains the same for you — just better results!
- Redesigned the Checkpoint Manager Filter flyout to include more options and improve the layout
- "Clear All" button will now remain at the top of the Downloads list regardless of scroll position - thanks to @Genteure!
- Improved image metadata parsing - thanks to @Genteure!
### Fixed
- Fixed Inference image selector card buttons taking up the whole height of the card
- Fixed Inference mask editor failing to paint to the right-most edge on large images
- Fixed Inference mask editor not showing the entire image in certain circumstances
- Fixed an issue where certain sampler/scheduler combos would not get saved in image metadata - thanks to @yansigit!
- Fixed [#1078](https://github.com/LykosAI/StabilityMatrix/issues/1078) - "Call from invalid thread" error after one-click install finishes
- Fixed [#1080](https://github.com/LykosAI/StabilityMatrix/issues/1080) - Some models not displayed in Checkpoint Manager
### Supporters
#### Visionaries
- Many thanks to our incredible Visionary-tier Patreon supporters, **Waterclouds** and **TheTekknician**! Your support helps us continue to improve Stability Matrix!
## v2.13.4
### Added
- Added support for RTX 5000-series GPUs in ComfyUI, Forge, and reForge
- Added "Rebuild .NET Project" command to SwarmUI installs - available via the 3-dots menu -> Package Commands -> Rebuild .NET Project
### Changed
- Upgraded ComfyUI CUDA torch to 12.6
- Upgraded Lykos account connection to use OAuth 2.0 device flow
- (Internal) Updated Avalonia to 11.2.5
### Fixed
- Fixed [#1128](https://github.com/LykosAI/StabilityMatrix/issues/1128) - overwriting models when downloading multiple with the same name
- Fixed ROCm torch indexes for ComfyUI & Forge
- Fixed model browser sometimes downloading to `ModelsLora` or `ModelsStableDiffusion` folders instead of the correct folder
- Fixed incorrect Unet folder path for ComfyUI users on Linux/macOS
- Fixed [#1157](https://github.com/LykosAI/StabilityMatrix/issues/1157) - crash when broken symlinks exist in model directories
- Fixed [#1154](https://github.com/LykosAI/StabilityMatrix/issues/1154) - increased width for package name on the package cards
- Fixed ComfyUI-Zluda not being recognized as an option for Inference or SwarmUI
- Fixed SwarmUI showing Python options in the 3-dots menu
- Fixed SD.Next install failures in certain cases when using Zluda
### Supporters
#### Visionaries
- Huge thanks to our amazing Visionary-tier Patrons, **Waterclouds** and **Corey T**! We're truly grateful for your continued generosity and support!
#### Pioneers
- Special appreciation to our fantastic Pioneer-tier Patrons: **tankfox**, **Mr. Unknown**, **Szir777**, **Tigon**, **NowFallenAngel**, and our newest addition, **Al Gorithm**! Thank you all for your incredible commitment and ongoing encouragement!
## v2.13.3
### Changed
- "Remove symbolic links on shutdown" option now also removes links from Output Sharing
### Fixed
- Fixed [#1083](https://github.com/LykosAI/StabilityMatrix/issues/1083) - "Show Nested Models" incorrectly displaying models from some non-nested folders
- Fixed [#1120](https://github.com/LykosAI/StabilityMatrix/issues/1120) - crash when right clicking in the console after restarting a package
- Fixed issue with InvokeAI model sharing when the host address is set to 0.0.0.0
- Fixed issue when parsing index URLs in Python Dependencies Override menu
- Fixed issue where models were filtered incorrectly in the Checkpoint Manager
- Fixed ComfyUI-Zluda not using the user-defined pip overrides
### Supporters
#### Visionaries
- A heartfelt thank you to our incredible Visionary-tier Patrons, **Waterclouds**, **TheTekknician**, and **Corey**! Your unwavering support means the world to us!
#### Pioneers
- A big shoutout to our outstanding Pioneer-tier Patrons, **tankfox**, **Mr. Unknown**, **Szir777**, and **NowFallenAngel**! We deeply appreciate your ongoing support and dedication!
## v2.13.2
### Changed
- Removed SimpleSDXL due to security concerns - thanks to @iwr-redmond for the detailed report. For more information please visit https://github.com/LykosAI/StabilityMatrix/security/advisories.
### Supporters
#### Visionaries
- Many thanks to our amazing Visionary-tier Patrons, **Waterclouds** and **TheTekknician**! Your support is greatly appreciated!
#### Pioneers
- Shoutout to our Pioneer-tier Patrons, **tankfox**, **Mr. Unknown**, **Szir777**, **Tigon**, and **NowFallenAngel**! Thank you for your continued support!
## v2.13.1
### Changed
- Redesigned the Checkpoint Manager Filter flyout to include more options and improve the layout
- "Clear All" button will now remain at the top of the Downloads list regardless of scroll position - thanks to @Genteure!
- Improved image metadata parsing - thanks to @Genteure!
### Fixed
- Fixed [#1078](https://github.com/LykosAI/StabilityMatrix/issues/1078) - "Call from invalid thread" error after one-click install finishes
- Fixed [#1080](https://github.com/LykosAI/StabilityMatrix/issues/1080) - Some models not displayed in Checkpoint Manager
- Fixed Inference image selector card buttons taking up the whole height of the card
- Fixed Inference mask editor failing to paint to the right-most edge on large images
- Fixed Inference mask editor not showing the entire image in certain circumstances
- Fixed crash when dragging & dropping images in Inference (hopefully)
- Fixed an issue where certain sampler/scheduler combos would not get saved in image metadata - thanks to @yansigit!
### Supporters
#### Visionaries
- A heartfelt thank you to our exceptional Visionary-tier Patreon backers, **Waterclouds** and **TheTekknician**! We truly appreciate your steadfast support!
#### Pioneers
- We are also very grateful to our wonderful Pioneer-tier Patreon supporters, **tankfox**, **Mr Unknown**, **Szir777**, **Tigon**, and **NowFallenAngel**! Your support means a lot to us!
## v2.13.0
### Added
- Added new package - [ComfyUI-Zluda](https://github.com/patientx/ComfyUI-Zluda) - for AMD GPU users on Windows
- Added file sizes to the Checkpoint Manager tab
- Added the Discrete Model Sampling addon for Inference samplers, allows selecting different sampling methods, such as v_prediction, lcm, or x0, and optionally adjusts the model’s noise reduction strategy with the zero-shot noise ratio (ZSNR) toggle.
- Added Default GPU override in Settings -> System Settings -> Default GPU
- Added new "Copy" menu to the Inference gallery context menu, allowing you to copy generation parameters as well as the image
- Added "StableDiffusion" folder as an option when downloading Flux models in the CivitAI model browser
- Added support for SD3.5 in Inference
- Added CLIP_G to HuggingFace model browser
- Added search bar to the Installed Workflows tab
- Added "Search with Google" and "Search with ChatGPT" to the package console output & install progress console output context menus
- Added "Date Created" and "Date Last Modified" sorting options to the Checkpoints tab
- Added a new "Extension Packs" section to the extension manager, allowing you to create packs for easier installation of multiple extensions at once
- Added "Search by Creator" command to Civitai browser context menu
- Added Beta scheduler to the scheduler selector in Inference
- Added zipping of log files and "Show Log in Explorer" button on exceptions dialog for easier support
- Added max concurrent downloads option & download queueing for most downloads
- Added the ability to change the Models directory separately from the rest of the Data directory. This can be set in `Settings > Select new Models Folder`
- Added InvokeAI model sharing option
### Changed
- Improved Packages Page grid layout to dynamically stretch to fill available space
- Text Encoder / CLIP selection in Inference is now enabled via the cogwheel ⚙️ button next to the model selector
- Updated Civitai model descriptions to properly render the interactive elements
- Adjusted the Branch/Release toggle during package install flow to be a little more obvious
- Updated the Dock library used for Inference - fixes some weirdness with resizing / rearranging panels
- New file format and key derivation for protecting locally encrypted secrets (i.e. Civit / Lykos accounts) that is no longer dependent on the OS Version. This should prevent system updates from clearing account logins.
- (Internal) Updated to .NET 9 Runtime and Avalonia 11.2.2 for performance improvements, lower memory usage, and bug fixes
- Updated pytorch index to `rocm6.2` for AMD users of ComfyUI on Linux
### Fixed
- Fixed text alignment issues in the Downloads tab for certain long names / progress infos
- Improved startup performance and resource usage with optimizations to hardware lookups. Moved reflection usages in dependency injection to source generation.
- Fixed an issue with ComfyUI-Impact-Subpack not being installed when using FaceDetailer in Inference
- Fixed GGUF models not showing in Inference without the GGUF extension installed (this means it will now properly prompt you to install the extension as well)
### Supporters
#### Visionaries
- We're extremely grateful to our incredible Visionary-tier Patreon supporters, **Waterclouds** and **TheTekknician**! Thank you very much for your unwavering support!
#### Pioneers
- Many thanks to our amazing Pioneer-tier Patreon supporters, **tankfox**, **Mr Unknown**, **Szir777**, and our newest Pioneer, **NowFallenAngel**! Your generous support is very much appreciated!
## v2.13.0-pre.2
### Added
- Added new package - [ComfyUI-Zluda](https://github.com/patientx/ComfyUI-Zluda) - for AMD GPU users on Windows
- Added "StableDiffusion" folder as an option when downloading Flux models in the CivitAI model browser
### Changed
- Updated pytorch index to `rocm6.2` for AMD users of ComfyUI on Linux
### Supporters
#### Visionaries
- Big shoutout to our incredible Visionary-tier Patreon supporter, **Waterclouds**! We're also delighted to introduce our newest Visionary-tier Patreon supporter, **TheTekknician**! Thank you both for your generous support!
## v2.13.0-pre.1
### Added
- Added new package - [CogVideo](https://github.com/THUDM/CogVideo) - many thanks to @NullDev for the contribution!
- Added file sizes to the Checkpoint Manager tab
- Added more formatting options for Inference output filenames - thanks to @yansigit!
- Added the Discrete Model Sampling addon for Inference samplers, allows selecting different sampling methods, such as v_prediction, lcm, or x0, and optionally adjusts the model’s noise reduction strategy with the zero-shot noise ratio (ZSNR) toggle.
- Added Default GPU override in Settings -> System Settings -> Default GPU
- Added the ability to copy more generation parameters from the Inference gallery context menu
### Changed
- Improved Packages Page grid layout to dynamically stretch to fill available space
- New file format and key derivation for protecting locally encrypted secrets (i.e. Civit / Lykos accounts) that is no longer dependent on the OS Version. This should prevent system updates from clearing account logins.
- (Internal) Updated to .NET 9 Runtime and Avalonia 11.2.2 for performance improvements, lower memory usage, and bug fixes
### Fixed
- Improved startup performance and resource usage with optimizations to hardware lookups. Moved reflection usages in dependency injection to source generation.
- Fixed a typo in the Japanese translation - thanks to @mattyatea!
- Fixed missing package thumbnails due to moved or inaccessible urls
- Fixed an issue with ComfyUI-Impact-Subpack not being installed when using FaceDetailer in Inference
- Fixed GGUF models not showing in Inference without the GGUF extension installed (this means it will now properly prompt you to install the extension as well)
### Supporters
#### Visionaries
- Huge thank you to our incredible Visionary-tier Patreon supporter, **Waterclouds**! Your unwavering support is very much appreciated!
## v2.13.0-dev.3
### Added
- Added support for SD3.5 in Inference
- Added CLIP_G to HuggingFace model browser
- Added search bar to the Installed Workflows tab
- Added "Search with Google" and "Search with ChatGPT" to the package console output & install progress console output context menus
- Added "Date Created" and "Date Last Modified" sorting options to the Checkpoints tab
### Changed
- Text Encoder / CLIP selection in Inference is now enabled via the cogwheel ⚙️ button next to the model selector
- Added more base model types to the CivitAI Model Browser & Checkpoint Manager
- Model browser base model types are now loaded dynamically from CivitAI, reducing the need for updates to add new types
- Updated Civitai model descriptions to properly render the interactive elements
- Updated Russian translations thanks to @vanja-san
- Updated Simplified Chinese translations thanks to @QL-boy
- (Internal) Updated to Avalonia 11.2.0
### Fixed
- Fixed some instances of Civitai model browser not loading new results
- Fixed "Unsupported Torch Version: Cuda" errors when installing a1111
- Fixed crash when clicking "Remind me Later" on the update dialog
- Fixed some cases of crashing when GitHub API rate limits are exceeded
- Fixed Git missing from env vars when running SwarmUI
### Supporters
#### Visionaries
- Big shoutout to our amazing Visionary-tier Patreon supporter, **Waterclouds**! We are very grateful for your continued support!
## v2.13.0-dev.2
### Added
- Added new package - [SimpleSDXL](https://github.com/metercai/SimpleSDXL) - many thanks to @NullDev for the contribution!
- Added new package - [FluxGym](https://github.com/cocktailpeanut/fluxgym) - many thanks to @NullDev for the contribution!
- Added a new "Extension Packs" section to the extension manager, allowing you to create packs for easier installation of multiple extensions at once
- Added "Search by Creator" command to Civitai browser context menu
- Added Beta scheduler to the scheduler selector in Inference
- Added zipping of log files and "Show Log in Explorer" button on exceptions dialog for easier support
- Added max concurrent downloads option & download queueing for most downloads
### Changed
- (Internal) Updated to Avalonia 11.1.4
- Adjusted the Branch/Release toggle during package install flow to be a little more obvious
- Updated the Dock library used for Inference - fixes some weirdness with resizing / rearranging panels
### Fixed
- Fixed ComfyUI NF4 extension not installing properly when prompted in Inference
- Fixed [#932](https://github.com/LykosAI/StabilityMatrix/issues/932), [#935](https://github.com/LykosAI/StabilityMatrix/issues/935), [#939](https://github.com/LykosAI/StabilityMatrix/issues/939) - InvokeAI failing to update
- Fixed repeated nested folders being created in `Models/StableDiffusion` when using Forge in Symlink mode in certain conditions. Existing folders will be repaired to their original structure on launch.
- Fixed minimize button not working on macOS
- Fixed InvokeAI model sharing spamming the console with "This may take awhile" in certain conditions
- Fixed text alignment issues in the Downloads tab for certain long names / progress infos
### Supporters
#### Visionaries
- A big thank you to our amazing Visionary-tier Patreon supporter, **Waterclouds**! Your continued support is invaluable!
## v2.13.0-dev.1
### Added
- Added the ability to change the Models directory separately from the rest of the Data directory. This can be set in `Settings > Select new Models Folder`
- Added "Copy" menu to the Inference gallery context menu, allowing you to copy the image or the seed (other params coming soon™️)
- Added InvokeAI model sharing option
### Supporters
#### Visionaries
- A heartfelt thank you to our incredible Visionary-tier Patreon supporter, **Waterclouds**! Your ongoing support means a lot to us, and we’re grateful to have you with us on this journey!
## v2.12.4
### Added
- Added new package - [CogVideo](https://github.com/THUDM/CogVideo) - many thanks to @NullDev for the contribution!
- Added more formatting options for Inference output filenames - thanks to @yansigit!
### Changed
- Model browser base model types are now loaded dynamically from CivitAI, reducing the need for updates to add new types
### Fixed
- Fixed crash when clicking "Remind me Later" on the update dialog
- Fixed some cases of crashing when GitHub API rate limits are exceeded
- Fixed Git missing from env vars when running SwarmUI
- Fixed missing package thumbnails due to moved or inaccessible urls
- Fixed an issue with updating FluxGym in certain cases - thanks to @NullDev!
- Fixed a typo in the Japanese translation - thanks to @mattyatea!
### Supporters
#### Visionaries
- A huge thank you to our dedicated Visionary-tier Patreon supporter, **Waterclouds**! We’re thrilled to have your ongoing support!
#### Pioneers
- Shoutout to our great Pioneer-tier patrons: **tankfox**, **tanangular**, **Mr. Unknown**, **Szir777**, and our newest Pioneer, **Tigon**!. Your continued support is greatly appreciated!
## v2.12.3
### Added
- Added new package - [SimpleSDXL](https://github.com/metercai/SimpleSDXL) - many thanks to @NullDev for the contribution!
- Added new package - [FluxGym](https://github.com/cocktailpeanut/fluxgym) - many thanks to @NullDev for the contribution!
- Added more base model types to the CivitAI Model Browser & Checkpoint Manager
### Changed
- Updated Russian translations thanks to @vanja-san
- Updated Simplified Chinese translations thanks to @QL-boy
### Fixed
- Fixed some cases of FileTransferExists error when running re/Forge or Automatic1111
- Fixed update check not happening on startup for some users
- Fixed error when installing Automatic1111 on macOS
- Fixed some instances of Civitai model browser not loading new results
- Fixed "Unsupported Torch Version: Cuda" errors when installing a1111
### Supporters
#### Visionaries
- A huge shout-out to our dedicated Visionary-tier Patreon supporter, **Waterclouds**! Your unwavering support is greatly appreciated!
#### Pioneers
- We'd also like to express our gratitude to our amazing Pioneer-tier patrons: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**! Your ongoing support means a great deal!
## v2.12.2
### Added
- Added Beta scheduler to the scheduler selector in Inference
### Changed
- (Internal) Updated to Avalonia 11.1.4
### Fixed
- Fixed ComfyUI NF4 extension not installing properly when prompted in Inference
- Fixed [#932](https://github.com/LykosAI/StabilityMatrix/issues/932), [#935](https://github.com/LykosAI/StabilityMatrix/issues/935), [#939](https://github.com/LykosAI/StabilityMatrix/issues/939) - InvokeAI failing to update
- Fixed repeated nested folders being created in `Models/StableDiffusion` when using Forge in Symlink mode in certain conditions. Existing folders will be repaired to their original structure on launch.
- Fixed minimize button not working on macOS
### Supporters
#### Visionaries
- We extend our heartfelt appreciation to our dedicated Visionary-tier Patreon supporter, **Waterclouds**. Your ongoing support is invaluable!
#### Pioneers
- We’d also like to thank our great Pioneer-tier patrons: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**. Your continuous support means a lot!
## v2.12.1
### Fixed
- Fixed [#916](https://github.com/LykosAI/StabilityMatrix/issues/916) - InvokeAI failing to install/update on macOS
- Fixed [#914](https://github.com/LykosAI/StabilityMatrix/issues/914) - Unable to use escaped colon `:` character in Inference prompts
- Fixed [#908](https://github.com/LykosAI/StabilityMatrix/issues/908) - Forge unable to use models from "unet" shared folder
- Fixed [#902](https://github.com/LykosAI/StabilityMatrix/issues/902) - Images from shared outputs folder not displaying properly in Stable Diffusion WebUI-UX
- Fixed [#898](https://github.com/LykosAI/StabilityMatrix/issues/898) - Incorrect launch options for RuinedFooocus
- Fixed index url parsing in Python Packages window causing some packages to not have versions available
- Fixed a crash when switching between Model Sharing options for certain packages
### Supporters
#### Visionaries
- A sincere thank you to our valued Visionary-tier Patreon supporter, **Waterclouds**. Your continued support is truly appreciated, and we’re grateful to have you with us on this journey.
#### Pioneers
- We’d also like to extend our gratitude to our Pioneer-tier patrons: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**. Your ongoing support means a great deal to us!
## v2.12.0
### Added
#### New Packages
- [Fooocus - mashb1t's 1-Up Edition](https://github.com/mashb1t/Fooocus) by mashb1t
- [Stable Diffusion WebUI reForge](https://github.com/Panchovix/stable-diffusion-webui-reForge/) by Panchovix
#### Inference
- Added type-to-search for the Inference model selectors. Start typing while the dropdown is open to navigate the list.
- Added "Model Loader" option to Inference, for loading UNet/GGUF/NF4 models (e.g. Flux)
- Added support for the FP8 version of Flux in the default Model Loader via the "Use Flux Guidance" Sampler Addon
- Added trigger words to the Inference Extra Networks (Lora/Lyco) selector for quick copy & paste
- Image viewer context menus now have 2 options: `Copy (Ctrl+C)` which now always copies the image as a file, and `Copy as Bitmap (Shift+Ctrl+C)` (Available on Windows) which copies to the clipboard as native bitmap. This changes the previous single `Copy` button behavior that would first attempt a native bitmap copy on Windows when available, and fall back to a file copy if not.
- Added Face Detailer module to Inference
#### Package Manager
- Added Python dependencies override table to package installation options, where the default pip packages may be overriden for a package's install and updates. This can be changed later or added to existing packages through `Package Menu > Python Dependencies Override`
- Added "Change Version" option to the package card overflow menu, allowing you to downgrade or upgrade a package to a specific version or commit ([#701](https://github.com/LykosAI/StabilityMatrix/issues/701), [#857](https://github.com/LykosAI/StabilityMatrix/issues/857))
- Added "Disable Update Check" option to the package card overflow menu, allowing you to disable update checks for a specific package
- Added Custom commit option in the Advanced Options for package installs ([#670](https://github.com/LykosAI/StabilityMatrix/issues/670), [#839](https://github.com/LykosAI/StabilityMatrix/issues/839), [#842](https://github.com/LykosAI/StabilityMatrix/issues/842))
- Added macOS support for Fooocus & related forks
- Added Intel OneAPI XPU backend (IPEX) option for SD.Next
#### Checkpoint Manager
- Added new Metadata Editor (accessible via the right-click menu), allowing you to create or edit metadata for models
- Added "New Directory" and "Delete" options to the context menu of the tree view.
- Added new toggle for drag & drop - when enabled, all selected models will now move together with the dragged model
- Added "File Size" sorting option
- Added "Hide Empty Categories" toggle
- Added "Select All" button to the InfoBar (shown when at least one model is selected)
- Added "Show NSFW Images" toggle
#### Model Browser
- Added "Hide Installed Models" toggle to the CivitAI Model Browser
- Added toggle to hide "Early Access" models in the CivitAI Model Browser
- Added ultralytics models to HuggingFace model browser
#### Other
- Added "Sign in with Google" option for connecting your Lykos Account on the Account Settings page
- Added zoom sliders for Outputs, Checkpoints, and Model Browser pages
- Added Settings option "Console: History Size" to adjust the number of lines stored in the console history when running packages. Defaults to 9001 lines.
- Added optional anonymous usage reporting for gauging popularity of package installs and features. You will be asked whether you want to enable this feature on launch, and can change your choice at any time in `Settings > System > Analytics`
- Added "Run Command" option in Settings for running a command with the embedded Python or Git executables
- Added "Enable Long Paths" option for Git to the Settings page
- Added "System Settings > Enable Long Paths" option to enable NTFS long paths on Windows
- Added Korean translations thanks to maakcode!
- (Windows, Linux) Added Vulkan rendering support using launch argument `--vulkan`. (On Windows, the default WinUI composition renderer is likely still preferrable. Linux users are encouraged to try the new renderer to see if it improves performance and responsiveness.)
### Changed
- Optimized image loading across the app, with loading speed now up to 4x faster for local images, and up to 17x faster for remote images
- Image loading in the Outputs page now uses native memory management for ~2x less peak memory usage, and will release memory more quickly when switching away from the Outputs page or scrolling images out of view
- Improved animation fluidity of image rendering while scrolling quickly across large collections (e.g. Outputs, Model Browser)
- ComfyUI will no longer be pinned to torch 2.1.2 for nvidia users on Windows ([#861](https://github.com/LykosAI/StabilityMatrix/issues/861))
- Model browser download progress no longer covers the entire card for the entire duration of the download
- Updated torch index to `rocm6.1` for AMD users of ComfyUI
- Show better error message for early access model downloads
- Updated torch version for a1111 on mac
- Checkpoints tab now shows "image hidden" for images that are hidden by the NSFW filter
- OAuth-type connection errors in Account Settings now show a more detailed error message
- The "Download Failed" message for model downloads is now persistent until dismissed
- Separated the Generate button from the prompt control in Inference so it can be moved like other controls
- Updated translations for Turkish and Russian
- (Internal) Updated Avalonia to 11.1.3 - Includes major rendering and performance optimizations, animation refinements, improved IME / text selection, and improvements for window sizing / z-order / multi-monitor DPI scaling. ([avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-development](https://avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-development))
- (Internal) Updated SkiaSharp (Rendering Backend) to 3.0.0-preview.4.1, potentially fixes issues with window rendering artifacts on some machines.
- (Internal) Updated other dependencies for security and bug fixes.
### Fixed
- Fixed [#888](https://github.com/LykosAI/StabilityMatrix/issues/888) - error updating kohya_ss due to long paths
- Fixed some ScrollViewers changing scroll position when focus changes
- Fixed CivitAI Model Browser sometimes incorrectly showing "No models found" before toggling "Show NSFW" or "Hide Installed" filters
- Fixed SwarmUI settings being overwritten on launch
- Fixed issue where some Inference-generated images would be saved with the bottom missing
- Fixed [#851](https://github.com/LykosAI/StabilityMatrix/issues/851) - missing fbgemm.dll errors when using latest torch with certain packages
- Fixed issue where ApproxVAE models would show up in the VAE folder
- Fixed [#878](https://github.com/LykosAI/StabilityMatrix/issues/878) - Checkpoints tab will no longer try to browse directories it can't access
- Fixed crash when opening Settings page when refreshing CivitAI account status results in an error
- Fixed [#814](https://github.com/LykosAI/StabilityMatrix/issues/814), [#875](https://github.com/LykosAI/StabilityMatrix/issues/875) - Error when installing RuinedFooocus
- LORAs are now sorted by model name properly in the Extra Networks dropdown
- (macOS) Fixed OAuth connection prompts in Account Settings not automatically updating status after connection. Custom URL schemes are now also supported on macOS builds.
### Supporters
#### Visionaries
- A heartfelt thank you to our Visionary-tier patron, **Waterclouds**! We greatly appreciate your continued support!
#### Pioneers
- A special shoutout to our Pioneer-tier patrons: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**! Your unwavering support means a great deal!
## v2.12.0-pre.3
### Added
- Added Python dependencies override table to package installation options, where the default pip packages may be overriden for a package's install and updates. This can be changed later or added to existing packages through `Package Menu > Python Dependencies Override`
- Added optional anonymous usage reporting for gauging popularity of package installs and features. You will be asked whether you want to enable this feature on launch, and can change your choice at any time in `Settings > System > Analytics`
- Added Korean translations thanks to maakcode!
### Changed
- Show better error message for early access model downloads
- Updated torch version for a1111 on mac
- Checkpoints tab now shows "image hidden" for images that are hidden by the NSFW filter
- Updated translations for Turkish and Russian
### Fixed
- Fixed issue where some Inference-generated images would be saved with the bottom missing
- Fixed CivitAI Browser page scroll refresh not ordering models correctly
- Fixed missing fbgemm.dll errors when using latest torch with certain packages
- Fixed issue where ApproxVAE models would show up in the VAE folder
- Fixed [#878](https://github.com/LykosAI/StabilityMatrix/issues/878) - Checkpoints tab will no longer try to browse directories it can't access
- Fixed crash when opening Settings page when refreshing CivitAI account status results in an error
### Supporters
#### Visionaries
- A huge thank you to our Visionary-tier Patreon supporter, **Waterclouds**! We appreciate your continued support, and are grateful to have you on this journey with us!
## v2.12.0-pre.2
### Added
- Added "Show NSFW Images" toggle to the Checkpoints page
- Added "Model Loader" option to Inference, for loading UNet/GGUF/NF4 models (e.g. Flux)
- Added type-to-search for the Inference model selectors. Start typing while the dropdown is open to navigate the list.
- Added "Sign in with Google" option for connecting your Lykos Account on the Account Settings page
### Changed
- Updated Brazilian Portuguese translations thanks to thiagojramos
- Merged the "Flux Text to Image" workflow back into the main Text to Image workflow
### Fixed
- Fixed CivitAI Model Browser sometimes incorrectly showing "No models found" before toggling "Show NSFW" or "Hide Installed" filters
- Fixed Automatic1111 & related packages not including the gradio-allowed-path argument for the shared output folder
- Fixed SwarmUI settings being overwritten on launch
- Fixed Forge output folder links pointing to the incorrect folder
- LORAs are now sorted by model name properly in the Extra Networks dropdown
- Fixed errors when downloading models with invalid characters in the file name
## v2.12.0-pre.1
### Added
- Added "Hide Installed Models" toggle to the CivitAI Model Browser
### Changed
- ComfyUI will no longer be pinned to torch 2.1.2 for nvidia users on Windows
- Model browser download progress no longer covers the entire card for the entire duration of the download
- Updated torch index to `rocm6.0` for AMD users of ComfyUI
- (Internal) Updated to Avalonia 11.1.2
- OAuth-type connection errors in Account Settings now show a more detailed error message
### Fixed
- Fixed Inference not connecting with "Could not connect to backend - JSON value could not be converted" error with API changes from newer ComfyUI versions
- (macOS) Fixed OAuth connection prompts in Account Settings not automatically updating status after connection. Custom URL schemes are now also supported on macOS builds.
## v2.12.0-dev.3
### Added
- Added Settings option "Console: History Size" to adjust the number of lines stored in the console history when running packages. Defaults to 9001 lines.
#### Inference
- Added new project type, "Flux Text to Image", a Flux-native workflow for text-to-image projects
- Added support for the FP8 version of Flux in the regular Text to Image and Image to Image workflows via the "Use Flux Guidance" Sampler Addon
#### Model Browser
- Added AuraFlow & Flux base model types to the CivitAI model browser
- Added CLIP/Text Encoders section to HuggingFace model browser
#### Checkpoint Manager
- Added new Metadata Editor (accessible via the right-click menu), allowing you to create or edit metadata for models
- Added "New Directory" and "Delete" options to the context menu of the tree view.
- Added new toggle for drag & drop - when enabled, all selected models will now move together with the dragged model
- Added "File Size" sorting option
- Added "Hide Empty Categories" toggle
- Added "Select All" button to the InfoBar (shown when at least one model is selected)
- Added "unet" shared model folder for ComfyUI
### Changed
- Optimized image loading across the app, with loading speed now up to 4x faster for local images, and up to 17x faster for remote images
- Image loading in the Outputs page now uses native memory management for ~2x less peak memory usage, and will release memory more quickly when switching away from the Outputs page or scrolling images out of view
- Improved animation fluidity of image rendering while scrolling quickly across large collections (e.g. Outputs, Model Browser)
- The "Download Failed" message for model downloads is now persistent until dismissed
- Separated the Generate button from the prompt control in Inference so it can be moved like other controls
### Fixed
- Fixed "The version of the native libSkiaSharp library (88.1) is incompatible with this version of SkiaSharp." error for Linux users
- Fixed download links for IPAdapters in the HuggingFace model browser
- Fixed potential memory leak of transient controls (Inference Prompt and Output Image Viewer) not being garbage collected due to event subscriptions
- Fixed Batch Count seeds not being recorded properly in Inference projects and image metadata
### Supporters
#### Visionaries
- A heartfelt thank you to our Visionary-tier Patreon supporter, **Scopp Mcdee**! We truly appreciate your continued support!
## v2.12.0-dev.2
### Added
- Added Face Detailer module to Inference
- Added ultralytics models to HuggingFace model browser
- Added DoRA category to CivitAI model browser
- Added macOS support for Fooocus & related forks
- (Windows, Linux) Added Vulkan rendering support using launch argument `--vulkan`. (On Windows, the default WinUI composition renderer is likely still preferrable. Linux users are encouraged to try the new renderer to see if it improves performance and responsiveness.)
### Changed
- (Internal) Updated Avalonia to 11.1.1 - Includes major rendering and performance optimizations, animation refinements, improved IME / text selection, and improvements for window sizing / z-order / multi-monitor DPI scaling. ([avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-development](https://avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-development))
- (Internal) Updated SkiaSharp (Rendering Backend) to 3.0.0-preview.4.1, potentially fixes issues with window rendering artifacts on some machines.
- (Internal) Updated other dependencies for security and bug fixes.
### Fixed
- Fixed some ScrollViewers changing scroll position when focus changes
- Fixed [#782](https://github.com/LykosAI/StabilityMatrix/issues/782) - conflict error when launching new versions of Forge
- Fixed incorrect torch versions being installed for InvokeAI
### Supporters
#### Visionaries
- A huge thank you goes out to our esteemed Visionary-tier Patreon backers: **Scopp Mcdee**, **Waterclouds**, and **Akiro_Senkai**. Your kind support means the world!
## v2.12.0-dev.1
### Added
- Added new package: [Fooocus - mashb1t's 1-Up Edition](https://github.com/mashb1t/Fooocus) by mashb1t
- Added new package: [Stable Diffusion WebUI reForge](https://github.com/Panchovix/stable-diffusion-webui-reForge/) by Panchovix
- Image viewer context menus now have 2 options: `Copy (Ctrl+C)` which now always copies the image as a file, and `Copy as Bitmap (Shift+Ctrl+C)` (Available on Windows) which copies to the clipboard as native bitmap. This changes the previous single `Copy` button behavior that would first attempt a native bitmap copy on Windows when available, and fall back to a file copy if not.
- Added "Change Version" option to the package card overflow menu, allowing you to downgrade or upgrade a package to a specific version or commit
- Added "Disable Update Check" option to the package card overflow menu, allowing you to disable update checks for a specific package
- Added "Run Command" option in Settings for running a command with the embedded Python or Git executables
- Added Intel OneAPI XPU backend (IPEX) option for SD.Next
### Supporters
#### Visionaries
- Shoutout to our Visionary-tier Patreon supporters, **Scopp Mcdee**, **Waterclouds**, and our newest Visionary, **Akiro_Senkai**! Many thanks for your generous support!
## v2.11.8
### Added
- Added Flux & AuraFlow types to CivitAI Browser
- Added unet folder links for ComfyUI thanks to jeremydk
- Added CLIP folder links for Forge
### Changed
- Updated Brazilian Portuguese translations thanks to thiagojramos
### Fixed
- Fixed [#840](https://github.com/LykosAI/StabilityMatrix/issues/840) - CivitAI model browser not loading search results
- Fixed SwarmUI settings being overwritten on launch
- Fixed [#832](https://github.com/LykosAI/StabilityMatrix/issues/832) [#847](https://github.com/LykosAI/StabilityMatrix/issues/847) - Forge output folder links pointing to the incorrect folder
- Fixed errors when downloading models with invalid characters in the file name
- Fixed error when installing RuinedFooocus on nvidia GPUs
### Supporters
#### Pioneers
- A big shoutout to our Pioneer-tier patrons: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**! We deeply appreciate your ongoing support!
## v2.11.7
### Changed
- Forge will use the recommended pytorch version 2.3.1 the next time it is updated
- InvokeAI users with AMD GPUs on Linux will be upgraded to the rocm5.6 version of pytorch the next time it is updated
### Fixed
- Fixed Inference not connecting with "Could not connect to backend - JSON value could not be converted" error with API changes from newer ComfyUI versions
### Supporters
#### Pioneers
- Shoutout to our Pioneer-tier supporters on Patreon: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**! Thanks for all of your continued support!
## v2.11.6
### Fixed
- Fixed incorrect IPAdapter download links in the HuggingFace model browser
- Fixed potential memory leak of transient controls (Inference Prompt and Output Image Viewer) not being garbage collected due to event subscriptions
- Fixed Batch Count seeds not being recorded properly in Inference projects and image metadata
- Fixed [#795](https://github.com/LykosAI/StabilityMatrix/issues/795) - SwarmUI launch args not working properly
- Fixed [#745](https://github.com/LykosAI/StabilityMatrix/issues/745) - not passing Environment Variables to SwarmUI
### Supporters
#### Visionaries
- Shoutout to our Visionary-tier Patreon supporter, **Scopp Mcdee**! Huge thanks for your continued support!
#### Pioneers
- Many thanks to our Pioneer-tier supporters on Patreon: **tankfox**, **tanangular**, **Mr. Unknown**, and **Szir777**! Your continued support is greatly appreciated!
## v2.11.5
### Added
- Added DoRA category to CivitAI model browser
### Fixed
- Fixed `TaskCanceledException` when adding CivitAI Api key or searching for models when the API takes too long to respond. Retry and timeout behavior has been improved.
- Fixed [#782](https://github.com/LykosAI/StabilityMatrix/issues/782) - conflict error when launching new versions of Forge
- Fixed incorrect torch versions being installed for InvokeAI
- Fixed `ArgumentOutOfRangeException` with the Python Packages dialog ItemSourceView when interacting too quickly after loading.
### Supporters
#### Visionaries
- Shoutout to our Visionary-tier Patreon supporters, **Scopp Mcdee**, **Waterclouds**, and our newest Visionary, **Akiro_Senkai**! Many thanks for your generous support!
#### Pioneers
- Many thanks to our Pioneer-tier supporters on Patreon, **tankfox**, **tanangular**, and our newest Pioneers, **Mr. Unknown** and **Szir777**! Your support is greatly appreciated!
## v2.11.4
### Changed
- Base Python install will now use `setuptools==69.5.1` for compatibility with `torchsde`. Individual Packages can upgrade as required.
- Improved formatting of "Copy Details" action on the Unexpected Error dialog
- (Debug) Logging verbosity for classes can now be configured with environment variables (`Logging__LogLevel__`).
### Fixed
- Fixed ComfyUI slower generation speed with new torch versions not including flash attention for windows, pinned `torch==2.1.2` for ComfyUI on Windows CUDA
- Fixed [#719](https://github.com/LykosAI/StabilityMatrix/issues/719) - Fix comments in Inference prompt not being ignored
- Fixed TaskCanceledException when Inference prompts finish before the delayed progress handler (250ms)
### Supporters
#### Visionaries
- Huge thanks to our Visionary-tier supporters on Patreon, **Scopp Mcdee** and **Waterclouds**! Your support helps us continue to improve Stability Matrix!
#### Pioneers
- Thank you to our Pioneer-tier supporters on Patreon, **tankfox** and **tanangular**! Your support is greatly appreciated!
## v2.11.3
### Changed
- Base Python install will now use `pip>=23.3.2,<24.1` for compatibility with `torchsde`.Individual Packages can upgrade as required.
- Added default `PIP_DISABLE_PIP_VERSION_CHECK=1` environment variable to suppress notices about pip version checks.
- As with other default environment variables, this can be overridden by setting your own value in `Settings > Environment Variables [Edit]`.
### Fixed
- Fooocus Package - Added `pip>=23.3.2,<24.1` specifier before install, fixes potential install errors due to deprecated requirement spec used by `torchsde`.
- Fixed error when launching SwarmUI when installed to a path with spaces
- Fixed issue where model folders were being created too late in certain cases
- Fixed [#683](https://github.com/LykosAI/StabilityMatrix/issues/683) - Model indexing causing LiteDB errors after upgrading from older versions due to updated enum values
### Supporters
#### Visionaries
- Huge thanks to our Visionary-tier supporters on Patreon, **Scopp Mcdee** and **Waterclouds**! Your support helps us continue to improve Stability Matrix!
#### Pioneers
- Thank you to our Pioneer-tier supporters on Patreon, **tankfox** and **tanangular**! Your support is greatly appreciated!
## v2.11.2
### Changed
- StableSwarmUI installs will be migrated to SwarmUI by mcmonkeyprojects the next time the package is updated
- Note: As of 2024/06/21 StableSwarmUI will no longer be maintained under Stability AI. The original developer will be maintaining an independent version of this project
### Fixed
- Fixed [#700](https://github.com/LykosAI/StabilityMatrix/issues/700) - `cannot import 'packaging'` error for Forge
### Supporters
#### Visionaries
- Huge thanks to our Visionary-tier supporters on Patreon, **Scopp Mcdee** and **Waterclouds**! Your support helps us continue to improve Stability Matrix!
#### Pioneers
- Thank you to our Pioneer-tier supporters on Patreon, **tankfox** and **tanangular**! Your support is greatly appreciated!
## v2.11.1
### Added
- Added Rename option back to the Checkpoints page
### Changed
- Unobserved Task Exceptions across the app will now show a toast notification to aid in debugging
- Updated SD.Next Package details and thumbnail - [#697](https://github.com/LykosAI/StabilityMatrix/pull/697)
### Fixed
- Fixed [#689](https://github.com/LykosAI/StabilityMatrix/issues/689) - New ComfyUI installs encountering launch error due to torch 2.0.0 update, added pinned `numpy==1.26.4` to install and update.
- Fixed Inference image mask editor's 'Load Mask' not able to load image files
- Fixed Fooocus ControlNet default config shared folder mode not taking effect
- Fixed tkinter python libraries not working on macOS with 'Can't find a usable init.tcl' error
### Supporters
#### Visionaries
- Shoutout to our Visionary-tier supporters on Patreon, **Scopp Mcdee** and **Waterclouds**! Your generous support is appreciated and helps us continue to make Stability Matrix better for everyone!
#### Pioneers
- A big thank you to our Pioneer-tier supporters on Patreon, **tankfox** and **tanangular**! Your support helps us continue to improve Stability Matrix!
## v2.11.0
### Added
#### Packages
- Added new package: [SDFX](https://github.com/sdfxai/sdfx/) by sdfxai
- Added ZLUDA option for SD.Next
- Added more launch options for Forge - [#618](https://github.com/LykosAI/StabilityMatrix/issues/618)
- Added search bar to the Python Packages dialog
#### Inference
- Added Inpainting support for Image To Image projects using the new image mask canvas editor
- Added alternate Lora / LyCORIS drop-down model selection, can be toggled via the model settings button. Allows choosing both CLIP and Model Weights. The existing prompt-based `` method is still available.
- Added optional Recycle Bin mode when deleting images in the Inference image browser, can be disabled in settings (Currently available on Windows and macOS)
#### Model Browsers
- Added PixArt, SDXL Hyper, and SD3 options to the CivitAI Model Browser
- Added XL ControlNets section to HuggingFace model browser
- Added download speed indicator to model downloads in the Downloads tab
#### Output Browser
- Added support for indexing and displaying jpg/jpeg & gif images (in additional to png and webp / animated webp), with metadata parsing and search for compatible formats
#### Settings
- Added setting for locale specific or invariant number formatting
- Added setting for toggling model browser auto-search on load
- Added option in Settings to choose whether to Copy or Move files when dragging and dropping files into the Checkpoint Manager
- Added folder shortcuts in Settings for opening common app and system folders, such as Data Directory and Logs
#### Translations
- Added Brazilian Portuguese language option, thanks to jbostroski for the translation!
### Changed
- Maximized state is now stored on exit and restored on launch
- Drag & drop imports now move files by default instead of copying
- Clicking outside the Select Model Version dialog will now close it
- Changed Package card buttons to better indicate that they are buttons
- Log file storage has been moved from `%AppData%/StabilityMatrix` to a subfolder: `%AppData%/StabilityMatrix/Logs`
- Archived log files now have an increased rolling limit of 9 files, from 2 files previously. Their file names will now be in the format `app.{yyyy-MM-dd HH_mm_ss}.log`. The current session log file remains named `app.log`.
- Updated image controls on Recommended Models dialog to match the rest of the app
- Improved app shutdown clean-up process reliability and speed
- Improved ProcessTracker speed and clean-up safety for faster subprocess and package launching performance
- Updated HuggingFace page so the command bar stays fixed at the top
- Revamped Checkpoints page now shows available model updates and has better drag & drop functionality
- Revamped file deletion confirmation dialog with affected file paths display and recycle bin / permanent delete options (Checkpoint and Output Browsers) (Currently available on Windows and macOS)
### Fixed
- Fixed crash when parsing invalid generated images in Output Browser and Inference image viewer, errors will be logged instead and the image will be skipped
- Fixed missing progress text during package updates
- (Windows) Fixed "Open in Explorer" buttons across the app not opening the correct path on ReFS partitions
- (macOS, Linux) Fixed Subprocesses of packages sometimes not being closed when the app is closed
- Fixed Inference tabs sometimes not being restored from previous sessions
- Fixed multiple log files being archived in a single session, and losing some log entries
- Fixed error when installing certain packages with comments in the requirements file
- Fixed error when deleting Inference browser images in a nested project path with recycle bin mode
- Fixed extra text in positive prompt when loading image parameters in Inference with empty negative prompt value
- Fixed NullReferenceException that sometimes occurred when closing Inference tabs with images due to Avalonia.Bitmap.Size accessor issue
- Fixed [#598](https://github.com/LykosAI/StabilityMatrix/issues/598) - program not exiting after printing help or version text
- Fixed [#630](https://github.com/LykosAI/StabilityMatrix/issues/630) - InvokeAI update hangs forever waiting for input
- Fixed issue where the "installed" state on HuggingFace model browser was not always correct
- Fixed model folders not being created on startup
### Supporters
#### Visionaries
- Shoutout to our Visionary-tier supporters on Patreon, **Scopp Mcdee** and **Waterclouds**! Your generous support is appreciated and helps us continue to make Stability Matrix better for everyone!
#### Pioneers
- A big thank you to our Pioneer-tier supporters on Patreon, **tankfox** and **tanangular**! Your support helps us continue to improve Stability Matrix!
## v2.11.0-pre.2
### Added
- Added folder shortcuts in Settings for opening common app and system folders, such as Data Directory and Logs.
### Changed
- Log file storage have been moved from `%AppData%/StabilityMatrix` to a subfolder: `%AppData%/StabilityMatrix/Logs`
- Archived log files now have an increased rolling limit of 9 files, from 2 files previously. Their file names will now be in the format `app.{yyyy-MM-dd HH_mm_ss}.log`. The current session log file remains named `app.log`.
- Updated image controls on Recommended Models dialog to match the rest of the app
- Improved app shutdown clean-up process reliability and speed
- Improved ProcessTracker speed and clean-up safety for faster subprocess and package launching performance
### Fixed
- Fixed crash when parsing invalid generated images in Output Browser and Inference image viewer, errors will be logged instead and the image will be skipped
- Fixed issue where blue and red color channels were swapped in the mask editor dialog
- Fixed missing progress text during package updates
- Fixed "Git and Node.js are required" error during SDFX install
- (Windows) Fixed "Open in Explorer" buttons across the app not opening the correct path on ReFS partitions
- (Windows) Fixed Sdfx electron window not closing when stopping the package
- (macOS, Linux) Fixed Subprocesses of packages sometimes not being closed when the app is closed
- Fixed Inference tabs sometimes not being restored from previous sessions
- Fixed multiple log files being archived in a single session, and losing some log entries
- Fixed error when installing certain packages with comments in the requirements file
- Fixed some more missing progress texts during various activities
### Supporters
#### Visionaries
- A heartfelt thank you to our Visionary-tier Patreon supporters, **Scopp Mcdee** and **Waterclouds**! Your generous contributions enable us to keep enhancing Stability Matrix!
## v2.11.0-pre.1
### Added
- Added new package: [SDFX](https://github.com/sdfxai/sdfx/) by sdfxai
- Added "Show Nested Models" toggle for new Checkpoints page, allowing users to show or hide models in subfolders of the selected folder
- Added ZLUDA option for SD.Next
- Added PixArt & SDXL Hyper options to the Civitai model browser
- Added release date to model update notification card on the Checkpoints page
- Added option in Settings to choose whether to Copy or Move files when dragging and dropping files into the Checkpoint Manager
- Added more launch options for Forge - [#618](https://github.com/LykosAI/StabilityMatrix/issues/618)
#### Inference
- Added Inpainting support for Image To Image projects using the new image mask canvas editor
### Changed
- Maximized state is now stored on exit and restored on launch
- Clicking outside the Select Model Version dialog will now close it
- Changed Package card buttons to better indicate that they are buttons
### Fixed
- Fixed error when deleting Inference browser images in a nested project path with recycle bin mode
- Fixed extra text in positive prompt when loading image parameters in Inference with empty negative prompt value
- Fixed NullReferenceException that sometimes occured when closing Inference tabs with images due to Avalonia.Bitmap.Size accessor issue
- Fixed package installs not showing any progress messages
- Fixed crash when viewing model details for Unknown model types in the Checkpoint Manager
- Fixed [#598](https://github.com/LykosAI/StabilityMatrix/issues/598) - program not exiting after printing help or version text
- Fixed [#630](https://github.com/LykosAI/StabilityMatrix/issues/630) - InvokeAI update hangs forever waiting for input
### Supporters
#### Visionaries
- Many thanks to our Visionary-tier supporters on Patreon, **Scopp Mcdee** and **Waterclouds**! Your generous support helps us continue to improve Stability Matrix!
## v2.11.0-dev.3
### Added
- Added download speed indicator to model downloads in the Downloads tab
- Added XL ControlNets section to HuggingFace model browser
- Added toggle in Settings for model browser auto-search on load
- Added optional Recycle Bin mode when deleting images in the Inference image browser, can be disabled in settings (Currently on Windows only)
### Changed
- Revamped Checkpoints page now shows available model updates and has better drag & drop functionality
- Updated HuggingFace page so the command bar stays fixed at the top
- Revamped file deletion confirmation dialog with affected file paths display and recycle bin / permanent delete options (Checkpoint and Output Browsers) (Currently on Windows only)
### Fixed
- Fixed issue where the "installed" state on HuggingFace model browser was not always correct
### Supporters
#### Visionaries
- Special shoutout to our first two Visionaries on Patreon, **Scopp Mcdee** and **Waterclouds**! Thank you for your generous support!
## v2.11.0-dev.2
### Added
- Added Brazilian Portuguese language option, thanks to jbostroski for the translation!
- Added setting for locale specific or invariant number formatting
- Added support for jpg/jpeg & gif images in the Output Browser
### Changed
- Centered OpenArt browser cards
### Fixed
- Fixed MPS install on macOS for ComfyUI, A1111, SDWebUI Forge, and SDWebUI UX causing torch to be upgraded to dev nightly versions and causing incompatibilities with dependencies.
- Fixed "Auto Scroll to End" not working in some scenarios
- Fixed "Auto Scroll to End" toggle button not scrolling to the end when toggled on
- Fixed/reverted output folder name changes for Automatic1111
- Fixed xformers being uninstalled with every ComfyUI update
- Fixed Inference Lora menu strength resetting to default if out of slider range (0 to 1)
- Fixed missing progress text during package installs
## v2.11.0-dev.1
### Added
- Added search bar to the Python Packages dialog
#### Inference
- Alternate Lora / LyCORIS drop-down model selection, can be toggled via the model settings button. The existing prompt-based Lora / LyCORIS method is still available.
### Fixed
- Fixed crash when failing to parse Python package details
## v2.10.3
### Changed
- Centered OpenArt browser cards
### Fixed
- Fixed MPS install on macOS for ComfyUI, A1111, SDWebUI Forge, and SDWebUI UX causing torch to be upgraded to dev nightly versions and causing incompatibilities with dependencies.
- Fixed crash when failing to parse Python package details
- Fixed "Auto Scroll to End" not working in some scenarios
- Fixed "Auto Scroll to End" toggle button not scrolling to the end when toggled on
- Fixed/reverted output folder name changes for Automatic1111
- Fixed xformers being uninstalled with every ComfyUI update
- Fixed missing progress text during package installs
## v2.10.2
### Changed
- Updated translations for Spanish and Turkish
### Fixed
- Fixed more crashes when loading invalid connected model info files
- Fixed pip installs not parsing comments properly
- Fixed crash when sending input to a process that isn't running
- Fixed breadcrumb on console page showing incorrect running package name
- Fixed [#576](https://github.com/LykosAI/StabilityMatrix/issues/576) - drag & drop crashes on macOS & Linux
- Fixed [#594](https://github.com/LykosAI/StabilityMatrix/issues/594) - missing thumbnails in Inference model selector
- Fixed [#600](https://github.com/LykosAI/StabilityMatrix/issues/600) - kohya_ss v24+ not launching
- Downgraded Avalonia back to 11.0.9 to fix [#589](https://github.com/LykosAI/StabilityMatrix/issues/589) and possibly other rendering issues
## v2.10.1
### Added
- Added SVD Shared Model & Output Folders for Forge (fixes [#580](https://github.com/LykosAI/StabilityMatrix/issues/580))
### Changed
- Improved error message when logging in with a Lykos account fails due to incorrect email or password
- Model Browser & Workflow Browser now auto-load when first navigating to those pages
- Removed update confirmation dialog, instead showing the new version in the update button tooltip
### Fixed
- Fixed package launch not working when environment variable `SETUPTOOLS_USE_DISTUTILS` is set due to conflict with a default environment variable. User environment variables will now correctly override any default environment variables.
- Fixed "No refresh token found" error when failing to login with Lykos account in some cases
- Fixed blank entries appearing in the Categories dropdown on the Checkpoints page
- Fixed crash when loading invalid connected model info files
- Fixed [#585](https://github.com/LykosAI/StabilityMatrix/issues/585) - Crash when drag & drop source and destination are the same
- Fixed [#584](https://github.com/LykosAI/StabilityMatrix/issues/584) - `--launch-package` argument not working
- Fixed [#581](https://github.com/LykosAI/StabilityMatrix/issues/581) - Inference teaching tip showing more often than it should
- Fixed [#578](https://github.com/LykosAI/StabilityMatrix/issues/578) - "python setup.py egg_info did not run successfully" failure when installing Auto1111 or SDWebUI Forge
- Fixed [#574](https://github.com/LykosAI/StabilityMatrix/issues/574) - local images not showing on macOS or Linux
## v2.10.0
### Added
- Added Reference-Only mode for Inference ControlNet, used for guiding the sampler with an image without a pretrained model. Part of the latent and attention layers will be connected to the reference image, similar to Image to Image or Inpainting.
- Inference ControlNet module now supports over 42 preprocessors, a new button next to the preprocessors dropdown allows previewing the output of the selected preprocessor on the image.
- Added resolution selection for Inference ControlNet module, this controls preprocessor resolution too.
- Added Layer Diffuse sampler addon to Inference, allows generating foreground with transparency with SD1.5 and SDXL.
- Added support for deep links from the new Stability Matrix Chrome extension
- Added OpenArt.AI workflow browser for ComfyUI workflows
- Added more metadata to the image dialog info flyout
- Added Output Sharing toggle in Advanced Options during install flow
### Changed
- Revamped the Packages page to enable running multiple packages at the same time
- Changed the Outputs Page to use a TreeView for the directory selection instead of a dropdown selector
- Model download location selector now searches all subfolders
- Inference Primary Sampler Addons (i.e. ControlNet, FreeU) are now inherited by Hires Fix Samplers, this can be overriden from the Hires Fix module's settings menu by disabling the "Inherit Primary Sampler Addons" option.
- Revisited the way images are loaded on the outputs page, with improvements to loading speed & not freezing the UI while loading
- Updated translations for French, Spanish, and Turkish
- Changed to a new image control for pages with many images
- (Internal) Updated to Avalonia 11.0.10
### Fixed
- Fixed [#559](https://github.com/LykosAI/StabilityMatrix/issues/559) - "Unable to load bitmap from provided data" error in Checkpoints page
- Fixed [#522](https://github.com/LykosAI/StabilityMatrix/issues/522) - Incorrect output directory path for latest Auto1111
- Fixed [#529](https://github.com/LykosAI/StabilityMatrix/issues/529) - OneTrainer requesting input during update
- Fixed Civitai model browser error when sorting by Installed with more than 100 installed models
- Fixed CLIP Install errors due to setuptools distutils conflict, added default environment variable setting `SETUPTOOLS_USE_DISTUTILS=stdlib`
- Fixed progress bars not displaying properly during package installs & updates
- Fixed ComfyUI extension updates not running install.py / updating requirements.txt
- Improved performance when deleting many images from the Outputs page
- Fixed ComfyUI torch downgrading to 2.1.2 when updating
- Fixed Inference HiresFix module "Inherit Primary Sampler Addons" setting not effectively disabling when unchecked
- Fixed model download location options for VAEs in the CivitAI Model Browser
### Removed
- Removed the main Launch page, as it is no longer needed with the new Packages page
## v2.10.0-pre.2
### Added
- Added more metadata to the image dialog info flyout
- Added Restart button to console page
### Changed
- Model download location selector now searches all subfolders
### Fixed
- Fixed Civitai model browser not showing images when "Show NSFW" is disabled
- Fixed crash when Installed Workflows page is opened with no Workflows folder
- Fixed progress bars not displaying properly during package installs & updates
- Fixed ComfyUI extension updates not running install.py / updating requirements.txt
## v2.10.0-pre.1
### Added
- Added OpenArt.AI workflow browser for ComfyUI workflows
- Added Output Sharing toggle in Advanced Options during install flow
### Changed
- Changed to a new image control for pages with many images
- Removed Symlink option for InvokeAI due to changes with InvokeAI v4.0+
- Output sharing is now enabled by default for new installations
- (Internal) Updated to Avalonia 11.0.10
### Fixed
- Improved performance when deleting many images from the Outputs page
- Fixed ComfyUI torch downgrading to 2.1.2 when updating
- Fixed [#529](https://github.com/LykosAI/StabilityMatrix/issues/529) - OneTrainer requesting input during update
- Fixed "Could not find entry point for InvokeAI" error on InvokeAI v4.0+
## v2.10.0-dev.3
### Added
- Added support for deep links from the new Stability Matrix Chrome extension
### Changed
- Due to changes on the CivitAI API, you can no longer select a specific page in the CivitAI Model Browser
- Due to the above API changes, new pages are now loaded via "infinite scrolling"
### Fixed
- Fixed Inference HiresFix module "Inherit Primary Sampler Addons" setting not effectively disabling when unchecked
- Fixed model download location options for VAEs in the CivitAI Model Browser
- Fixed crash on startup when library directory is not set
- Fixed One-Click install progress dialog not disappearing after completion
- Fixed ComfyUI with Inference pop-up during one-click install appearing below the visible scroll area
- Fixed no packages being available for one-click install on PCs without a GPU
- Fixed models not being removed from the installed models cache when deleting them from the Checkpoints page
- Fixed missing ratings on some models in the CivitAI Model Browser
- Fixed missing favorite count in the CivitAI Model Browser
- Fixed recommended models not showing all SDXL models
## v2.10.0-dev.2
### Added
- Added Reference-Only mode for Inference ControlNet, used for guiding the sampler with an image without a pretrained model. Part of the latent and attention layers will be connected to the reference image, similar to Image to Image or Inpainting.
### Changed
- Inference Primary Sampler Addons (i.e. ControlNet, FreeU) are now inherited by Hires Fix Samplers, this can be overriden from the Hires Fix module's settings menu by disabling the "Inherit Primary Sampler Addons" option.
- Revisited the way images are loaded on the outputs page, with improvements to loading speed & not freezing the UI while loading
### Fixed
- Fixed Outputs page not remembering where the user last was in the TreeView in certain circumstances
- Fixed Inference extension upgrades not being added to missing extensions list for prompted install
- Fixed "The Open Web UI button has moved" teaching tip spam
## v2.10.0-dev.1
### Added
- Inference ControlNet module now supports over 42 preprocessors, a new button next to the preprocessors dropdown allows previewing the output of the selected preprocessor on the image.
- Added resolution selection for Inference ControlNet module, this controls preprocessor resolution too.
### Changed
- Revamped the Packages page to enable running multiple packages at the same time
- Changed the Outputs Page to use a TreeView for the directory selection instead of a dropdown selector
### Removed
- Removed the main Launch page, as it is no longer needed with the new Packages page
## v2.9.3
### Changed
- Removed Symlink option for InvokeAI to prevent InvokeAI from moving models into its own directories (will be replaced with a Config option in a future update)
### Fixed
- Fixed images not appearing in Civitai Model Browser when "Show NSFW" was disabled
- Fixed [#556](https://github.com/LykosAI/StabilityMatrix/issues/556) - "Could not find entry point for InvokeAI" error
## v2.9.2
### Changed
- Due to changes with the CivitAI API, you can no longer select a specific page in the CivitAI Model Browser
- Due to the above API changes, new pages are now loaded via "infinite scrolling"
### Fixed
- Fixed models not being removed from the installed models cache when deleting them from the Checkpoints page
- Fixed model download location options for VAEs in the CivitAI Model Browser
- Fixed One-Click install progress dialog not disappearing after completion
- Fixed ComfyUI with Inference pop-up during one-click install appearing below the visible scroll area
- Fixed no packages being available for one-click install on PCs without a GPU
## v2.9.1
### Added
- Fixed [#498](https://github.com/LykosAI/StabilityMatrix/issues/498) Added "Pony" category to CivitAI Model Browser
### Changed
- Changed package deletion warning dialog to require additional confirmation
### Fixed
- Fixed [#502](https://github.com/LykosAI/StabilityMatrix/issues/502) - missing launch options for Forge
- Fixed [#500](https://github.com/LykosAI/StabilityMatrix/issues/500) - missing output images in Forge when using output sharing
- Fixed [#490](https://github.com/LykosAI/StabilityMatrix/issues/490) - `mpmath has no attribute 'rational'` error on macOS
- Fixed [#510](https://github.com/ionite34/StabilityMatrix/pull/564/files) - kohya_ss packages with v23.0.x failing to install due to missing 'packaging' dependency
- Fixed incorrect progress text when deleting a checkpoint from the Checkpoints page
- Fixed incorrect icon colors on macOS
## v2.9.0
### Added
- Added new package: [StableSwarmUI](https://github.com/Stability-AI/StableSwarmUI) by Stability AI
- Added new package: [Stable Diffusion WebUI Forge](https://github.com/lllyasviel/stable-diffusion-webui-forge) by lllyasviel
- Added extension management for SD.Next and Stable Diffusion WebUI-UX
- Added the ability to choose where CivitAI model downloads are saved
- Added `--launch-package` argument to launch a specific package on startup, using display name or package ID (i.e. `--launch-package "Stable Diffusion WebUI Forge"` or `--launch-package c0b3ecc5-9664-4be9-952d-a10b3dcaee14`)
- Added more Base Model search options to the CivitAI Model Browser
- Added Stable Cascade to the HuggingFace Model Browser
#### Inference
- Added Inference Prompt Styles, with Prompt Expansion model support (i.e. Fooocus V2)
- Added option to load a .yaml config file next to the model with the same name. Can be used with VPred and other models that require a config file.
- Added copy image support on linux and macOS for Inference outputs viewer menu
### Changed
- Updated translations for German, Spanish, French, Japanese, Portuguese, and Turkish
- (Internal) Updated to Avalonia 11.0.9
### Fixed
- Fixed StableSwarmUI not installing properly on macOS
- Fixed [#464](https://github.com/LykosAI/StabilityMatrix/issues/464) - error when installing InvokeAI on macOS
- Fixed [#335](https://github.com/LykosAI/StabilityMatrix/issues/335) Update hanging indefinitely after git step for Auto1111 and SDWebUI Forge
- Fixed Inference output viewer menu "Copy" not copying image
- Fixed image viewer dialog arrow key navigation not working
- Fixed CivitAI login prompt not showing when downloading models that require CivitAI logins
- Fixed unknown model types not showing on checkpoints page (thanks Jerry!)
- Improved error handling for Inference Select Image hash calculation in case file is being written to while being read
## v2.9.0-pre.2
### Added
- Added `--launch-package` argument to launch a specific package on startup, using display name or package ID (i.e. `--launch-package "Stable Diffusion WebUI Forge"` or `--launch-package c0b3ecc5-9664-4be9-952d-a10b3dcaee14`)
- Added more Base Model search options to the CivitAI Model Browser
- Added Stable Cascade to the HuggingFace Model Browser
### Changed
- (Internal) Updated to Avalonia 11.0.9
### Fixed
- Fixed image viewer dialog arrow key navigation not working
- Fixed CivitAI login prompt not showing when downloading models that require CivitAI logins
## v2.9.0-pre.1
### Added
- Added Inference Prompt Styles, with Prompt Expansion model support (i.e. Fooocus V2)
- Added copy image support on linux and macOS for Inference outputs viewer menu
### Fixed
- Fixed StableSwarmUI not installing properly on macOS
- Fixed output sharing for Stable Diffusion WebUI Forge
- Hopefully actually fixed [#464](https://github.com/LykosAI/StabilityMatrix/issues/464) - error when installing InvokeAI on macOS
- Fixed default command line args for SDWebUI Forge on macOS
- Fixed output paths and output sharing for SDWebUI Forge
- Maybe fixed update hanging for Auto1111 and SDWebUI Forge
- Fixed Inference output viewer menu "Copy" not copying image
## v2.9.0-dev.2
### Added
#### Inference
- Added option to load a .yaml config file next to the model with the same name. Can be used with VPred and other models that require a config file.
### Fixed
- Fixed icon sizes of Inference Addons and Steps buttons
## v2.9.0-dev.1
### Added
- Added new package: [StableSwarmUI](https://github.com/Stability-AI/StableSwarmUI) by Stability AI
- Added new package: [Stable Diffusion WebUI Forge](https://github.com/lllyasviel/stable-diffusion-webui-forge) by lllyasviel
- Added extension management for SD.Next and Stable Diffusion WebUI-UX
- Added the ability to choose where CivitAI model downloads are saved
## v2.8.4
### Fixed
- Hopefully actually fixed [#464](https://github.com/LykosAI/StabilityMatrix/issues/464) - error when installing InvokeAI on macOS
## v2.8.3
### Fixed
- Fixed user tokens read error causing failed downloads
- Failed downloads will now log error messages
- Fixed [#458](https://github.com/LykosAI/StabilityMatrix/issues/458) - Save Intermediate Image not working
- Fixed [#453](https://github.com/LykosAI/StabilityMatrix/issues/453) - Update Fooocus `--output-directory` argument to `--output-path`
## v2.8.2
### Added
- Added missing GFPGAN link to Automatic1111 packages
### Fixed
- Fixed Inference Image to Image Denoise setting becoming hidden after changing schedulers
- Fixed Inference ControlNet models showing as downloadable even when they are already installed
- Fixed Inference Sampler Addon conditioning not applying (i.e. ControlNet)
- Fixed extension modification dialog not showing any progress messages
## v2.8.1
### Fixed
- Fixed model links not working in RuinedFooocus for new installations
- Fixed incorrect nodejs download link on Linux (thanks to slogonomo for the fix)
- Fixed failing InvokeAI install on macOS due to missing nodejs
- Increased timeout on Recommended Models call to prevent potential timeout errors on slow connections
- Fixed SynchronizationLockException when saving settings
- Improved error messages with process output for 7z extraction errors
- Fixed missing tkinter dependency for OneTrainer on Windows
- Fixed auto-update on macOS not starting new version from an issue in starting .app bundles with arguments
- Fixed [#436](https://github.com/LykosAI/StabilityMatrix/issues/436) - Crash on invalid json files during checkpoint indexing
## v2.8.0
### Added
- Added Image to Video project type
- Added CLIP Skip setting to inference, toggleable from the model settings button
- Added image and model details in model selection boxes
- Added new package: [OneTrainer](https://github.com/Nerogar/OneTrainer)
- Added native desktop push notifications for some events (i.e. Downloads, Package installs, Inference generation)
- Currently available on Windows and Linux, macOS support is pending
- Added Package Extensions (Plugins) management - accessible from the Packages' 3-dot menu. Currently supports ComfyUI and Automatic1111.
- Added new launch argument options for Fooocus
- Added "Config" Shared Model Folder option for Fooocus
- Added Recommended Models dialog after one-click installer
- Added "Copy Details" button to Unexpected Error dialog
- Added German language option, thanks to Mario da Graca for the translation
- Added Portuguese language options, thanks to nextosai for the translation
- Added base model filter to Checkpoints page
- Added "Compatible Images" category when selecting images for Inference projects
- Added "Find in Model Browser" option to the right-click menu on the Checkpoints page
- Added `--use-directml` launch argument for SDWebUI DirectML fork
- Added release builds for macOS (Apple Silicon)
- Added ComfyUI launch argument configs: Cross Attention Method, Force Floating Point Precision, VAE Precision
- Added Delete button to the CivitAI Model Browser details dialog
- Added "Copy Link to Clipboard" for connected models in the Checkpoints page
- Added support for webp files to the Output Browser
- Added "Send to Image to Image" and "Send to Image to Video" options to the context menu
### Changed
- New package installation flow
- Changed one-click installer to match the new package installation style
- Automatic1111 packages will now use PyTorch v2.1.2. Upgrade will occur during the next package update or upon fresh installation.
- Search box on Checkpoints page now searches tags and trigger words
- Changed the Close button on the package install dialog to "Hide"
- Functionality remains the same, just a name change
- Updated translations for the following languages:
- Spanish
- French
- Japanese
- Turkish
- Inference file name patterns with directory separator characters will now have the subdirectories created automatically
- Changed how settings file is written to disk to reduce potential data loss risk
- (Internal) Updated to Avalonia 11.0.7
### Fixed
- Fixed error when ControlNet module image paths are not found, even if the module is disabled
- Fixed error when finding metadata for archived models
- Fixed error when extensions folder is missing
- Fixed crash when model was not selected in Inference
- Fixed Fooocus Config shared folder mode overwriting unknown config keys
- Fixed potential SD.Next update issues by moving to shared update process
- Fixed crash on startup when Outputs page failed to load categories properly
- Fixed image gallery arrow key navigation requiring clicking before responding
- Fixed crash when loading extensions list with no internet connection
- Fixed crash when invalid launch arguments are passed
- Fixed missing up/downgrade buttons on the Python Packages dialog when the version was not semver compatible
## v2.8.0-pre.5
### Fixed
- Fixed error when ControlNet module image paths are not found, even if the module is disabled
- Fixed error when finding metadata for archived models
- Fixed error when extensions folder is missing
- Fixed error when webp files have incorrect metadata
- Fixed crash when model was not selected in Inference
- Fixed Fooocus Config shared folder mode overwriting unknown config keys
## v2.8.0-pre.4
### Added
- Added Recommended Models dialog after one-click installer
- Added native desktop push notifications for some events (i.e. Downloads, Package installs, Inference generation)
- Currently available on Windows and Linux, macOS support is pending
- Added settings options for notifications
- Added new launch argument options for Fooocus
- Added Automatic1111 & Stable Diffusion WebUI-UX to the compatible macOS packages
### Changed
- Changed one-click installer to match the new package installation style
- Automatic1111 packages will now use PyTorch v2.1.2. Upgrade will occur during the next package update or upon fresh installation.
- Updated French translation with the latest changes
### Fixed
- Fixed [#413](https://github.com/LykosAI/StabilityMatrix/issues/413) - Environment Variables are editable again
- Fixed potential SD.Next update issues by moving to shared update process
- Fixed Invoke install trying to use system nodejs
- Fixed crash on startup when Outputs page failed to load categories properly
## v2.8.0-pre.3
### Added
- Added "Config" Shared Model Folder option for Fooocus
- Added "Copy Details" button to Unexpected Error dialog
### Changed
- (Internal) Updated to Avalonia 11.0.7
- Changed the Close button on the package install dialog to "Hide"
- Functionality remains the same, just a name change
- Updated French translation (thanks Greg!)
### Fixed
- Webp static images can now be shown alongside existing webp animation support
- Fixed image gallery arrow key navigation requiring clicking before responding
- Fixed crash when loading extensions list with no internet connection
- Fixed crash when invalid launch arguments are passed
- Fixed "must give at least one requirement to install" error when installing extensions with empty requirements.txt
## v2.8.0-pre.2
### Added
- Added German language option, thanks to Mario da Graca for the translation
- Added Portuguese language options, thanks to nextosai for the translation
### Changed
- Updated translations for the following languages:
- Spanish
- French
- Japanese
- Turkish
### Fixed
- Fixed Auto-update failing to start new version on Windows and Linux when path contains spaces
- Fixed InvokeAI v3.6.0 `"detail": "Not Found"` error when opening the UI
- Install button will now be properly disabled when the duplicate warning is shown
## v2.8.0-pre.1
### Added
- Added Package Extensions (Plugins) management - accessible from the Packages' 3-dot menu. Currently supports ComfyUI and A1111.
- Added base model filter to Checkpoints page
- Search box on Checkpoints page now searches tags and trigger words
- Added "Compatible Images" category when selecting images for Inference projects
- Added "Find in Model Browser" option to the right-click menu on the Checkpoints page
### Changed
- Removed "Failed to load image" notification when loading some images on the Checkpoints page
- Installed models will no longer be selectable on the Hugging Face tab of the model browser
### Fixed
- Inference file name patterns with directory separator characters will now have the subdirectories created automatically
- Fixed missing up/downgrade buttons on the Python Packages dialog when the version was not semver compatible
- Automatic1111 package installs will now install the missing `jsonmerge` package
## v2.8.0-dev.4
### Added
- Auto-update support for macOS
- New package installation flow
- Added `--use-directml` launch argument for SDWebUI DirectML fork
### Changed
- Changed default Period to "AllTime" in the Model Browser
### Fixed
- Fixed SDTurboScheduler's missing denoise parameter
## v2.8.0-dev.3
### Added
- Added release builds for macOS (Apple Silicon)
- Added new package: [OneTrainer](https://github.com/Nerogar/OneTrainer)
- Added ComfyUI launch argument configs: Cross Attention Method, Force Floating Point Precision, VAE Precision
- Added Delete button to the CivitAI Model Browser details dialog
- Added "Copy Link to Clipboard" for connected models in the Checkpoints page
### Changed
- Python Packages install dialog now allows entering multiple arguments or option flags
### Fixed
- Fixed environment variables grid not being editable related to [Avalonia #13843](https://github.com/AvaloniaUI/Avalonia/issues/13843)
## v2.8.0-dev.2
### Added
#### Inference
- Added Image to Video project type
#### Output Browser
- Added support for webp files
- Added "Send to Image to Image" and "Send to Image to Video" options to the context menu
### Changed
- Changed how settings file is written to disk to reduce potential data loss risk
## v2.8.0-dev.1
### Added
#### Inference
- Added image and model details in model selection boxes
- Added CLIP Skip setting, toggleable from the model settings button
## v2.7.9
### Fixed
- Fixed InvokeAI v3.6.0 `"detail": "Not Found"` error when opening the UI
## v2.7.8
### Changed
- Python Packages install dialog now allows entering multiple arguments or option flags
### Fixed
- Fixed InvokeAI Package dependency versions ([#395](https://github.com/LykosAI/StabilityMatrix/pull/395))
## v2.7.7
### Added
- Added `--use-directml` launch argument for SDWebUI DirectML fork
### Changed
- Model Browser downloads will no longer be disabled if the free drive space is unavailable
- Default Linux installation folder changed to prevent issues with hidden folders
- Changed default Period to "AllTime" in the Model Browser
### Fixed
- Fixed error where Environment Variables were not editable
- Fixed SDTurboScheduler's missing denoise parameter
## v2.7.6
### Added
- Added SDXL Turbo and Stable Video Diffusion to the Hugging Face tab
### Changed
- ControlNet model selector will now show the parent directory of a model when relevant
### Fixed
- Fixed Python Packages dialog crash due to pip commands including warnings
- Fixed Base Model downloads from the Hugging Face tab downloading to the wrong folder
- Fixed InvokeAI `! [rejected] v3.4.0post2 -> v3.4.0post2 (would clobber existing tag)` error on updating to the latest version
- Fixed settings not saving in some scenarios, such as when the `settings.json` file existed but was empty
## v2.7.5
### Fixed
- Fixed Python Packages manager crash when pip list returns warnings in json
- Fixed slowdown when loading PNGs with large amounts of metadata
- Fixed crash when scanning directories for missing metadata
## v2.7.4
### Changed
- Improved low disk space handling
### Fixed
- Fixed denoise strength in Inference Text to Image
- Fixed PathTooLongException for IPAdapter folders when using ComfyUI in Symlink mode
- Fixed configs and symlinks not being cleaned up when switched to the opposite mode
- Fixed model indexing stopping when encountering paths longer than 1021 bytes in length
- Fixed repeated nested folders being created in `Models/ControlNet` when using ComfyUI in Symlink mode. Existing folders will be repaired to their original structure on launch.
## v2.7.3
### Added
- Added missing IPAdapter and CLIP Vision folder links for ComfyUI
### Fixed
- Fixed UnicodeDecodeError when using extra_model_paths.yaml in ComfyUI on certain locales
- Fixed SDXL CLIP Vision model directory name conflict
- Fixed [#334](https://github.com/LykosAI/StabilityMatrix/issues/334) - Win32Exception if Settings are opened
## v2.7.2
### Changed
- Changed Symlink shared folder link targets for Automatic1111 and ComfyUI. From `ControlNet -> models/controlnet` to `ControlNet -> models/controlnet/ControlNet` and `T2IAdapter -> models/controlnet/T2IAdapter`.
- Changed FreeU defaults to match recommended SD1.5 defaults
- Changed default denoise strength from 1.0 to 0.7
### Fixed
- Fixed ControlNet / T2IAdapter shared folder links for Automatic1111 conflicting with each other
- Fixed URIScheme registration errors on Linux
- Fixed RuinedFooocus missing output folder on startup
- Fixed incorrect Fooocus VRAM launch arguments
## v2.7.1
### Added
- Added Turkish UI language option, thanks to Progesor for the translation
### Fixed
- Fixed Inference Image to Image projects missing denoise strength setting
## v2.7.0
### Added
#### General
- New package: [RuinedFooocus](https://github.com/runew0lf/RuinedFooocus)
- Added an X button to all search fields to instantly clear them (Esc key also works)
- Added System Information section to Settings
#### Inference
- Added Image to Image project type
- Added Modular custom steps
- Use the plus button to add new steps (Hires Fix, Upscaler, and Save Image are currently available), and the edit button to enable removing or dragging steps to reorder them. This enables multi-pass Hires Fix, mixing different upscalers, and saving intermediate images at any point in the pipeline.
- Added Sampler addons
- Addons usually affect guidance like ControlNet, T2I, FreeU, and other addons to come. They apply to the individual sampler, so you can mix and match different ControlNets for Base and Hires Fix, or use the current output from a previous sampler as ControlNet guidance image for HighRes passes.
- Added SD Turbo Scheduler
- Added display names for new samplers ("Heun++ 2", "DDPM", "LCM")
- Added Ctrl+Enter as a shortcut for the Generate Image button
#### Accounts Settings Subpage
- Lykos Account sign-up and login - currently for Patreon OAuth connections but GitHub requests caching and settings sync are planned
- Supporters can now connect your Patreon accounts, then head to the Updates page to choose to receive auto-updates from the Dev or Preview channels
- CivitAI Account login with API key - enables downloading models from the Browser page that require CivitAI logins, more integrations like liking and commenting are also planned
#### Updates Settings Subpage
- Toggle auto-update notifications and manually check for updates
- Choose between Stable, Preview, and Dev update channels
#### Inference Settings Subpage
- Moved Inference settings to subpage
- Updated with more localized labels
#### Outputs Page
- Added Refresh button to update gallery from file system changes
#### Checkpoints Page
- Added the ability to drag & drop checkpoints between different folders
- Added "Copy Trigger Words" option to the three-dots menu on the Checkpoints page (when data is available)
- Added trigger words on checkpoint card and tooltip
- Added "Find Connected Metadata" options for root-level and file-level scans
- Added "Update Existing Metadata" button
#### Model Browser
- Added Hugging Face tab to the Model Browser
- Added additional base model filter options for CivitAI ("SD 1.5 LCM", "SDXL 1.0 LCM", "SDXL Turbo", "Other")
- Added the ability to type in a specific page number in the CivitAI Model Browser
- Right clicking anywhere on the model card will open the same menu as the three-dots button
- New model downloads will save trigger words in metadata, if available
- Model author username and avatar display, with clickable link to their profile
### Changed
#### General
- Model Browser page has been redesigned, featuring more information like rating and download counts
- Model Browser navigation has improved animations on hover and compact number formatting
- Updated Outputs Page button and menu layout
- Rearranged Add Package dialog slightly to accommodate longer package list
- Folder-level "Find Connected Metadata" now scans the selected folder and its subfolders
- Model Browser now split into "CivitAI" and "Hugging Face" tabs
#### Inference
- Selected images (i.e. Image2Image, Upscale, ControlNet) will now save their source paths saved and restored on load. If the image is moved or deleted, the selection will show as missing and can be reselected
- Project files (.smproj) have been updated to v3, existing projects will be upgraded on load and will no longer be compatible with older versions of Stability Matrix
### Fixed
- Fixed Outputs page reverting back to Shared Output Folder every time the page is reloaded
- Potentially fixed updates sometimes clearing settings or launching in the wrong directory
- Improved startup time and window load time after exiting dialogs
- Fixed control character decoding that caused some progress bars to show as `\u2588`
- Fixed Python `rich` package's progress bars not showing in console
- Optimized ProgressRing animation bindings to reduce CPU usage
- Improved safety checks in custom control rendering to reduce potential graphical artifacts
- Improved console rendering safety with cursor line increment clamping, as potential fix for [#111](https://github.com/LykosAI/StabilityMatrix/issues/111)
- Fixed [#290](https://github.com/LykosAI/StabilityMatrix/issues/290) - Model browser crash due to text trimming certain unicode characters
- Fixed crash when loading an empty settings file
- Improve Settings save and load performance with .NET 8 Source Generating Serialization
- Fixed ApplicationException during database shutdown
- InvokeAI model links for T2I/IpAdapters now point to the correct folders
- Added extra checks to help prevent settings resetting in certain scenarios
- Fixed Refiner model enabled state not saving to Inference project files
- Fixed NullReference error labels when clearing the Inference batch size settings, now shows improved message with minimum and maximum value constraints
## v2.7.0-pre.4
### Added
#### Inference
- Added Image to Image project type
- Added Modular custom steps
- Use the plus button to add new steps (Hires Fix, Upscaler, and Save Image are currently available), and the edit button to enable removing or dragging steps to reorder them. This enables multi-pass Hires Fix, mixing different upscalers, and saving intermediate images at any point in the pipeline.
- Added Sampler addons
- Addons usually affect guidance like ControlNet, T2I, FreeU, and other addons to come. They apply to the individual sampler, so you can mix and match different ControlNets for Base and Hires Fix, or use the current output from a previous sampler as ControlNet guidance image for HighRes passes.
- Added SD Turbo Scheduler
- Added display names for new samplers ("Heun++ 2", "DDPM", "LCM")
#### Model Browser
- Added additional base model filter options ("SD 1.5 LCM", "SDXL 1.0 LCM", "SDXL Turbo", "Other")
### Changed
#### Inference
- Selected images (i.e. Image2Image, Upscale, ControlNet) will now save their source paths saved and restored on load. If the image is moved or deleted, the selection will show as missing and can be reselected
- Project files (.smproj) have been updated to v3, existing projects will be upgraded on load and will no longer be compatible with older versions of Stability Matrix
### Fixed
- Fixed Refiner model enabled state not saving to Inference project files
## v2.7.0-pre.3
### Added
- Added "Find Connected Metadata" options for root-level and file-level scans to the Checkpoints page
- Added "Update Existing Metadata" button to the Checkpoints page
- Added Hugging Face tab to the Model Browser
- Added the ability to type in a specific page number in the CivitAI Model Browser
### Changed
- Folder-level "Find Connected Metadata" now scans the selected folder and its subfolders
- Model Browser now split into "CivitAI" and "Hugging Face" tabs
### Fixed
- InvokeAI model links for T2I/IpAdapters now point to the correct folders
- Added extra checks to help prevent settings resetting in certain scenarios
## v2.7.0-pre.2
### Added
- Added System Information section to Settings
### Changed
- Moved Inference Settings to subpage
### Fixed
- Fixed crash when loading an empty settings file
- Improve Settings save and load performance with .NET 8 Source Generating Serialization
- Fixed ApplicationException during database shutdown
## v2.7.0-pre.1
### Fixed
- Fixed control character decoding that caused some progress bars to show as `\u2588`
- Fixed Python `rich` package's progress bars not showing in console
- Optimized ProgressRing animation bindings to reduce CPU usage
- Improved safety checks in custom control rendering to reduce potential graphical artifacts
- Improved console rendering safety with cursor line increment clamping, as potential fix for [#111](https://github.com/LykosAI/StabilityMatrix/issues/111)
## v2.7.0-dev.4
### Fixed
- Fixed [#290](https://github.com/LykosAI/StabilityMatrix/issues/290) - Model browser crash due to text trimming certain unicode characters
## v2.7.0-dev.3
### Added
- New package: [RuinedFooocus](https://github.com/runew0lf/RuinedFooocus)
#### Model Browser
- Right clicking anywhere on the model card will open the same menu as the three-dots button
- New model downloads will save trigger words in metadata, if available
- Model author username and avatar display, with clickable link to their profile
#### Checkpoints Page
- Added "Copy Trigger Words" option to the three-dots menu on the Checkpoints page (when data is available)
- Added trigger words on checkpoint card and tooltip
### Changed
#### Model Browser
- Improved number formatting with K/M suffixes for download and favorite counts
- Animated zoom effect on hovering over model images
#### Checkpoints Page
- Rearranged top row layout to use CommandBar
### Fixed
- Improved startup time and window load time after exiting dialogs
## v2.7.0-dev.2
### Added
#### General
- Added an X button to all search fields to instantly clear them (Esc key also works)
#### Outputs Page
- Added Refresh button to update gallery from file system changes
#### Checkpoints Page
- Added the ability to drag & drop checkpoints between different folders
### Changed
#### Outputs Page
- Updated button and menu layout
#### Packages Page
- Rearranged Add Package dialog slightly to accommodate longer package list
### Fixed
- Fixed InvalidOperation errors when signing into accounts shortly after signing out, while the previous account update is still running
- Fixed Outputs page reverting back to Shared Output Folder every time the page is reloaded
- Potentially fixed updates sometimes clearing settings or launching in the wrong directory
## v2.7.0-dev.1
### Added
- Accounts Settings Subpage
- Lykos Account sign-up and login - currently for Patreon OAuth connections but GitHub requests caching and settings sync are planned
- Supporters can now connect your Patreon accounts, then head to the Updates page to choose to receive auto-updates from the Dev or Preview channels
- CivitAI Account login with API key - enables downloading models from the Browser page that require CivitAI logins, more integrations like liking and commenting are also planned
- Updates Settings Subpage
- Toggle auto-update notifications and manually check for updates
- Choose between Stable, Preview, and Dev update channels
### Changed
- Model Browser page has been redesigned, featuring more information like rating and download counts
## v2.6.7
### Fixed
- Fixed prerequisite install not unpacking due to improperly formatted 7z argument (Caused the "python310._pth FileNotFoundException")
- Fixed [#301](https://github.com/LykosAI/StabilityMatrix/issues/301) - Package updates failing silently because of a PortableGit error
## v2.6.6
### Fixed
- Fixed [#297](https://github.com/LykosAI/StabilityMatrix/issues/297) - Model browser LiteAsyncException occuring when fetching entries with unrecognized values from enum name changes
## v2.6.5
### Fixed
- Fixed error when receiving unknown model format values from the Model Browser
- Fixed process errors when installing or updating Pip packages using the Python packages dialog
## v2.6.4
### Fixed
- Fixed errors preventing Model Browser from finding results with certain search queries
## v2.6.3
### Fixed
- Fixed InvalidOperationException during prerequisite installs on certain platforms where process name and duration reporting are not supported
## v2.6.2
### Changed
- Backend changes for auto-update schema v3, supporting customizable release channels and faster downloads with zip compression
### Fixed
- Better error reporting including outputs for git subprocess errors during package install / update
- Fixed `'accelerate' is not recognized as an internal or external command` error when starting training in kohya_ss
- Fixed some instances of `ModuleNotFoundError: No module named 'bitsandbytes.cuda_setup.paths'` error when using 8-bit optimizers in kohya_ss
- Fixed errors preventing Inference outputs from loading in the img2img tabs of other packages
## v2.6.1
### Changed
- NVIDIA GPU users will be updated to use CUDA 12.1 for the InvokeAI package for a slight performance improvement
- Update will occur the next time the package is updated, or on a fresh install
- Note: CUDA 12.1 is only available on Maxwell (GTX 900 series) and newer GPUs
### Fixed
- Reduced the amount of calls to GitHub to help prevent rate limiting
- Fixed rate limit crash on startup preventing app from starting
## v2.6.0
### Added
- Added **Output Sharing** option for all packages in the three-dots menu on the Packages page
- This will link the package's output folders to the relevant subfolders in the "Outputs" directory
- When a package only has a generic "outputs" folder, all generated images from that package will be linked to the "Outputs\Text2Img" folder when this option is enabled
- Added **Outputs page** for viewing generated images from any package, or the shared output folder
- Added [Stable Diffusion WebUI/UX](https://github.com/anapnoe/stable-diffusion-webui-ux) package
- Added [Stable Diffusion WebUI-DirectML](https://github.com/lshqqytiger/stable-diffusion-webui-directml) package
- Added [kohya_ss](https://github.com/bmaltais/kohya_ss) package
- Added [Fooocus-ControlNet-SDXL](https://github.com/fenneishi/Fooocus-ControlNet-SDXL) package
- Added GPU compatibility badges to the installers
- Added filtering of "incompatible" packages (ones that do not support your GPU) to all installers
- This can be overridden by checking the new "Show All Packages" checkbox
- Added more launch options for Fooocus, such as the `--preset` option
- Added Ctrl+ScrollWheel to change image size in the inference output gallery and new Outputs page
- Added "No Images Found" placeholder for non-connected models on the Checkpoints tab
- Added "Open on GitHub" option to the three-dots menu on the Packages page
### Changed
- If ComfyUI for Inference is chosen during the One-Click Installer, the Inference page will be opened after installation instead of the Launch page
- Changed all package installs & updates to use git commands instead of downloading zip files
- The One-Click Installer now uses the new progress dialog with console
- NVIDIA GPU users will be updated to use CUDA 12.1 for ComfyUI & Fooocus packages for a slight performance improvement
- Update will occur the next time the package is updated, or on a fresh install
- Note: CUDA 12.1 is only available on Maxwell (GTX 900 series) and newer GPUs
- Improved Model Browser download stability with automatic retries for download errors
- Optimized page navigation and syntax formatting configurations to improve startup time
### Fixed
- Fixed crash when clicking Inference gallery image after the image is deleted externally in file explorer
- Fixed Inference popup Install button not working on One-Click Installer
- Fixed Inference Prompt Completion window sometimes not showing while typing
- Fixed "Show Model Images" toggle on Checkpoints page sometimes displaying cut-off model images
- Fixed missing httpx package during Automatic1111 install
- Fixed some instances of localized text being cut off from controls being too small
## v2.5.7
### Fixed
- Fixed error `got an unexpected keyword argument 'socket_options'` on fresh installs of Automatic1111 Stable Diffusion WebUI due to missing httpx dependency specification from gradio
## v2.5.6
### Added
- Added Russian UI language option, thanks to aolko for the translation
## v2.5.5
### Added
- Added Spanish UI language options, thanks to Carlos Baena and Lautaroturina for the translations
- Manual input prompt popup on package input requests besides Y/n confirmations
- Added `--disable-gpu` launch argument to disable hardware accelerated rendering
### Fixed
- Fixed infinite progress wheel when package uninstall fails
## v2.5.4
### Fixed
- Fixed [#208](https://github.com/LykosAI/StabilityMatrix/issues/208) - error when installing xformers
## v2.5.3
### Added
- Added French UI language option, thanks to eephyne for the translation
### Fixed
- Fixed Automatic 1111 missing dependencies on startup by no longer enabling `--skip-install` by default.
## v2.5.2
### Added
- Right click Inference Batch options to enable selecting a "Batch Index". This can be used to reproduce a specific image from a batch generation. The field will be automatically populated in metadata of individual images from a batch generation.
- The index is 1-based, so the first image in a batch is index 1, and the last image is the batch size.
- Currently this generates different individual images for batches using Ancestral samplers, due to an upstream ComfyUI issue with noise masking. Looking into fixing this.
- Inference Batches option now is implemented, previously the setting had no effect
### Changed
- Default upscale factor for Inference is now 2x instead of 1x
### Fixed
- Fixed batch combined image grids not showing metadata and not being importable
- Fixed "Call from invalid thread" errors that sometimes occured during update notifications
## v2.5.1
### Added
- `--skip-install` default launch argument for Automatic1111 Package
### Fixed
- Fixed Prompt weights showing syntax error in locales where decimal separator is not a period
## v2.5.0
### Added
- Added Inference, a built-in native Stable Diffusion interface, powered by ComfyUI
- Added option to change the Shared Folder method for packages using the three-dots menu on the Packages page
- Added the ability to Favorite models in the Model Browser
- Added "Favorites" sort option to the Model Browser
- Added notification flyout for new available updates. Dismiss to hide until the next update version.
- Added Italian UI language options, thanks to Marco Capelli for the translations
### Changed
- Model Browser page size is now 20 instead of 14
- Update changelog now only shows the difference between the current version and the latest version
### Fixed
- Fixed [#141](https://github.com/LykosAI/StabilityMatrix/issues/141) - Search not working when sorting by Installed on Model Browser
- Fixed SD.Next not showing "Open Web UI" button when finished loading
- Fixed model index startup errors when `./Models` contains unknown custom folder names
- Fixed ストップ button being cut off in Japanese translation
- Fixed update progress freezing in some cases
- Fixed light theme being default in first time setup window
- Fixed shared folder links not recreating fully when partially missing
## v2.4.6
### Added
- LDSR / ADetailer shared folder links for Automatic1111 Package
### Changed
- Made Dark Mode background slightly lighter
## v2.4.5
### Fixed
- Fixed "Library Dir not set" error on launch
## v2.4.4
### Added
- Added button to toggle automatic scrolling of console output
### Fixed
- Fixed [#130](https://github.com/LykosAI/StabilityMatrix/issues/130) ComfyUI extra_model_paths.yaml file being overwritten on each launch
- Fixed some package updates not showing any console output
- Fixed auto-close of update dialog when package update is complete
## v2.4.3
### Added
- Added "--no-download-sd-model" launch argument option for Stable Diffusion Web UI
- Added Chinese (Simplified) and Chinese (Traditional) UI language options, thanks to jimlovewine for the translations
### Changed
- Package updates now use the new progress dialog with console output
### Fixed
- Updated Japanese translation for some terms
## v2.4.2
### Added
- Added Japanese UI language option, thanks to kgmkm_mkgm for the translation
- Language selection available in Settings, and defaults to system language if supported
## v2.4.1
### Fixed
- Fixed deleting checkpoints not updating the visual grid until the page is refreshed
- Fixed updates sometimes freezing on "Installing Requirements" step
## v2.4.0
### Added
- New installable Package - [Fooocus-MRE](https://github.com/MoonRide303/Fooocus-MRE)
- Added toggle to show connected model images in the Checkpoints tab
- Added "Find Connected Metadata" option to the context menu of Checkpoint Folders in the Checkpoints tab to connect models that don't have any metadata
### Changed
- Revamped package installer
- Added "advanced options" section for commit, shared folder method, and pytorch options
- Can be run in the background
- Shows progress in the Downloads tab
- Even more performance improvements for loading and searching the Checkpoints page
### Fixed
- Fixed [#97](https://github.com/LykosAI/StabilityMatrix/issues/97) - Codeformer folder should now get linked correctly
- Fixed [#106](https://github.com/LykosAI/StabilityMatrix/issues/106) - ComfyUI should now install correctly on Windows machines with an AMD GPU using DirectML
- Fixed [#107](https://github.com/LykosAI/StabilityMatrix/issues/107) - Added `--autolaunch` option to SD.Next
- Fixed [#110](https://github.com/LykosAI/StabilityMatrix/issues/110) - Model Browser should properly navigate to the next page of Installed models
- Installed tag on model browser should now show for connected models imported via drag & drop
## v2.3.4
### Fixed
- Fixed [#108](https://github.com/LykosAI/StabilityMatrix/issues/108) - (Linux) Fixed permission error on updates [#103](https://github.com/LykosAI/StabilityMatrix/pull/103)
## v2.3.3
### Fixed
- Fixed GPU recognition for Nvidia Tesla GPUs
- Fixed checkpoint file index extension identification with some path names
- Fixed issue where config file may be overwritten during Automatic1111 package updates
- Fixed "Directory Not Found" error on startup when previously selected Data directory does not exist
- Fixed [#83](https://github.com/LykosAI/StabilityMatrix/issues/83) - Display of packages with long names in the Package Manager
- Fixed [#64](https://github.com/LykosAI/StabilityMatrix/issues/64) - Package install error if venv already exists
## v2.3.2
### Added
- Added warning for exFAT / FAT32 drives when selecting a data directory
### Fixed
- Automatic1111 and ComfyUI should now install the correct version of pytorch for AMD GPUs
- Fixed "Call from invalid thread" exceptions preventing download completion notifications from showing
- Fixed model preview image downloading with incorrect name
### Changed
- Redesigned "Select Model Version" dialog to include model description and all preview images
## v2.3.1
### Fixed
- Fixed Auto update not appearing in some regions due to date formatting issues
- Local package import now migrates venvs and existing models
## v2.3.0
### Added
- New installable Package - [Fooocus](https://github.com/lllyasviel/Fooocus)
- Added "Select New Data Directory" button to Settings
- Added "Skip to First/Last Page" buttons to the Model Browser
- Added VAE as a checkpoint category in the Model Browser
- Pause/Resume/Cancel buttons on downloads popup. Paused downloads persists and may be resumed after restarting the app
- Unknown Package installs in the Package directory will now show up with a button to import them
### Fixed
- Fixed issue where model version wouldn't be selected in the "All Versions" section of the Model Browser
- Improved Checkpoints page indexing performance
- Fixed issue where Checkpoints page may not show all checkpoints after clearing search filter
- Fixed issue where Checkpoints page may show incorrect checkpoints for the given filter after changing pages
- Fixed issue where Open Web UI button would try to load 0.0.0.0 addresses
- Fixed Dictionary error when launch arguments saved with duplicate arguments
- Fixed Launch arguments search not working
### Changed
- Changed update method for SD.Next to use the built-in upgrade functionality
- Model Browser navigation buttons are no longer disabled while changing pages
## v2.2.1
### Fixed
- Fixed SD.Next shared folders config not working with new config format, reverted to Junctions / Symlinks
## v2.2.1
### Fixed
- Fixed SD.Next shared folders config not working with new config format, reverted to Junctions / Symlinks
## v2.2.0
### Added
- Added option to search by Base Model in the Model Browser
- Animated page transitions
### Fixed
- Fixed [#59](https://github.com/LykosAI/StabilityMatrix/issues/61) - `GIT` environment variable is now set for the embedded portable git on Windows as A1111 uses it instead of default `PATH` resolution
- Fixed embedded Python install check on Linux when an incompatible windows DLL is in the Python install directory
- Fixed "ObjectDisposed" database errors that sometimes appeared when closing the app
### Changed
- Revamped Package Manager UI
- InvokeAI installations can now use checkpoints from the Shared Models folder
## v2.1.2
### Changed
- SD.Next install now uses ROCm PyTorch backend on Linux AMD GPU machines for better performance over DirectML
## v2.1.1
### Added
- Discord Rich Presence support can now be enabled in Settings
### Fixed
- Launch Page selected package now persists in settings
## v2.1.0
### Added
- New installable Package - [VoltaML](https://github.com/VoltaML/voltaML-fast-stable-diffusion)
- New installable Package - [InvokeAI](https://github.com/invoke-ai/InvokeAI)
- Launch button can now support alternate commands / modes - currently only for InvokeAI
> 
- Settings option to set global environment variables for Packages
> 
### Changed
- Compatible packages (ComfyUI, Vlad/SD.Next) now use config files / launch args instead of symbolic links for shared model folder redirect
### Fixed
- Fixed [#48](https://github.com/LykosAI/StabilityMatrix/issues/48) - model folders not showing in UI when they were empty
- Updater now shows correct current version without trailing `.0`
- Fixed program sometimes starting off-screen on multi-monitor setups
- Fixed console input box transparency
- Fixed [#52](https://github.com/LykosAI/StabilityMatrix/issues/52) - A1111 default approx-vae model download errors by switching default preview method to TAESD
- Fixes [#50](https://github.com/LykosAI/StabilityMatrix/issues/50) - model browser crash when no model versions exist
- Fixed [#31](https://github.com/LykosAI/StabilityMatrix/issues/31) - missing ControlNet link to Shared Models Folder for SD.Next
- Fixed [#49](https://github.com/LykosAI/StabilityMatrix/issues/49) - download progress disappearing when changing pages in Model Browser
## v2.0.4
### Fixed
- Fixed Model Browser downloading files without extensions
## v2.0.3
### Added
- (Windows) New settings option to add Stability Matrix to the start menu
- (Windows) Improved background "Mica" effect on Windows 11, should be smoother with less banding artifacts
### Fixed
- Fixed model categories sometimes not showing if they are empty
- Improved model download hash verification performance
- Fixed some text wrapping visuals on expanded model version dialog on model browser
- Added cancel button for create folder dialog
- One click first time installer now defaults to using the "Package" name instead of the display name ("stable-diffusion-webui" instead of "Stable Diffusion WebUI") for the install folder name - probably safer against upstream issues on folder names with spaces.
## v2.0.2
### Fixed
- (Linux) Updater now sets correct execute permissions
- Image loading (i.e. Checkpoints File preview thumbnail) now has a notification for unsupported local image formats instead of crashing
- Fix unable to start app issues on some machines and dropdowns showing wrong categories - disabled assembly trimming
## v2.0.1
### Added
- Fully rewritten using Avalonia for improved UI and cross-platform support, our biggest update so far, with over 18,000 lines of code.
- Release support for Windows and Linux, with macOS coming soon
- Model Browser now indicates models that are already downloaded / need updates
- Checkpoints Manager now supports filtering/searching
- One-click installer now suggests all 3 WebUI packages for selection
- Hardware compatibility and GPU detection is now more accurate
- Download Indicator on the nav menu for ongoing downloads and progress; supports multiple concurrent model downloads
- Improved console with syntax highlighting, and provisional ANSI rendering for progress bars and advanced graphics
- Input can now be sent to the running package process using the top-right keyboard button on the Launch page. Package input requests for a (y/n) response will now have an interactive popup.
### Fixed
- Fixed crash on exit
- Fixed updating from versions prior to 2.x.x
- Fixed page duplication memory leak that caused increased memory usage when switching between pages
- Package page launch button will now navigate and launch the package, instead of just navigating to launch page
================================================
FILE: CONTRIBUTING.md
================================================
# Building
## Running & Debug
- If building using managed IDEs like Rider or Visual Studio, ensure that a valid `--runtime ...` argument is being passed to `dotnet`, or `RuntimeIdentifier=...` is set for calling `msbuild`. This is required for runtime-specific resources to be included in the build. Stability Matrix currently supports building for the `win-x64`, `linux-x64` and `osx-arm64` runtimes.
- You can also build the `StabilityMatrix.Avalonia` project using `dotnet`:
```bash
dotnet build ./StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj -r win-x64 -c Debug
```
- Note that on Windows, the `net8.0-windows10.0.17763.0` framework is used, build outputs will be in `StabilityMatrix.Avalonia/bin/Debug/net8.0-windows10.0.17763.0/win-x64`. On other platforms the `net8.0` framework is used.
## Building to single file for release
(Replace `$RELEASE_VERSION` with a non v-prefixed semver version number, e.g. `2.10.0`, `2.11.0-dev.1`, etc.)
### Windows
```bash
dotnet publish ./StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj -r win-x64 -c Release -p:Version=$env:RELEASE_VERSION -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:PublishReadyToRun=true
```
### macOS
The `output_dir` environment variable can be specified or defaults to `./out/osx-arm64/`
```bash
./Build/build_macos_app.sh -v $RELEASE_VERSION
```
### Linux
```bash
sudo apt-get -y install libfuse2
dotnet tool install -g KuiperZone.PupNet
pupnet -r linux-x64 -c Release --kind appimage --app-version $RELEASE_VERSION --clean
```
# Scripts
## Install Husky.Net & Pre-commit hooks
- Building the `StabilityMatrix.Avalonia` project once should also install Husky.Net, or run the following command:
```bash
dotnet tool restore && dotnet husky install
```
## Adding Husky pre-commit hooks
```bash
dotnet husky install
```
## Generated OpenApi clients
- Refitter is used to generate some OpenApi clients. New clients should be added to `./.husky/task-runner.json`.
- To regenerate clients, run the following command:
```bash
dotnet husky run -g generate-openapi
```
# Style Guidelines
These are just guidelines, mostly following the official C# style guidelines, except in a few cases. We might not adhere to these 100% ourselves, but lets try our best :)
## Naming conventions
#### Pascal Case
- Use pascal casing ("PascalCasing") when naming a `class`, `record`, `struct`, or `public` members of types, such as fields, properties, methods, and local functions.
- When naming an `interface`, use pascal casing in addition to prefixing the name with the letter `I` to clearly indicate to consumers that it's an `interface`.
#### Camel Case
- Use camel casing ("camelCasing") when naming `private` or `internal` fields.
- **Do not** prefix them with an underscore `_`
## `using` Directives
- Please do not check in code with unused using statements.
## File-scoped Namespaces
- Always use file-scoped namespaces. For example:
```csharp
using System;
namespace X.Y.Z;
class Foo
{
}
```
## Implicitly typed local variables
- Use implicit typing (`var`) for local variables when the type of the variable is obvious from the right side of the assignment, or when the precise type is not important.
## Optional Curly Braces
- Only omit curly braces from `if` statements if the statement immediately following is a `return`.
For example, the following snippet is acceptable:
```csharp
if (alreadyAteBreakfast)
return;
```
Otherwise, it must be wrapped in curly braces, like so:
```csharp
if (alreadyAteLunch)
{
mealsEaten++;
}
```
## Project Structure
- Try to follow our existing structure, such as putting model classes in the `Models\` directory, ViewModels in `ViewModels\`, etc.
- Static classes with only extension methods should be in `Extensions\`
- Mock data for XAML Designer should go in `DesignData\`
- The `Helper\` and `Services\` folder don't really have guidelines, use your best judgment
- XAML & JSON converters should go in the `Converters\` and `Converters\Json\` directories respectively
- Refit interfaces should go in the `Api\` folder
================================================
FILE: ConditionalSymbols.props
================================================
falseCodeGenerationfalse$(DefineConstants);REGISTER_SERVICE_USAGES$(DefineConstants);SM_LOG_WINDOW
$(DefineConstants);REGISTER_SERVICE_REFLECTION;REGISTER_SERVICE_USAGES
================================================
FILE: Directory.Build.props
================================================
net9.0previewenableenabletruetrueCS010811.3.7$(NoWarn);AVLN3001$(NoWarn);CsWinRT1028
================================================
FILE: Directory.Packages.props
================================================
================================================
FILE: Jenkinsfile
================================================
node("Diligence") {
def repoName = "StabilityMatrix"
def author = "ionite34"
def version = ""
stage('Clean') {
deleteDir()
}
stage('Checkout') {
git branch: env.BRANCH_NAME, credentialsId: 'Ionite', url: "https://github.com/${author}/${repoName}.git"
}
try {
stage('Test') {
sh "dotnet test StabilityMatrix.Tests"
}
if (env.BRANCH_NAME == 'main') {
stage('Set Version') {
script {
if (env.TAG_NAME) {
version = env.TAG_NAME.replaceFirst(/^v/, '')
} else {
version = VersionNumber projectStartDate: '2023-06-21', versionNumberString: '${BUILDS_ALL_TIME}', worstResultForIncrement: 'SUCCESS'
}
}
}
stage('Publish Windows') {
sh "dotnet publish ./StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj -c Release -o out -r win-x64 -p:PublishSingleFile=true -p:VersionPrefix=2.0.0 -p:VersionSuffix=${version} -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableWindowsTargeting=true"
}
stage('Publish Linux') {
sh "rm -rf StabilityMatrix.Avalonia/bin/*"
sh "rm -rf StabilityMatrix.Avalonia/obj/*"
sh "/home/jenkins/.dotnet/tools/pupnet --runtime linux-x64 --kind appimage --app-version ${version} --clean -y"
}
}
} finally {
stage('Cleanup') {
cleanWs()
}
}
}
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
.
================================================
FILE: NuGet.Config
================================================
================================================
FILE: README.md
================================================
# Stability Matrix
[](https://github.com/LykosAI/StabilityMatrix/actions/workflows/build.yml)
[](https://discord.com/invite/TUrgfECxHz)
[][release]
[](https://lykos.ai/downloads)
[](https://lykos.ai/downloads)
[release]: https://github.com/LykosAI/StabilityMatrix/releases/latest
[download-win-x64]: https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-win-x64.zip
[download-linux-appimage-x64]: https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-linux-x64.zip
[download-linux-aur-x64]: https://aur.archlinux.org/packages/stabilitymatrix
[download-macos-arm64]: https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-macos-arm64.dmg
[auto1111]: https://github.com/AUTOMATIC1111/stable-diffusion-webui
[auto1111-directml]: https://github.com/lshqqytiger/stable-diffusion-webui-directml
[webui-ux]: https://github.com/anapnoe/stable-diffusion-webui-ux
[comfy]: https://github.com/comfyanonymous/ComfyUI
[sdnext]: https://github.com/vladmandic/automatic
[voltaml]: https://github.com/VoltaML/voltaML-fast-stable-diffusion
[invokeai]: https://github.com/invoke-ai/InvokeAI
[fooocus]: https://github.com/lllyasviel/Fooocus
[fooocus-mre]: https://github.com/MoonRide303/Fooocus-MRE
[ruined-fooocus]: https://github.com/runew0lf/RuinedFooocus
[fooocus-controlnet]: https://github.com/fenneishi/Fooocus-ControlNet-SDXL
[kohya-ss]: https://github.com/bmaltais/kohya_ss
[onetrainer]: https://github.com/Nerogar/OneTrainer
[forge]: https://github.com/lllyasviel/stable-diffusion-webui-forge
[stable-swarm]: https://github.com/Stability-AI/StableSwarmUI
[sdfx]: https://github.com/sdfxai/sdfx
[fooocus-mashb1t]: https://github.com/mashb1t/Fooocus
[reforge]: https://github.com/Panchovix/stable-diffusion-webui-reForge
[simplesdxl]: https://github.com/metercai/SimpleSDXL/
[fluxgym]: https://github.com/cocktailpeanut/fluxgym
[cogvideo]: https://github.com/THUDM/CogVideo
[cogstudio]: https://github.com/pinokiofactory/cogstudio
[amdforge]: https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu-forge
[civitai]: https://civitai.com/
[huggingface]: https://huggingface.co/

[][download-win-x64]
[-FCC624?style=for-the-badge&logo=linux&logoColor=black)][download-linux-appimage-x64]
[-1793D1?style=for-the-badge&logo=archlinux&logoColor=white)][download-linux-aur-x64]
[][download-macos-arm64]
Multi-Platform Package Manager and Inference UI for Stable Diffusion
### 🖱️ One click install and update for Stable Diffusion Web UI Packages
- Supports:
- [Stable Diffusion WebUI reForge][reforge], [Stable Diffusion WebUI Forge][forge], [Stable Diffusion WebUI AMDGPU Forge][amdforge] [Automatic 1111][auto1111], [Automatic 1111 DirectML][auto1111-directml], [SD Web UI-UX][webui-ux], [SD.Next][sdnext]
- [Fooocus][fooocus], [Fooocus MRE][fooocus-mre], [Fooocus ControlNet SDXL][fooocus-controlnet], [Ruined Fooocus][ruined-fooocus], [Fooocus - mashb1t's 1-Up Edition][fooocus-mashb1t], [SimpleSDXL][simplesdxl]
- [ComfyUI][comfy]
- [StableSwarmUI][stable-swarm]
- [VoltaML][voltaml]
- [InvokeAI][invokeai]
- [SDFX][sdfx]
- [Kohya's GUI][kohya-ss]
- [OneTrainer][onetrainer]
- [FluxGym][fluxgym]
- [CogVideo][cogvideo] via [CogStudio][cogstudio]
- Manage plugins / extensions for supported packages ([Automatic1111][auto1111], [Comfy UI][comfy], [SD Web UI-UX][webui-ux], and [SD.Next][sdnext])
- Easily install or update Python dependencies for each package
- Embedded Git and Python dependencies, with no need for either to be globally installed
- Fully portable - move Stability Matrix's Data Directory to a new drive or computer at any time
### ✨ Inference - A Reimagined Interface for Stable Diffusion, Built-In to Stability Matrix
- Powerful auto-completion and syntax highlighting using a formal language grammar
- Workspaces open in tabs that save and load from `.smproj` project files

- Customizable dockable and float panels
- Generated images contain Inference Project, ComfyUI Nodes, and A1111-compatible metadata
- Drag and drop gallery images or files to load states
### 🚀 Launcher with syntax highlighted terminal emulator, routed GUI input prompts
- Launch arguments editor with predefined or custom options for each Package install
- Configurable Environment Variables
### 🗃️ Checkpoint Manager, configured to be shared by all Package installs
- Option to find CivitAI metadata and preview thumbnails for new local imports
### ☁️ Model Browser to import from [CivitAI][civitai] and [HuggingFace][huggingface]
- Automatically imports to the associated model folder depending on the model type
- Downloads relevant metadata files and preview image
- Pause and resume downloads, even after closing the app
### Shared model directory for all your packages
- Import local models by simple drag and drop
- Option to automatically find CivitAI metadata and preview thumbnails for new local imports