Skip to content

Added custom plugins manifest URL option for self hosting - #4585

Open
mrmetrix4 wants to merge 11 commits into
Flow-Launcher:devfrom
mrmetrix4:dev
Open

Added custom plugins manifest URL option for self hosting#4585
mrmetrix4 wants to merge 11 commits into
Flow-Launcher:devfrom
mrmetrix4:dev

Conversation

@mrmetrix4

@mrmetrix4 mrmetrix4 commented Jul 25, 2026

Copy link
Copy Markdown

As talked in a lot of issues

Fix #2178


Summary by cubic

Summary of changes
Adds a configurable custom plugins manifest URL for self-hosting and refreshes the catalog when the URL changes. Previously Flow Launcher used hard-coded mirrors only; now it accepts a user-provided URL, sanitizes URLs in logs, and refreshes the store on opening the Plugin Store page.

  • Changed: PluginsManifest.UpdateManifestAsync now requires Settings; PublicAPIInstance.UpdatePluginManifestAsync passes _settings.
  • Changed: Rebuild CommunityPluginStore only when PluginSettings.PluginsManifestUrl changes; reset lastFetchedAt to DateTime.MinValue to force a refetch; reuse the instance otherwise; default manifest URLs are consolidated locally.
  • Changed: Navigating to the Plugin Store now triggers RefreshExternalPluginsCommand so a new URL is picked up without restart; the General settings TextBox updates PluginsManifestUrl on each keystroke.
  • Added: PluginSettings.PluginsManifestUrl and XAML binding in General settings; pluginManifestUrl locale string.
  • Added: Validation for an absolute http/https URL with a non-empty host; on invalid URLs, log a warning and initialize the store with default mirrors without overwriting the saved value.
  • Added: Log sanitization via CommunityPluginSource.ManifestFileUrlForLogging to omit credentials, query, and fragments.
  • Removed: Static, hard-coded plugin store initialization.
  • Memory impact: Minimal. The store instance is reused and recreated only on URL change; old instances are GC-eligible; no new caches introduced.
  • Security risks: A custom URL may serve untrusted manifests. Logs now sanitize URLs to avoid credential leakage. Recommend using HTTPS and trusted sources.
  • Tests: Added CommunityPluginSourceTest to verify URL sanitization; manual verification for default behavior, invalid URL fallback, and refresh on navigation/URL change.

Release Note
You can now set your own plugins catalog URL; Flow Launcher refreshes the list when you open the Plugin Store and falls back to the official catalog if your URL is empty or invalid.

Written for commit 9f3ef81. Summary will update on new commits.

Review in cubic

@github-actions github-actions Bot added this to the 2.2.0 milestone Jul 25, 2026
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 311cb863-7830-40cb-a6b8-c44d5668ed0f

📥 Commits

Reviewing files that changed from the base of the PR and between ba14e05 and 6e2b8c8.

📒 Files selected for processing (1)
  • Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs

Included review availability: Your plan includes up to 10 reviews per rolling hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

PluginsSettings now stores a configurable plugin manifest URL. The General settings page exposes the URL. Manifest updates validate custom HTTP(S) URLs, reuse stores when possible, and retain default URL fallback behavior.

Changes

Plugins manifest URL configuration

Layer / File(s) Summary
Manifest URL setting and UI
Flow.Launcher.Infrastructure/Constant.cs, Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs, Flow.Launcher/Languages/en.xaml, Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
Adds a persisted manifest URL setting, localized label, and General settings text box.
Manifest store selection
Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
Updates manifest refreshes to validate the configured URL, reuse unchanged stores, and fall back to default URLs when needed.
Update API wiring
Flow.Launcher/PublicAPIInstance.cs
Passes the instance settings into plugin manifest updates.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 6e2b8

This change adds an optional custom plugins manifest URL while preserving default fallback behavior; no actionable merge-blocking risk remains.

Sequence Diagram(s)

sequenceDiagram
  participant SettingsUI
  participant PublicAPIInstance
  participant PluginsManifest
  participant PluginStores
  SettingsUI->>PublicAPIInstance: set PluginsManifestUrl
  PublicAPIInstance->>PluginsManifest: UpdateManifestAsync(_settings, ...)
  PluginsManifest->>PluginStores: construct or reuse configured or default store
  PluginsManifest->>PluginStores: fetch and update manifest
Loading

Possibly related PRs

Suggested reviewers: jack251970

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The pull request includes an unrelated BOM-only change in Flow.Launcher.Infrastructure/Constant.cs. Remove the BOM-only change from Constant.cs unless it is required for the custom manifest URL feature.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes satisfy issue #2178 by adding a user-configurable HTTP(S) manifest URL with fallback support for unofficial communities and fork testing.
Title check ✅ Passed The title clearly summarizes the main change: adding a custom plugins manifest URL option for self-hosted deployments.
Description check ✅ Passed The description directly explains the custom manifest URL, validation, fallback behavior, refresh logic, and related implementation changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs (1)

15-41: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Make manifest state source-aware and synchronize store selection.

mainPluginStore is process-wide, but Lines 24-41 overwrite it from each call’s settings before acquiring manifestUpdateLock. Concurrent callers can therefore fetch through another caller’s store. Also, UserPlugins and lastFetchedAt are not keyed by customUrl, so changing the setting within the two-minute window can leave the previous manifest in use. Keep the selected store local or initialize it under the lock, and invalidate/key the cache by URL.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs` around lines 15 - 41,
Make UpdateManifestAsync source-aware by deriving the CommunityPluginStore from
the current customUrl inside the manifestUpdateLock or keeping it local, rather
than overwriting shared mainPluginStore before synchronization. Key UserPlugins
and lastFetchedAt by the effective manifest URL, and invalidate or bypass the
cached manifest when customUrl changes so each settings source fetches and uses
its own data.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs`:
- Around line 26-37: Validate PluginsManifestUrl before constructing
mainPluginStore: when customUrl is non-empty, require it to be a supported
absolute HTTPS URL and handle invalid input without allowing the constructor to
escape UpdateManifestAsync’s error path. Alternatively, move the new
plugin-store construction into the existing guarded section, preserving the
default mainUrls behavior.

---

Outside diff comments:
In `@Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs`:
- Around line 15-41: Make UpdateManifestAsync source-aware by deriving the
CommunityPluginStore from the current customUrl inside the manifestUpdateLock or
keeping it local, rather than overwriting shared mainPluginStore before
synchronization. Key UserPlugins and lastFetchedAt by the effective manifest
URL, and invalidate or bypass the cached manifest when customUrl changes so each
settings source fetches and uses its own data.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d33357ed-31da-4f3e-8fa9-7a24de1f7e99

📥 Commits

Reviewing files that changed from the base of the PR and between 07a958d and 46122c6.

📒 Files selected for processing (6)
  • Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
  • Flow.Launcher.Infrastructure/Constant.cs
  • Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
  • Flow.Launcher/Languages/en.xaml
  • Flow.Launcher/PublicAPIInstance.cs
  • Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml

Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 6 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated
Comment thread Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml Outdated
Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated
Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated
@Jack251970 Jack251970 added the enhancement New feature or request label Aug 10, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 3 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated
Jack251970 and others added 3 commits August 17, 2026 18:05
Ensures plugin data is refreshed by setting lastFetchedAt to
DateTime.MinValue after lastCustomUrl changes, preventing
skipped fetches due to stale timestamps.
Removed resetting customUrl to empty string when an invalid custom plugin manifest URL is detected. Now, the code logs a warning and initializes mainPluginStore with default URLs, preserving the original customUrl value.
@Jack251970
Jack251970 requested a balanced review from Copilot August 17, 2026 11:05
@Jack251970

Copy link
Copy Markdown
Member

@codex Review it

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6e2b8c80f5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml Outdated
Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a configurable plugin manifest URL for self-hosted or unofficial plugin catalogs.

Changes:

  • Adds and persists a custom manifest URL setting.
  • Selects custom or official manifest sources and refreshes changed sources.
  • Exposes the setting in the General settings UI.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
SettingsPaneGeneral.xaml Adds the manifest URL input.
PublicAPIInstance.cs Passes settings during manifest updates.
en.xaml Adds the setting label.
PluginSettings.cs Persists the custom URL.
Constant.cs Contains a non-functional encoding change.
PluginsManifest.cs Selects, validates, and refreshes manifest sources.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated
Comment thread Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs Outdated
Comment thread Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml Outdated
Jack251970 and others added 5 commits August 17, 2026 21:08
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Refactored variable declarations to use var instead of explicit types for lockAcquired, defaultUrls, and customUrl. Moved customUrl initialization to after lock acquisition. Changed defaultUrls array declaration to use var and curly braces.
Now triggers RefreshExternalPluginsCommand when navigating to SettingsPanePluginStore, ensuring manifest URL changes are reflected immediately. Manifest service fetches new data only if cache is invalid or URL has changed.
The TextBox's Text property now updates the bound PluginsManifestUrl
setting immediately as the user types, instead of only on focus loss,
by setting UpdateSourceTrigger=PropertyChanged.
Added ManifestFileUrlForLogging to CommunityPluginSource, which returns a sanitized manifest URL for logging by removing credentials, query, and fragments. Updated all logging to use this property. Introduced SanitizeUrlForLogging helper method. Added CommunityPluginSourceTest to verify correct URL sanitization and ensure the original URL remains unchanged.
@Jack251970
Jack251970 requested a balanced review from Copilot August 17, 2026 13:24
@Jack251970

Copy link
Copy Markdown
Member

@codex Review it

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9f3ef81185

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +43 to +44
if (mainPluginStore == null || lastCustomUrl != customUrl)
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clear cached plugins when switching manifest sources

When the setting changes from the default or a previous custom source, this replaces mainPluginStore but leaves UserPlugins populated. If the new endpoint is unavailable, returns a non-success response, or serves an empty manifest, the fetch returns false while callers such as CheckForPluginUpdatesAsync ignore that result and continue consuming the old entries and download URLs through GetPluginManifest(). Clear or segregate the cached plugins when the source identity changes so selecting a private catalog cannot silently leave the previous catalog active.

Useful? React with 👍 / 👎.

}
else
{
PublicApi.Instance.LogWarn(ClassName, $"Invalid custom plugins manifest URL: {customUrl}. Using default URLs.");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Sanitize the invalid manifest URL warning

When the user enters a rejected URL containing credentials or a token, such as ftp://user:password@example.com/plugins.json?token=secret, this warning writes the complete value to persistent diagnostic logs. Fresh evidence in this revision is that the source-fetch log paths are now sanitized, but this validation path still interpolates the raw setting; apply the same sanitization or omit the URL from this warning.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

Suppressed comments (1)

Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs:64

  • Changing the configured source replaces the store but leaves UserPlugins from the previous source intact. If the first fetch from the new/default source fails or returns no entries, UpdateManifestAsync returns false and the view model does not notify the UI, so users can continue seeing and installing catalog entries from a source they have deselected. Cache entries must be associated with their source; clear/replace the old catalog on a source switch and notify the store UI even when the new fetch cannot populate it.
                    lastCustomUrl = customUrl;
                    lastFetchedAt = DateTime.MinValue;

}
else
{
PublicApi.Instance.LogWarn(ClassName, $"Invalid custom plugins manifest URL: {customUrl}. Using default URLs.");

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 4 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml">

<violation number="1" location="Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml:512">
P2: This binding only writes the typed URL into the settings object; nothing reacts to PluginsManifestUrl changing, so the plugin catalog is not refreshed when the user edits the URL (UpdatePluginManifestAsync is only called at startup, from the Plugin Store refresh button, and from the plugins settings pane). The user keeps seeing the stale catalog until a manual refresh or restart. Also, with UpdateSourceTrigger=PropertyChanged each keystroke commits a partial URL into the in-memory settings, which is then persisted when the settings window closes (SettingWindow.xaml.cs OnClosed calls _settings.Save()), so half-typed values can be written to disk.</violation>
</file>

<file name="Flow.Launcher.Test/CommunityPluginSourceTest.cs">

<violation number="1" location="Flow.Launcher.Test/CommunityPluginSourceTest.cs:18">
P1: This expected value will not match the implementation. `ManifestFileUrlForLogging` builds it with `UriComponents.SchemeAndServer | UriComponents.Path`, but `SchemeAndServer` (0xF) includes `UserInfo`, so `username:password@` is kept and the sanitized URL is `https://username:password@example.com:8443/private/plugins.json`. The assertion fails, and, worse, the commit's goal of protecting credentials in logs is not met. Fix `SanitizeUrlForLogging` to exclude `UserInfo` by using `UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path`, then this expected value becomes correct.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic


ClassicAssert.AreEqual(manifestUrl, source.ManifestFileUrl);
ClassicAssert.AreEqual(
"https://example.com:8443/private/plugins.json",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: This expected value will not match the implementation. ManifestFileUrlForLogging builds it with UriComponents.SchemeAndServer | UriComponents.Path, but SchemeAndServer (0xF) includes UserInfo, so username:password@ is kept and the sanitized URL is https://username:password@example.com:8443/private/plugins.json. The assertion fails, and, worse, the commit's goal of protecting credentials in logs is not met. Fix SanitizeUrlForLogging to exclude UserInfo by using UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, then this expected value becomes correct.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At Flow.Launcher.Test/CommunityPluginSourceTest.cs, line 18:

<comment>This expected value will not match the implementation. `ManifestFileUrlForLogging` builds it with `UriComponents.SchemeAndServer | UriComponents.Path`, but `SchemeAndServer` (0xF) includes `UserInfo`, so `username:password@` is kept and the sanitized URL is `https://username:password@example.com:8443/private/plugins.json`. The assertion fails, and, worse, the commit's goal of protecting credentials in logs is not met. Fix `SanitizeUrlForLogging` to exclude `UserInfo` by using `UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path`, then this expected value becomes correct.</comment>

<file context>
@@ -0,0 +1,21 @@
+
+        ClassicAssert.AreEqual(manifestUrl, source.ManifestFileUrl);
+        ClassicAssert.AreEqual(
+            "https://example.com:8443/private/plugins.json",
+            source.ManifestFileUrlForLogging);
+    }
</file context>

<TextBox
Width="370"
Height="34"
Text="{Binding Settings.PluginSettings.PluginsManifestUrl, TargetNullValue='None', UpdateSourceTrigger=PropertyChanged}" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This binding only writes the typed URL into the settings object; nothing reacts to PluginsManifestUrl changing, so the plugin catalog is not refreshed when the user edits the URL (UpdatePluginManifestAsync is only called at startup, from the Plugin Store refresh button, and from the plugins settings pane). The user keeps seeing the stale catalog until a manual refresh or restart. Also, with UpdateSourceTrigger=PropertyChanged each keystroke commits a partial URL into the in-memory settings, which is then persisted when the settings window closes (SettingWindow.xaml.cs OnClosed calls _settings.Save()), so half-typed values can be written to disk.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml, line 512:

<comment>This binding only writes the typed URL into the settings object; nothing reacts to PluginsManifestUrl changing, so the plugin catalog is not refreshed when the user edits the URL (UpdatePluginManifestAsync is only called at startup, from the Plugin Store refresh button, and from the plugins settings pane). The user keeps seeing the stale catalog until a manual refresh or restart. Also, with UpdateSourceTrigger=PropertyChanged each keystroke commits a partial URL into the in-memory settings, which is then persisted when the settings window closes (SettingWindow.xaml.cs OnClosed calls _settings.Save()), so half-typed values can be written to disk.</comment>

<file context>
@@ -509,7 +509,7 @@
                         Width="370"
                         Height="34"
-                        Text="{Binding Settings.PluginSettings.PluginsManifestUrl,TargetNullValue='None'}" />
+                        Text="{Binding Settings.PluginSettings.PluginsManifestUrl, TargetNullValue='None', UpdateSourceTrigger=PropertyChanged}" />
                 </StackPanel>
             </ui:SettingsCard>
</file context>

@Jack251970 Jack251970 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please resolve the comments from AI

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

User configurable plugins manifest URL for Plugin Store

3 participants