Skip to content
Merged

v2.15.6 #1547

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
29baafe
Merge pull request #1189 from ionite34/old-stuff-notifications
mohnjiles Jan 17, 2026
873bfc5
fix chagenlog
mohnjiles Jan 17, 2026
482a748
Merge pull request #1191 from ionite34/sync-from-public
mohnjiles Jan 23, 2026
5907005
Merge branch 'main' into backport/main/pr-1189
mohnjiles Jan 23, 2026
e9149df
Merge pull request #1193 from ionite34/fix-bugs-n-stuff
mohnjiles Jan 26, 2026
4f5ecb3
Merge pull request #1190 from ionite34/backport/main/pr-1189
mohnjiles Jan 26, 2026
362f1f9
Merge branch 'main' into backport/main/pr-1193
mohnjiles Jan 26, 2026
4142dd9
fix merge conflict
mohnjiles Jan 26, 2026
f4b4a53
Merge pull request #1194 from ionite34/backport/main/pr-1193
mohnjiles Jan 29, 2026
bf69fbd
Merge branch 'main' of https://github.com/LykosAI/StabilityMatrix-Dev…
mohnjiles Feb 9, 2026
3e694b9
fix test
mohnjiles Feb 9, 2026
ca33cf6
Merge pull request #1197 from ionite34/downmerg-public
mohnjiles Feb 10, 2026
c97d1c3
Merge pull request #1199 from ionite34/more-neo-fixes
mohnjiles Feb 11, 2026
a71504b
fix chagenlog
mohnjiles Feb 11, 2026
ab0cf39
Merge pull request #1200 from ionite34/backport/main/pr-1199
mohnjiles Feb 11, 2026
6800890
backport escape sequence fix in inference prompts & shoutout chagenlog
mohnjiles Feb 11, 2026
53c4e87
update chagenlog
mohnjiles Feb 11, 2026
e5787d8
Merge pull request #1201 from ionite34/backport-escape-fix
mohnjiles Feb 13, 2026
2dde17c
Merge pull request #1204 from ionite34/more-package-fixes
mohnjiles Feb 13, 2026
2d4a4a4
fix chagenlog
mohnjiles Feb 13, 2026
d5fbc07
Merge pull request #1205 from ionite34/backport/main/pr-1204
mohnjiles Feb 13, 2026
f461c91
Merge pull request #1206 from ionite34/fix-pkg-resources-for-real
mohnjiles Feb 14, 2026
16c6424
Merge pull request #1207 from ionite34/backport/main/pr-1206
mohnjiles Feb 14, 2026
86cf211
Merge pull request #1208 from ionite34/fix-the-fix
mohnjiles Feb 14, 2026
eff1191
Merge pull request #1209 from ionite34/backport/main/pr-1208
mohnjiles Feb 14, 2026
8359c05
Update chagenlog
mohnjiles Feb 15, 2026
9ee3ce0
Merge pull request #1210 from ionite34/update-chagenlog
mohnjiles Feb 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,40 @@ 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)
Expand Down
25 changes: 25 additions & 0 deletions StabilityMatrix.Avalonia/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,28 @@ public FontFamily GetPlatformDefaultFontFamily()
fonts.Add("Helvetica Neue");
fonts.Add("Helvetica");
}
else if (Compat.IsLinux)
{
// For Chinese locales, prioritize CJK-capable fonts first
if (Cultures.Current?.Name is "zh-Hans" or "zh-Hant")
{
// Common Chinese fonts on Linux systems
fonts.Add("Noto Sans CJK SC");
fonts.Add("Noto Sans CJK TC");
fonts.Add("Source Han Sans");
fonts.Add("WenQuanYi Micro Hei");
fonts.Add("WenQuanYi Zen Hei");
}

// Add common Linux fonts
fonts.Add("Ubuntu");
fonts.Add("DejaVu Sans");

// Fallback to system default
fonts.Add(FontFamily.Default.Name);

return new FontFamily(string.Join(",", fonts));
}
else
{
return FontFamily.Default;
Expand Down Expand Up @@ -281,6 +303,9 @@ private void Setup()
Logger.Debug("ActivatableLifetime available, setting up activation protocol handlers");
activatableLifetime.Activated += OnActivated;
}

// Update font when culture/language changes
EventManager.Instance.CultureChanged += (_, _) => SetFontFamily(GetPlatformDefaultFontFamily());
}

private void ShowMainWindow()
Expand Down
8 changes: 4 additions & 4 deletions StabilityMatrix.Avalonia/Assets/ImagePrompt.tmLanguage.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"name": "constant.character.escape.prompt"
}
},
"end": "[-+.!(){}\\[\\]<\\>:]",
"end": "[-+.!(){}\\[\\]<\\>:|\\\\]",
"endCaptures": {
"0": {
"name": "constant.character.escape.target.prompt"
Expand All @@ -35,7 +35,7 @@
"name": "meta.structure.escape.prompt",
"patterns": [
{
"match": "[^-+.!(){}\\[\\]<\\>:]",
"match": "[^-+.!(){}\\[\\]<\\>:|\\\\]",
"name": "invalid.illegal.escape.prompt"
}
]
Expand Down Expand Up @@ -147,7 +147,7 @@
"4": {
"name": "punctuation.separator.variable.prompt"
},
"5" : {
"5": {
"name": "constant.numeric"
}
}
Expand Down Expand Up @@ -214,7 +214,7 @@
"match": "[^#,:\\[\\]\\(\\)\\<\\> \\\\]+",
"name": "meta.embedded"
},
"invalid_reserved" : {
"invalid_reserved": {
"name": "invalid.illegal.reserved.prompt",
"patterns": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ IServiceManager<ViewModelBase> dialogFactory
public override BasePackage? SelectedBasePackage =>
SelectedPackage?.PackageName != "dank-diffusion"
? base.SelectedBasePackage
: new DankDiffusion(null!, null!, null!, null!, null!);
: new DankDiffusion(null!, null!, null!, null!, null!, null!);

protected override Task LaunchImpl(string? command)
{
IsLaunchTeachingTipsOpen = false;

RunningPackage = new PackagePair(null!, new DankDiffusion(null!, null!, null!, null!, null!));
RunningPackage = new PackagePair(null!, new DankDiffusion(null!, null!, null!, null!, null!, null!));

Console.Document.Insert(
0,
Expand Down
25 changes: 20 additions & 5 deletions StabilityMatrix.Avalonia/Helpers/UnixPrerequisiteHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ IPyInstallationManager pyInstallationManager
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

private const string UvMacDownloadUrl =
"https://github.com/astral-sh/uv/releases/download/0.8.4/uv-aarch64-apple-darwin.tar.gz";
"https://github.com/astral-sh/uv/releases/download/0.9.30/uv-aarch64-apple-darwin.tar.gz";
private const string UvLinuxDownloadUrl =
"https://github.com/astral-sh/uv/releases/download/0.8.4/uv-x86_64-unknown-linux-gnu.tar.gz";
"https://github.com/astral-sh/uv/releases/download/0.9.30/uv-x86_64-unknown-linux-gnu.tar.gz";

private DirectoryPath HomeDir => settingsManager.LibraryDir;
private DirectoryPath AssetsDir => HomeDir.JoinDir("Assets");
Expand Down Expand Up @@ -75,7 +75,7 @@ private bool IsPythonVersionInstalled(PyVersion version) =>
// Cached store of whether or not git is installed
private bool? isGitInstalled;

private string ExpectedUvVersion => "0.8.4";
private string ExpectedUvVersion => "0.9.30";

public bool IsVcBuildToolsInstalled => false;
public bool IsHipSdkInstalled => false;
Expand Down Expand Up @@ -272,7 +272,13 @@ private async Task RunGit(ProcessArgs args, string? workingDirectory = null)
var result = await ProcessRunner.RunBashCommand(
command,
workingDirectory ?? string.Empty,
new Dictionary<string, string> { { "GIT_TERMINAL_PROMPT", "0" } }
new Dictionary<string, string>
{
{ "GIT_TERMINAL_PROMPT", "0" },
// Set UTF-8 locale to handle Unicode characters in paths
{ "LC_ALL", "C.UTF-8" },
{ "LANG", "C.UTF-8" },
}
);
if (result.ExitCode != 0)
{
Expand Down Expand Up @@ -375,7 +381,16 @@ public async Task InstallPythonIfNecessary(PyVersion version, IProgress<Progress

public Task<ProcessResult> GetGitOutput(ProcessArgs args, string? workingDirectory = null)
{
return ProcessRunner.RunBashCommand(args.Prepend("git"), workingDirectory ?? "");
return ProcessRunner.RunBashCommand(
args.Prepend("git"),
workingDirectory ?? "",
new Dictionary<string, string>
{
// Set UTF-8 locale to handle Unicode characters in paths
{ "LC_ALL", "C.UTF-8" },
{ "LANG", "C.UTF-8" },
}
);
}

private async Task<string> RunNode(
Expand Down
55 changes: 49 additions & 6 deletions StabilityMatrix.Avalonia/Helpers/WindowsPrerequisiteHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ IPyInstallationManager pyInstallationManager
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

private const string PortableGitDownloadUrl =
"https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.1/PortableGit-2.41.0-64-bit.7z.exe";
"https://github.com/git-for-windows/git/releases/download/v2.52.0.windows.1/PortableGit-2.52.0-64-bit.7z.exe";
private const string ExpectedGitVersion = "2.52.0";

private const string VcRedistDownloadUrl = "https://aka.ms/vs/16/release/vc_redist.x64.exe";

Expand All @@ -49,7 +50,7 @@ IPyInstallationManager pyInstallationManager
private const string PythonLibsDownloadUrl = "https://cdn.lykos.ai/python_libs_for_sage.zip";

private const string UvWindowsDownloadUrl =
"https://github.com/astral-sh/uv/releases/download/0.8.4/uv-x86_64-pc-windows-msvc.zip";
"https://github.com/astral-sh/uv/releases/download/0.9.30/uv-x86_64-pc-windows-msvc.zip";

private string HomeDir => settingsManager.LibraryDir;

Expand Down Expand Up @@ -115,7 +116,7 @@ private string GetPythonLibraryZipPath(PyVersion version) =>
private string UvExtractPath => Path.Combine(AssetsDir, "uv");
public string UvExePath => Path.Combine(UvExtractPath, "uv.exe");
public bool IsUvInstalled => File.Exists(UvExePath);
private string ExpectedUvVersion => "0.8.4";
private string ExpectedUvVersion => "0.9.30";

public string GitBinPath => Path.Combine(PortableGitInstallDir, "bin");
public bool IsVcBuildToolsInstalled => Directory.Exists(VcBuildToolsExistsPath);
Expand Down Expand Up @@ -155,6 +156,10 @@ public async Task RunGit(
{
{ "PATH", Compat.GetEnvPathWithExtensions(GitBinPath) },
{ "GIT_TERMINAL_PROMPT", "0" },
// Set UTF-8 locale to handle Unicode characters in paths
// This helps Git load libcurl-4.dll when paths contain non-ASCII characters
{ "LC_ALL", "C.UTF-8" },
{ "LANG", "C.UTF-8" },
}
);
await process.WaitForExitAsync().ConfigureAwait(false);
Expand All @@ -173,6 +178,10 @@ public Task<ProcessResult> GetGitOutput(ProcessArgs args, string? workingDirecto
environmentVariables: new Dictionary<string, string>
{
{ "PATH", Compat.GetEnvPathWithExtensions(GitBinPath) },
// Set UTF-8 locale to handle Unicode characters in paths
// This helps Git load libcurl-4.dll when paths contain non-ASCII characters
{ "LC_ALL", "C.UTF-8" },
{ "LANG", "C.UTF-8" },
}
);
}
Expand Down Expand Up @@ -605,11 +614,31 @@ public async Task InstallGitIfNecessary(IProgress<ProgressReport>? progress = nu
{
if (File.Exists(GitExePath))
{
Logger.Debug("Git already installed at {GitExePath}", GitExePath);
return;
var installedVersion = await GetInstalledGitVersionAsync();
if (installedVersion.Contains(ExpectedGitVersion))
{
Logger.Debug(
"Git {Version} already installed at {GitExePath}",
ExpectedGitVersion,
GitExePath
);
return;
}

Logger.Info(
"Git version mismatch. Installed: {Installed}, Expected: {Expected}. Upgrading...",
installedVersion.Trim(),
ExpectedGitVersion
);

// Delete existing installation to upgrade
if (Directory.Exists(PortableGitInstallDir))
{
await new DirectoryPath(PortableGitInstallDir).DeleteAsync(true);
}
}

Logger.Info("Git not found at {GitExePath}, downloading...", GitExePath);
Logger.Info("Git not found or outdated at {GitExePath}, downloading...", GitExePath);

// Download
if (!File.Exists(PortableGitDownloadPath))
Expand Down Expand Up @@ -1139,6 +1168,20 @@ private async Task<string> GetInstalledUvVersionAsync()
}
}

private async Task<string> GetInstalledGitVersionAsync()
{
try
{
var result = await GetGitOutput(["--version"]);
return result.StandardOutput ?? string.Empty;
}
catch (Exception e)
{
Logger.Warn(e, "Failed to get Git version");
return string.Empty;
}
}

private async Task<bool> EnsurePythonVersion(PyVersion pyVersion)
{
var result = await pyInstallationManager.GetInstallationAsync(pyVersion);
Expand Down
23 changes: 15 additions & 8 deletions StabilityMatrix.Avalonia/Services/InferenceClientManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -331,15 +331,22 @@ ICompletionProvider completionProvider
if (!settingsManager.IsLibraryDirSet)
return;

ResetSharedProperties();

if (IsConnected)
// Dispatch to UI thread to prevent race conditions with Avalonia's selection model.
// The ModelIndexChanged event may be raised from a background thread, and modifying
// observable collections from a non-UI thread can cause ArgumentOutOfRangeException
// when the selection model tries to enumerate selected items.
Dispatcher.UIThread.Post(() =>
{
LoadSharedPropertiesAsync()
.SafeFireAndForget(onException: ex =>
logger.LogError(ex, "Error loading shared properties")
);
}
ResetSharedProperties();

if (IsConnected)
{
LoadSharedPropertiesAsync()
.SafeFireAndForget(onException: ex =>
logger.LogError(ex, "Error loading shared properties")
);
}
});
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -321,41 +321,35 @@ private async Task RenameAsync()
[RelayCommand]
private async Task OpenSafetensorMetadataViewer()
{
if (!CheckpointFile.SafetensorMetadataParsed)
if (
!settingsManager.IsLibraryDirSet
|| new DirectoryPath(settingsManager.ModelsDirectory) is not { Exists: true } modelsDir
)
{
if (
!settingsManager.IsLibraryDirSet
|| new DirectoryPath(settingsManager.ModelsDirectory) is not { Exists: true } modelsDir
)
{
return;
}

try
{
var safetensorPath = CheckpointFile.GetFullPath(modelsDir);

var metadata = await SafetensorMetadata.ParseAsync(safetensorPath);

CheckpointFile.SafetensorMetadataParsed = true;
CheckpointFile.SafetensorMetadata = metadata;
}
catch (Exception ex)
{
logger.LogWarning(ex, "Failed to parse safetensor metadata");
return;
}
return;
}

if (!CheckpointFile.SafetensorMetadataParsed)
SafetensorMetadata? metadata;
try
{
var safetensorPath = CheckpointFile.GetFullPath(modelsDir);
metadata = await SafetensorMetadata.ParseAsync(safetensorPath);
}
catch (Exception ex)
{
logger.LogWarning(ex, "Failed to parse safetensor metadata");
notificationService.Show(
"No Metadata Found",
"This safetensor file does not contain any embedded metadata.",
NotificationType.Warning
);
return;
}

var vm = vmFactory.Get<SafetensorMetadataViewModel>(vm =>
{
vm.ModelName = CheckpointFile.DisplayModelName;
vm.Metadata = CheckpointFile.SafetensorMetadata;
vm.Metadata = metadata;
});

var dialog = vm.GetDialog();
Expand Down
Loading
Loading