From 77beece3875f58db8ba42def34909da373680ade Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Fri, 17 Jul 2026 23:34:35 +0200 Subject: [PATCH 01/15] init plugin --- web-launcher/launcher.luau | 89 +++++++++++++++++++++++++++++++ web-launcher/plugin.toml | 28 ++++++++++ web-launcher/translations/en.json | 8 +++ 3 files changed, 125 insertions(+) create mode 100644 web-launcher/launcher.luau create mode 100644 web-launcher/plugin.toml create mode 100644 web-launcher/translations/en.json diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau new file mode 100644 index 0000000..c335315 --- /dev/null +++ b/web-launcher/launcher.luau @@ -0,0 +1,89 @@ +local function loadLinks() + local raw = noctalia.getConfig("links") + local links = {} + + if type(raw) ~= "table" then + return links + end + + for _, line in ipairs(raw) do + local name, url = line:match("^([^|]+)|(.+)$") + if name and url then + table.insert(links, { + name = noctalia.string.trim(name), + url = noctalia.string.trim(url), + }) + else + noctalia.log("web-launcher: skipped malformed line (expected Name|https://url): " .. tostring(line)) + end + end + + return links +end + +local links = loadLinks() + +local function extractDomain(url) + local domain = url:match("^https?://([^/]+)") + return domain +end + +local function faviconUrl(domain) + return "https://www.google.com/s2/favicons?sz=64&domain=" .. noctalia.string.urlEncode(domain) +end + +local function faviconCachePath(domain) + local dir = noctalia.pluginDir() .. "/cache" + local safe = domain:gsub("[^%w%.%-]", "_") + local path = dir .. "/" .. safe .. ".png" + return path, dir +end + +local function downloadFavicon(domain, onDone) + local path, dir = faviconCachePath(domain) + if noctalia.fileExists(path) then + onDone(path) + return + end + + noctalia.mkdirAll(dir) + noctalia.download(faviconUrl(domain), path, function(ok) + if ok then + onDone(path) + end + end) +end + +function onQuery(query) + local text = noctalia.string.trim(query) + local results = {} + + for _, link in ipairs(links) do + local domain = extractDomain(link.url) + local iconPath = faviconCachePath(domain) + local hasIcon = noctalia.fileExists(iconPath) + + local glyphValue = hasIcon and nil or "world" + local iconValue = hasIcon and iconPath or nil + + if not hasIcon then + downloadFavicon(domain, function() end) + end + + if text == "" then + table.insert(results, { id = link.url, title = link.name, subtitle = link.url, glyph = glyphValue, icon = iconValue }) + else + local score = noctalia.fuzzyScore(text, link.name) + if score ~= nil then + table.insert(results, { id = link.url, title = link.name, subtitle = link.url, glyph = glyphValue, icon = iconValue, score = score }) + end + end + end + + launcher.setResults(query, results) +end + +function onActivate(id) + noctalia.runAsync("xdg-open '" .. id .. "'") + noctalia.notify("Websites", "Opening " .. id) +end diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml new file mode 100644 index 0000000..f791e4b --- /dev/null +++ b/web-launcher/plugin.toml @@ -0,0 +1,28 @@ +id = "yocraft/web-launcher" +name = "Web launcher" +version = "1.0.0" +plugin_api = 3 +author = "yocraft" +description = "Quickly open your favorite websites from the launcher." +tags = ["web", "bookmarks"] + +[[launcher_provider]] +id = "web-launcher" +entry = "launcher.luau" +prefix = "web" +glyph = "world" +include_in_global_search = false + +[[setting]] +key = "links" +type = "string_list" +label_key = "settings.links.label" +description_key = "settings.links.description" +default = [ + "GitHub|https://github.com", + "GitLab|https://gitlab.com", + "Codeberg|https://codeberg.org", + "Reddit|https://reddit.com", + "YouTube|https://youtube.com", + "Gmail|https://mail.google.com", +] diff --git a/web-launcher/translations/en.json b/web-launcher/translations/en.json new file mode 100644 index 0000000..66d655e --- /dev/null +++ b/web-launcher/translations/en.json @@ -0,0 +1,8 @@ +{ + "settings": { + "links": { + "label": "Links", + "description": "Format: Name|https://url" + } + } +} From 758744f9ca719501ec1330cd07aba878990e9b0f Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Fri, 17 Jul 2026 23:53:23 +0200 Subject: [PATCH 02/15] add README and thumbnail --- web-launcher/README.md | 27 +++++++++++++++++++++++++++ web-launcher/thumbnail.webp | Bin 0 -> 50488 bytes 2 files changed, 27 insertions(+) create mode 100644 web-launcher/README.md create mode 100644 web-launcher/thumbnail.webp diff --git a/web-launcher/README.md b/web-launcher/README.md new file mode 100644 index 0000000..ef95f07 --- /dev/null +++ b/web-launcher/README.md @@ -0,0 +1,27 @@ +# Web Launcher + +Quickly open your favorite websites from the launcher. Favicons are downloaded automatically! + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `yocraft/web-launcher` | +| Entries | Launcher provider: `web-launcher` | +| Launcher Prefix | `web` | + +## Requirements + +A browser. + +## Usage + +Open the Noctalia launcher and type `/web` to list all configurated websites. +Continue typing to filter by name, then activate a result to launch that website in your default browser. +You can customize the list and order of websites in settings. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `links` | `string_list` | | Websites list and order. | diff --git a/web-launcher/thumbnail.webp b/web-launcher/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..9e316252a35fd26ab8a4c218669299d9a0a002c7 GIT binary patch literal 50488 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 literal 0 HcmV?d00001 From eb8f134bfcce42b4152c234f18ee58c942348005 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:09:16 +0200 Subject: [PATCH 03/15] Add notification toggle setting --- web-launcher/launcher.luau | 4 +++- web-launcher/plugin.toml | 7 +++++++ web-launcher/translations/en.json | 14 +++++++++----- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index c335315..63c5dce 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -85,5 +85,7 @@ end function onActivate(id) noctalia.runAsync("xdg-open '" .. id .. "'") - noctalia.notify("Websites", "Opening " .. id) + if noctalia.getConfig("notify") then + noctalia.notify("Websites", "Opening " .. id) + end end diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index f791e4b..2790c49 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -26,3 +26,10 @@ default = [ "YouTube|https://youtube.com", "Gmail|https://mail.google.com", ] + +[[setting]] +key = "notify" +type = "bool" +label_key = "settings.notify.label" +description_key = "settings.notify.description" +default = true diff --git a/web-launcher/translations/en.json b/web-launcher/translations/en.json index 66d655e..a64023c 100644 --- a/web-launcher/translations/en.json +++ b/web-launcher/translations/en.json @@ -1,8 +1,12 @@ { - "settings": { - "links": { - "label": "Links", - "description": "Format: Name|https://url" + "settings": { + "links": { + "label": "Links", + "description": "Format: Name|https://url" + }, + "notify": { + "label": "Notify", + "description": "Notify when opening link." + } } - } } From 9fd76601e9b8d99d46591cabc4b5a1cc015b8c05 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:09:36 +0200 Subject: [PATCH 04/15] Update tags --- web-launcher/plugin.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index 2790c49..a4f8068 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -1,10 +1,10 @@ id = "yocraft/web-launcher" -name = "Web launcher" +name = "Web Launcher" version = "1.0.0" plugin_api = 3 author = "yocraft" description = "Quickly open your favorite websites from the launcher." -tags = ["web", "bookmarks"] +tags = ["launcher", "utility", "network", "productivity"] [[launcher_provider]] id = "web-launcher" From 273e90bc80e0fd672c6dbbb8481172bbbdeb5888 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:28:47 +0200 Subject: [PATCH 05/15] Update README: default links --- web-launcher/README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/web-launcher/README.md b/web-launcher/README.md index ef95f07..2bf55ef 100644 --- a/web-launcher/README.md +++ b/web-launcher/README.md @@ -24,4 +24,15 @@ You can customize the list and order of websites in settings. | Setting | Type | Default | Description | | --- | --- | --- | --- | -| `links` | `string_list` | | Websites list and order. | +| `links` | `string_list` | `see below` | Websites list and order. | +| `notify` | `bool` | `false` | Toggle notification when launching website. | + +Default links: +``` +"GitHub|https://github.com", +"GitLab|https://gitlab.com", +"Codeberg|https://codeberg.org", +"Reddit|https://reddit.com", +"YouTube|https://youtube.com", +"Gmail|https://mail.google.com", +``` From 3435b113222ce5b13a5359e49231694b56613ef3 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 01:50:17 +0200 Subject: [PATCH 06/15] add icon_provider setting --- web-launcher/README.md | 1 + web-launcher/launcher.luau | 16 ++++++++++++++-- web-launcher/plugin.toml | 12 ++++++++++++ web-launcher/translations/en.json | 7 +++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/web-launcher/README.md b/web-launcher/README.md index 2bf55ef..f8bd1d1 100644 --- a/web-launcher/README.md +++ b/web-launcher/README.md @@ -26,6 +26,7 @@ You can customize the list and order of websites in settings. | --- | --- | --- | --- | | `links` | `string_list` | `see below` | Websites list and order. | | `notify` | `bool` | `false` | Toggle notification when launching website. | +| `icon_provider` | `select` | `google` | Icon download source. | Default links: ``` diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index 63c5dce..7da4214 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -29,13 +29,25 @@ local function extractDomain(url) end local function faviconUrl(domain) - return "https://www.google.com/s2/favicons?sz=64&domain=" .. noctalia.string.urlEncode(domain) + local provider = noctalia.getConfig("icon_provider") + local encoded = noctalia.string.urlEncode(domain) + + if provider == "duckduckgo" then + return "https://icons.duckduckgo.com/ip3/" .. encoded .. ".ico" + elseif provider == "direct" then + return "https://" .. domain .. "/favicon.ico" + else + return "https://www.google.com/s2/favicons?sz=64&domain=" .. encoded + end end local function faviconCachePath(domain) + local provider = noctalia.getConfig("icon_provider") + local dir = noctalia.pluginDir() .. "/cache" local safe = domain:gsub("[^%w%.%-]", "_") - local path = dir .. "/" .. safe .. ".png" + + local path = dir .. "/" .. safe .. "_" .. provider .. ".png" return path, dir end diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index a4f8068..6e43d45 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -33,3 +33,15 @@ type = "bool" label_key = "settings.notify.label" description_key = "settings.notify.description" default = true + +[[setting]] +key = "icon_provider" +type = "select" +label_key = "settings.icon_provider.label" +description_key = "settings.icon_provider.description" +default = "google" +options = [ + { value = "google", label_key = "settings.icon_provider.google" }, + { value = "duckduckgo", label_key = "settings.icon_provider.duckduckgo" }, + { value = "direct", label_key = "settings.icon_provider.direct" }, +] diff --git a/web-launcher/translations/en.json b/web-launcher/translations/en.json index a64023c..486fc3f 100644 --- a/web-launcher/translations/en.json +++ b/web-launcher/translations/en.json @@ -7,6 +7,13 @@ "notify": { "label": "Notify", "description": "Notify when opening link." + }, + "icon_provider": { + "label": "Icon Provider", + "description": "Icon download source.", + "google": "Google", + "duckduckgo": "DuckDuckGo", + "direct": "Site's own favicon.ico" } } } From d9eea91d2b38d25a5d63a40cf34e43a0b42f7224 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 08:34:38 +0200 Subject: [PATCH 07/15] Fix README and plugin.toml --- web-launcher/README.md | 6 +++--- web-launcher/plugin.toml | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/web-launcher/README.md b/web-launcher/README.md index f8bd1d1..8c4db6d 100644 --- a/web-launcher/README.md +++ b/web-launcher/README.md @@ -8,11 +8,11 @@ Quickly open your favorite websites from the launcher. Favicons are downloaded a | --- | --- | | ID | `yocraft/web-launcher` | | Entries | Launcher provider: `web-launcher` | -| Launcher Prefix | `web` | +| Launcher Prefix | `/web` | ## Requirements -A browser. +A browser and `xdg-utils`. ## Usage @@ -25,7 +25,7 @@ You can customize the list and order of websites in settings. | Setting | Type | Default | Description | | --- | --- | --- | --- | | `links` | `string_list` | `see below` | Websites list and order. | -| `notify` | `bool` | `false` | Toggle notification when launching website. | +| `notify` | `bool` | `true` | Toggle notification when launching website. | | `icon_provider` | `select` | `google` | Icon download source. | Default links: diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index 6e43d45..179ccc4 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -5,6 +5,9 @@ plugin_api = 3 author = "yocraft" description = "Quickly open your favorite websites from the launcher." tags = ["launcher", "utility", "network", "productivity"] +dependencies = [ "xdg-utils" ] +licence = "MIT" +icon = "world" [[launcher_provider]] id = "web-launcher" From 7c5ed0be6a5f62ea2c007e560980817dfab55dc7 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 09:07:21 +0200 Subject: [PATCH 08/15] fix: http(s) match, shell escape, cleaner code --- web-launcher/launcher.luau | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index 7da4214..0b19c29 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -8,10 +8,10 @@ local function loadLinks() for _, line in ipairs(raw) do local name, url = line:match("^([^|]+)|(.+)$") - if name and url then + if name and url and url:match("^https?://") then table.insert(links, { name = noctalia.string.trim(name), - url = noctalia.string.trim(url), + url = noctalia.string.trim(url), }) else noctalia.log("web-launcher: skipped malformed line (expected Name|https://url): " .. tostring(line)) @@ -83,11 +83,20 @@ function onQuery(query) end if text == "" then - table.insert(results, { id = link.url, title = link.name, subtitle = link.url, glyph = glyphValue, icon = iconValue }) + table.insert(results, { + id = link.url, + title = link.name, subtitle = link.url, + glyph = glyphValue, icon = iconValue + }) else local score = noctalia.fuzzyScore(text, link.name) if score ~= nil then - table.insert(results, { id = link.url, title = link.name, subtitle = link.url, glyph = glyphValue, icon = iconValue, score = score }) + table.insert(results, { + id = link.url, + title = link.name, subtitle = link.url, + glyph = glyphValue, icon = iconValue, + score = score + }) end end end @@ -95,8 +104,12 @@ function onQuery(query) launcher.setResults(query, results) end +local function shellEscape(raw) + return "'" .. raw:gsub("'", "'\\''") .. "'" +end + function onActivate(id) - noctalia.runAsync("xdg-open '" .. id .. "'") + noctalia.runAsync("xdg-open " .. shellEscape(id)) if noctalia.getConfig("notify") then noctalia.notify("Websites", "Opening " .. id) end From 159ddd130105deabbd7553c4a37a5e382ff82a43 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 09:31:00 +0200 Subject: [PATCH 09/15] fix: check http(s) after trim --- web-launcher/launcher.luau | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index 0b19c29..88660d4 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -8,11 +8,14 @@ local function loadLinks() for _, line in ipairs(raw) do local name, url = line:match("^([^|]+)|(.+)$") - if name and url and url:match("^https?://") then - table.insert(links, { - name = noctalia.string.trim(name), - url = noctalia.string.trim(url), - }) + if name and url then + name = noctalia.string.trim(name) + url = noctalia.string.trim(url) + if url:match("^https?://") then + table.insert(links, { name = name, url = url }) + else + noctalia.log("web-launcher: skipped non-http(s) URL: " .. tostring(line)) + end else noctalia.log("web-launcher: skipped malformed line (expected Name|https://url): " .. tostring(line)) end From f53c7acca0f6147e7445b54140f1a80c8a2c2118 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 09:38:03 +0200 Subject: [PATCH 10/15] Rearrange plugin.toml to match docs --- web-launcher/plugin.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index 179ccc4..9e84541 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -3,11 +3,12 @@ name = "Web Launcher" version = "1.0.0" plugin_api = 3 author = "yocraft" +license = "MIT" +deprecated = false +icon = "world" description = "Quickly open your favorite websites from the launcher." tags = ["launcher", "utility", "network", "productivity"] dependencies = [ "xdg-utils" ] -licence = "MIT" -icon = "world" [[launcher_provider]] id = "web-launcher" From 0d73e6749b17cc51d0605deb67b121af346a2a62 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:35:02 +0200 Subject: [PATCH 11/15] Update plugin version --- web-launcher/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index 9e84541..bb4ad2e 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -1,6 +1,6 @@ id = "yocraft/web-launcher" name = "Web Launcher" -version = "1.0.0" +version = "1.2.3" plugin_api = 3 author = "yocraft" license = "MIT" From 3007c07c0c23ee5c88cd97cd06e3a47a1b13fea8 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:01:07 +0200 Subject: [PATCH 12/15] Add notification translation --- web-launcher/launcher.luau | 6 +++++- web-launcher/translations/en.json | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index 88660d4..40fcf73 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -113,7 +113,11 @@ end function onActivate(id) noctalia.runAsync("xdg-open " .. shellEscape(id)) + if noctalia.getConfig("notify") then - noctalia.notify("Websites", "Opening " .. id) + noctalia.notify( + noctalia.tr("notify.title"), + noctalia.tr("notify.message") .. " " .. id + ) end end diff --git a/web-launcher/translations/en.json b/web-launcher/translations/en.json index 486fc3f..109c415 100644 --- a/web-launcher/translations/en.json +++ b/web-launcher/translations/en.json @@ -15,5 +15,9 @@ "duckduckgo": "DuckDuckGo", "direct": "Site's own favicon.ico" } + }, + "notify": { + "title": "Websites", + "message": "Opening" } } From e9d898f99bf248c35ee0ea8ca3f91343a120abcf Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:27:36 +0200 Subject: [PATCH 13/15] fix: cleaner translation --- web-launcher/launcher.luau | 2 +- web-launcher/plugin.toml | 2 +- web-launcher/translations/en.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index 40fcf73..d3da581 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -117,7 +117,7 @@ function onActivate(id) if noctalia.getConfig("notify") then noctalia.notify( noctalia.tr("notify.title"), - noctalia.tr("notify.message") .. " " .. id + noctalia.tr("notify.message", { name = id }) ) end end diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index bb4ad2e..706ab8d 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -1,6 +1,6 @@ id = "yocraft/web-launcher" name = "Web Launcher" -version = "1.2.3" +version = "1.2.5" plugin_api = 3 author = "yocraft" license = "MIT" diff --git a/web-launcher/translations/en.json b/web-launcher/translations/en.json index 109c415..c3ce951 100644 --- a/web-launcher/translations/en.json +++ b/web-launcher/translations/en.json @@ -18,6 +18,6 @@ }, "notify": { "title": "Websites", - "message": "Opening" + "message": "Opening {name}" } } From eb8a01f5e126f5830691602b30c573d5d255798d Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:26:58 +0200 Subject: [PATCH 14/15] Change back to 1.0.0 --- web-launcher/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-launcher/plugin.toml b/web-launcher/plugin.toml index 706ab8d..9e84541 100644 --- a/web-launcher/plugin.toml +++ b/web-launcher/plugin.toml @@ -1,6 +1,6 @@ id = "yocraft/web-launcher" name = "Web Launcher" -version = "1.2.5" +version = "1.0.0" plugin_api = 3 author = "yocraft" license = "MIT" From c786561143c2688d882b69aaaa6b785a797184b9 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:47:23 +0200 Subject: [PATCH 15/15] fix: strip embedded credentials --- web-launcher/launcher.luau | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web-launcher/launcher.luau b/web-launcher/launcher.luau index d3da581..f0a0cb6 100644 --- a/web-launcher/launcher.luau +++ b/web-launcher/launcher.luau @@ -28,6 +28,9 @@ local links = loadLinks() local function extractDomain(url) local domain = url:match("^https?://([^/]+)") + if domain then + domain = domain:gsub("^.*@", "") + end return domain end